Я прервал 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.
Помимо того, что написано на странице руководства, существует еще одна причина, по которой ядро может отбрасывать пакеты. Я испытывал 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
показывают мне все пакеты, которые я ожидаю увидеть.