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.
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
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