2010-07-08 31 views
10

Mam program czytający Java, który czyta z gniazda multicast na 64-bitowej platformie Linux (2.6.18). Rozmiar gniazda został ustawiony na 2 MB. Gdy czytnik nie może odczytać wystarczająco szybko, gniazdo "przepełnia się", to jest pakiety są usuwane z bufora.W jaki sposób przepełnienie bufora gniazda Linux?

Chciałbym wiedzieć, w jaki sposób jądro Linuksa usuwa pakiety z bufora gniazda. Zakładam, że sam bufor gniazda jest buforem FIFO. Jeśli jednak jest pełny, co się dzieje? Czy następny pakiet zostanie odrzucony (a zawartość bufora się nie zmieni)? Czy nowy pakiet zastąpi stary pakiet w buforze? Jeśli tak, który pakiet (najstarszy ?, najmłodszy ?, losowo wybrany pakiet?)?

Dzięki za wszelki wgląd.

Odpowiedz

8

Gdy bufor jest pełny, pakiety przychodzące są odrzucane. Pakiety znajdujące się już w buforze nie są modyfikowane ani zastępowane.

+0

Dziękuję. Czy masz link/źródło, które popiera to oświadczenie? – AtomicJake

+0

@AtomicJake: jest to standardowa praktyka projektowania sieci. Lub: co jeszcze może zrobić OS? IIRC, gdy bufor gniazda jest pełny Stos TCP ustawia rozmiar okna na 0. Wszystkie przychodzące pakiety w tym stanie będą po prostu uważane za nieprawidłowe (nie pasujące do okna), a zatem odrzucane. Przeczytaj dokument RFC793 i znajdź "okno odbioru". – Dummy00001

+0

Masz rację dla TCP, ale szczególnie prosiłem o gniazdo odczytu multiemisji UDP. O ile mi wiadomo, każdy przychodzący pakiet z sieci jest kopiowany w niezależnym buforze gniazd (jeden bufor na czytnik). Gniazdo jest zatem opróżniane przez każdego czytnika w innym tempie. W systemie Linux, gdy bufor jest pełny, czy nowy pakiet jest po prostu odrzucany - czy (jak w buforze pierścieniowym) zastępuje najstarszy wpis? Zakładam, że obie implementacje są legalne. – AtomicJake

2

Tylko dodatek do odpowiedzi JS Bangs.

To nie jest jedyne miejsce w stosie sieci, w którym można upuścić pakiety. Bufor odbioru w gniazdach znajduje się wysoko w hierarchii i jest specyficzny dla gniazda użytkownika. Kolejnym miejscem bliżej sprzętu (przynajmniej w Linuksie) jest kolejka między sterownikiem urządzenia a softirq (patrz netif_rx()). Te spadki przyczynią się do powstania kolumny RX-DRP w wyjściu netstat -i.

+0

Dzięki. Ustaliłem z "sar", że rzeczywiście tracę pakiety w buforze gniazda, który jest odczytywany przez aplikację. Widzę liczniki po upuszczeniu pakietów z powodu zbyt wolnego odczytu aplikacji. – AtomicJake

Powiązane problemy