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.