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


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.