Чому ядро ​​скидає пакети?


50

Я перервала tcpdumpз Ctrl+ Cі отримав це загальне резюме:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

Що таке "пакети, скинуті ядром"? Чому це відбувається?


У моєму випадку я використовував варіант -s0, змінивши його на -s1600 (праворуч над MTU), це вирішило для мене.
LatinSuD

Відповіді:


49

З посібника користувача tcpdump:

пакети `` скинуті ядром '' (це кількість пакетів, які були скинуті, через брак буферного простору, механізмом захоплення пакетів в ОС, на якій працює tcpdump, якщо ОС повідомляє цю інформацію програмам; якщо ні, то це буде повідомлено як 0).

Трохи пояснення:

В tcpdumpзахоплює сирі пакети , що проходять через мережевий інтерфейс. Пакети повинні бути проаналізовані та відфільтровані відповідно до правил, визначених вами в командному рядку, і це потребує певного часу, тому вхідні пакети повинні бути завантажені (у черзі) для обробки. Іноді буває занадто багато пакетів, вони зберігаються в буфері, але вони зберігаються швидше, ніж обробляються, тому в підсумку буфера не вистачає місця, тому ядро ​​скидає всі подальші пакети, поки в буфері не з’явиться вільний простір.

Ви можете збільшити розмір буфера за допомогою параметра -B( --buffer-size) таким чином:

tcpdump -B 4096 ....

Зауважте, що розмір вказано в кілобайтах, тому рядок вище встановлює розмір буфера в 4 Мб.


1
Також я навмисно змінив kibi- / mebi- на kilo- / mega- і пропустив слово про libpcap, щоб не бентежити людей.
Дмитро Василянов

4
Зауважте також, що підтримка "довгих варіантів" в tcpdump є відносно новою; у старих версіях (за винятком набагато старих версій, які не підтримують встановлення розміру буфера), що можна зробити tcpdump -B 4096.

Ще одна примітка: для налаштування великих буферів потрібен час. Якщо ви встановите буфери на щось божевільне, ви можете пропустити пакети (tcpdump повідомляє їх як "пакети, скинуті ядром") протягом цього часу ініціалізації.
dgreene

27

Ще одне, що слід врахувати / спробувати, це те, що, tcpdumpможливо, витрачається багато часу на виконання DNS-запитів для вирішення IP-адрес доменних імен. Якщо вони вам не потрібні, спробуйте -nвписати прапор (без пошуку). наприклад:

tcpdump -n port 80

2
Це був рятівник. Не зрозумів, що tcpdump зробив зворотну роздільну здатність під час завантаження у файл !! Використання -nn -B 4096дозволило мені потрапити0 packets dropped by kernel
Бланка

11

Відповідно до man tcpdump:

пакети, скинуті ядром (це кількість пакетів, які були скинуті, через брак буферного простору, механізмом захоплення пакетів в ОС, на якій працює tcpdump, якщо ОС повідомляє цю інформацію програмам; якщо ні, то буде повідомлено як 0).

Ядро ставить захоплені пакети в буфер фіксованого розміру . Якщо tcpdumpцей буфер не випорожниться досить швидко, ядро ​​почне перезаписувати старі пакети в буфері і відповідно збільшить лічильник, що випав . Значення цього лічильника - це те, що ви бачите як "скинуте ядро".

До речі, ви можете змінити розмір буфера захоплення : Передайте tcpdumpна -Bваріант з розміром KiB.


2

Окрім того, що говорить сторінка "man", з'являється якась додаткова причина, чому ядро ​​може скидати пакети. Я відчував падіння пакетів на 100%, tcpdumpзвідки єдиним трафіком в мережі був один пакет 512B PRBS в секунду. Зрозуміло, що пояснення простору буфера тут не має сенсу - я думаю, ядро ​​може обробляти 0,5кіБ / с.

Щось, що поєднується з моїм дистрибутивом (Ubuntu 14.04), можливо, робило якусь розумну фільтрацію на посилальному шарі, що не сподобалось моїм тестовим пакетам. Моїм вирішенням було створити новий простір мережевих імен таким чином:

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

У внутрішній netnsоболонці будь-які процеси ОС, які викликали проблеми раніше, не відображаються і tcpdumpпоказують мені всі пакети, які я очікую побачити.


1

Я вважаю корисним використання tcpdump -cопції. Таким чином ви можете встановити кількість пакетів, а потім зупинитись і не можете заповнити буфер.

Наприклад, цей захопить tcp запити на localhost.

tcpdump -ni lo tcp -c 20
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.