Dlaczego jądro miałoby upuszczać pakiety?


50

Przerwałem tcpdumpz 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?


W moim przypadku użyłem opcji -s0, zmieniając ją na -s1600 (tuż powyżej MTU) rozwiązało to dla mnie.
— LatinSuD

Odpowiedzi:


49

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:

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


1
Również celowo zmieniłem kibi- / mebi- na kilo- / mega- i pominąłem słowo o libpcap, aby nie mylić ludzi.
— Dmitrij Wasiljanow

4
Zauważ też, że obsługa „długich opcji” w tcpdump jest stosunkowo nowa; w starszych wersjach (z wyjątkiem znacznie starszych wersji, które nie obsługują ustawiania rozmiaru bufora) możesz to zrobić tcpdump -B 4096.

Kolejna uwaga: ustawienie dużych buforów zajmuje trochę czasu. Jeśli ustawisz bufory na coś szalonego, możesz przegapić pakiety (tcpdump zgłasza je jako „pakiety upuszczone przez jądro”) podczas tego czasu inicjalizacji.
— dgreene

27

Jeszcze jedną rzeczą do rozważenia / wypróbowania jest to, że tcpdumpspę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ć -nflagę (bez odnośników). na przykład:

tcpdump -n port 80

2
To był wybawiciel. Nie zdawałem sobie sprawy, że tcpdump zrobił odwrotną rozdzielczość podczas zrzutu do pliku !! Korzystanie -nn -B 4096pozwoliło mi uzyskać0 packets dropped by kernel
— Blanka,

11

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 tcpdumpnie 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 tcpdumpna -Bopcję o wielkości KiB.


2

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 tcpdumpktó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 netnspowłoce wszelkie procesy systemu operacyjnego, które wcześniej powodowały problemy, są nieobecne i tcpdumppokazują mi wszystkie pakiety, których oczekuję.


1

Przydaje mi się ta tcpdump -copcja. W ten sposób można ustawić liczbę pakietów, a następnie zatrzymać i nie można wypełnić bufora.

Na przykład ten przechwyci żądania TCP na localhost.

tcpdump -ni lo tcp -c 20
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.