Я перервала tcpdump
з Ctrl+ Cі отримав це загальне резюме:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Що таке "пакети, скинуті ядром"? Чому це відбувається?
Я перервала tcpdump
з Ctrl+ Cі отримав це загальне резюме:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Що таке "пакети, скинуті ядром"? Чому це відбувається?
Відповіді:
З посібника користувача tcpdump:
пакети `` скинуті ядром '' (це кількість пакетів, які були скинуті, через брак буферного простору, механізмом захоплення пакетів в ОС, на якій працює tcpdump, якщо ОС повідомляє цю інформацію програмам; якщо ні, то це буде повідомлено як 0).
Трохи пояснення:
В tcpdump
захоплює сирі пакети , що проходять через мережевий інтерфейс. Пакети повинні бути проаналізовані та відфільтровані відповідно до правил, визначених вами в командному рядку, і це потребує певного часу, тому вхідні пакети повинні бути завантажені (у черзі) для обробки. Іноді буває занадто багато пакетів, вони зберігаються в буфері, але вони зберігаються швидше, ніж обробляються, тому в підсумку буфера не вистачає місця, тому ядро скидає всі подальші пакети, поки в буфері не з’явиться вільний простір.
Ви можете збільшити розмір буфера за допомогою параметра -B
( --buffer-size
) таким чином:
tcpdump -B 4096 ....
Зауважте, що розмір вказано в кілобайтах, тому рядок вище встановлює розмір буфера в 4 Мб.
tcpdump -B 4096
.
Ще одне, що слід врахувати / спробувати, це те, що, tcpdump
можливо, витрачається багато часу на виконання DNS-запитів для вирішення IP-адрес доменних імен. Якщо вони вам не потрібні, спробуйте -n
вписати прапор (без пошуку). наприклад:
tcpdump -n port 80
-nn -B 4096
дозволило мені потрапити0 packets dropped by kernel
Відповідно до man tcpdump
:
пакети, скинуті ядром (це кількість пакетів, які були скинуті, через брак буферного простору, механізмом захоплення пакетів в ОС, на якій працює tcpdump, якщо ОС повідомляє цю інформацію програмам; якщо ні, то буде повідомлено як 0).
Ядро ставить захоплені пакети в буфер фіксованого розміру . Якщо tcpdump
цей буфер не випорожниться досить швидко, ядро почне перезаписувати старі пакети в буфері і відповідно збільшить лічильник, що випав . Значення цього лічильника - це те, що ви бачите як "скинуте ядро".
До речі, ви можете змінити розмір буфера захоплення : Передайте tcpdump
на -B
варіант з розміром KiB.
Окрім того, що говорить сторінка "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
показують мені всі пакети, які я очікую побачити.