2011-02-23 9 views
11

Hipotetyczny scenariusz: Strumień pakietu udp dociera do komputera X, na którym uruchomione są dwa programy - jeden, który nasłuchuje pakietów z recv(), a drugi działa z pcap.Jak działa buforowanie w trybie PCX?

W tym przypadku, jak rozumiem, pakiety są przechowywane w interfejsie do momentu odpytywania przez kernal, który następnie przenosi je do bufora w pamięci kernala i kopiuje pakiety do kolejnych dwóch buforów - jeden bufor do słuchania programu z recv i jeden bufor do słuchania programu z pcap. Pakiety są usuwane z odpowiedniego bufora, gdy są odczytywane - albo przez pcap_next() lub recv(), przy następnym uruchomieniu harmonogramu procesu (zakładam, że w tym przypadku są blokowane). Czy to jest poprawne? Czy są używane naprawdę 4 bufory, czy jest to obsługiwane w inny sposób?

Poszukuję opisu, tak szczegółowo, jak to możliwe, w jaki sposób bufory są naprawdę zaangażowane w tym przypadku, oraz w jaki sposób pakiety przesuwają się z jednego na drugie (np. Czy pakiet zostaje skopiowany do bufora pcaps przed jego uruchomieniem do bufora recv, after lub undefined?).

Wiem, że wydaje się to dużym pytaniem, ale jedyne, na czym mi zależy, to miejsce przechowywania pakietu i czas jego przechowywania. Punkty kulkowe są w porządku. Idealnie chciałbym uzyskać ogólną odpowiedź, ale jeśli zależy mi na systemie operacyjnym, najbardziej interesuje mnie Linux.

Odpowiedz

8

przypadku Linux (BSD prawdopodobnie w pewnym stopniu podobne, stosując mbuf S zamiast skbuff s):

system używa skbuffs (bufor gniazda) do bufora danych sieciowych. Skbuff ma metadane dotyczące niektórych danych sieciowych i niektórych wskaźników do tych danych.

Krany (użytkownicy pcap) tworzą klony skąpców. Klon to nowy skoczek, ale wskazuje na te same dane. Kiedy ktoś potrzebuje zmodyfikować dane udostępnione przez kilka skinsów (oryginalny skbuff i jego klony), najpierw musi utworzyć świeżą kopię (copy-on-write).

Gdy ktoś już nie potrzebuje skoku, jest to kfree_skb(). kfree_skb() zmniejsza liczbę odwołań, a gdy liczba odwołań osiągnie zero, skbuff zostaje zwolniony. Jest nieco bardziej skomplikowany rachunek klonów, ale taki jest ogólny pomysł.

+0

Mówisz więc, że funkcja recv() używa bufora jądra, ale każda instancja pcap ma własną kopię bufora? Na jakim etapie są tworzone te klony - po odebraniu pakietu? kiedy pcap chce to przeczytać? – Benubird

+0

Każda instancja pcap ma własną kopię metadanych, ale wszystkie one mają te same dane. Klony są tworzone po odebraniu pakietu (w 'skb_deliver()' IIRC). – ninjalj

Powiązane problemy