Przerwałem tcpdump
z Ctrl+ Ci otrzymałem to podsumowanie:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Jakie są „pakiety upuszczane przez jądro”? Dlaczego tak się dzieje?
Przerwałem tcpdump
z Ctrl+ Ci otrzymałem to podsumowanie:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Jakie są „pakiety upuszczane przez jądro”? Dlaczego tak się dzieje?
Odpowiedzi:
Z podręcznika tcpdump:
pakiety `` upuszczane przez jądro '' (jest to liczba pakietów, które zostały upuszczone z powodu braku miejsca w buforze przez mechanizm przechwytywania pakietów w systemie operacyjnym, na którym działa tcpdump, jeśli system operacyjny zgłasza te informacje aplikacjom; jeśli nie, zostanie zgłoszony jako 0).
Trochę wyjaśnienia:
tcpdump
Przechwytuje surowe pakiety przechodzące przez interfejs sieciowy. Pakiety muszą być parsowane i filtrowane zgodnie z regułami określonymi przez Ciebie w wierszu poleceń, a to zajmuje trochę czasu, więc przychodzące pakiety muszą być buforowane (kolejkowane) do przetworzenia. Czasami jest zbyt wiele pakietów, są one zapisywane w buforze, ale są zapisywane szybciej niż przetworzone, więc w końcu w buforze zabraknie miejsca, więc jądro zrzuca wszystkie dalsze pakiety, aż w buforze będzie trochę wolnego miejsca.
Możesz zwiększyć rozmiar bufora za pomocą opcji -B
( --buffer-size
) w następujący sposób:
tcpdump -B 4096 ....
Zauważ, że rozmiar jest określony w kilobajtach, więc powyższa linia ustawia rozmiar bufora na 4 MB.
tcpdump -B 4096
.
Jeszcze jedną rzeczą do rozważenia / wypróbowania jest to, że tcpdump
spędzanie dużo czasu na robieniu zapytań DNS w celu rozstrzygnięcia adresów IP na nazwy domen. Jeśli ich nie potrzebujesz, spróbuj wrzucić -n
flagę (bez odnośników). na przykład:
tcpdump -n port 80
-nn -B 4096
pozwoliło mi uzyskać0 packets dropped by kernel
Według man tcpdump
:
pakiety zrzucane przez jądro (jest to liczba pakietów, które zostały odrzucone z powodu braku miejsca w buforze przez mechanizm przechwytywania pakietów w systemie operacyjnym, na którym działa tcpdump, jeśli system operacyjny zgłasza te informacje aplikacjom; jeśli nie, to jest to będą zgłaszane jako 0).
Jądro umieszcza przechwycone pakiety w buforze przechwytywania o stałym rozmiarze . Jeśli tcpdump
nie opróżni tego bufora wystarczająco szybko, jądro rozpocznie nadpisywanie starych pakietów w buforze i odpowiednio zwiększy upuszczony licznik. Wartością tego licznika jest to, co widzisz jako „upuszczone przez jądro”.
Nawiasem mówiąc, można zmienić rozmiar bufora przechwytywania : Hasło tcpdump
na -B
opcję o wielkości KiB.
Poza tym, co mówi strona podręcznika, wydaje się, że istnieje dodatkowy powód, dla którego pakiety mogą być upuszczane przez jądro. Doświadczyłem 100% spadku pakietów, z tcpdump
którego jedynym ruchem w sieci był jeden pakiet PRB 512B na sekundę. Oczywiście wyjaśnienie przestrzeni buforowej nie ma tutaj sensu - myślę, że jądro może obsłużyć 0,5 kB / s.
Coś, co pojawiło się wraz z moją dystrybucją (Ubuntu 14.04), mogło być czymś w rodzaju inteligentnego filtrowania w warstwie linków, które nie podobały mi się moje pakiety testowe. Moim obejściem było utworzenie nowej sieciowej przestrzeni nazw w następujący sposób:
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
W wewnętrznej netns
powłoce wszelkie procesy systemu operacyjnego, które wcześniej powodowały problemy, są nieobecne i tcpdump
pokazują mi wszystkie pakiety, których oczekuję.