Зачем ядру отбрасывать пакеты?

50

Я прервал tcpdumpс Ctrl+ Cи получил это общее резюме:

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

Что такое "пакеты, сброшенные ядром"? Почему это происходит?

rɑːdʒɑ
источник
В моем случае я использовал опцию -s0, изменив ее на -s1600 (прямо над MTU).
LatinSuD

Ответы:

50

Из руководства 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
KJH
источник
2
Это был спаситель. Не понял, что tcpdump изменил разрешение при выгрузке в файл !! Использование -nn -B 4096позволило мне получить0 packets dropped by kernel
Бланка
11

По словам man tcpdump:

пакеты, отброшенные ядром (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, в которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, то будет сообщено как 0).

Ядро помещает захваченные пакеты в буфер захвата фиксированного размера . Если tcpdumpэтот буфер не будет очищен достаточно быстро, ядро ​​начнет перезаписывать старые пакеты в буфере и, соответственно, увеличивать сброшенный счетчик. Значение этого счетчика - это то, что вы видите как «отброшено ядром».

Кстати, вы можете изменить размер буфера захвата : Передайте tcpdumpна -Bвариант с размером KiB.

Анко
источник
2

Помимо того, что написано на странице руководства, существует еще одна причина, по которой ядро ​​может отбрасывать пакеты. Я испытывал 100% -ное падение пакета, tcpdumpгде единственным трафиком в сети был один пакет PRBS 512B в секунду. Очевидно, что объяснение буферного пространства здесь не имеет смысла - я думаю, что ядро ​​может обрабатывать 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
прости
источник