В моем случае я использовал опцию -s0, изменив ее на -s1600 (прямо над MTU).
LatinSuD
Ответы:
50
Из руководства tcpdump:
пакеты, «отброшенные ядром» (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, в которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, будет сообщено как 0).
Немного объяснения:
В tcpdumpзахватывает сырые пакеты , проходящие через сетевой интерфейс. Пакеты должны быть проанализированы и отфильтрованы в соответствии с правилами, указанными вами в командной строке, и это занимает некоторое время, поэтому входящие пакеты должны быть помещены в буфер (помещены в очередь) для обработки. Иногда пакетов слишком много, они сохраняются в буфере, но они сохраняются быстрее, чем обрабатываются, поэтому в конечном итоге в буфере заканчивается свободное пространство, поэтому ядро отбрасывает все последующие пакеты, пока в буфере не будет свободного места.
Вы можете увеличить размер буфера с помощью опции -B( --buffer-size) следующим образом:
tcpdump -B 4096 ....
Обратите внимание, что размер указан в килобайтах, поэтому в приведенной выше строке размер буфера равен 4 МБ.
Также я намеренно изменил kibi- / mebi- на kilo- / mega- и пропустил слово о libpcap, чтобы не путать людей.
Дмитрий Василянов
4
Также обратите внимание, что поддержка «длинных опций» в tcpdump является относительно новой; в старых версиях (за исключением гораздо более старых версий, которые не поддерживают настройку размера буфера) вы можете это сделать tcpdump -B 4096.
Еще одно замечание: для установки больших буферов требуется время. Если вы установите буферы на что-то сумасшедшее, вы можете пропустить пакеты (tcpdump сообщает о них как «пакеты, сброшенные ядром») в течение этого времени инициализации.
dgreene
27
Еще одна вещь, которую следует рассмотреть / попробовать, - это то, что вы tcpdumpможете тратить много времени на выполнение DNS-запросов для разрешения IP-адресов в доменных именах. Если вам это не нужно, попробуйте -nдобавить флаг (без поиска). например:
Это был спаситель. Не понял, что tcpdump изменил разрешение при выгрузке в файл !! Использование -nn -B 4096позволило мне получить0 packets dropped by kernel
Бланка
11
По словам man tcpdump:
пакеты, отброшенные ядром (это количество пакетов, которые были отброшены из-за недостатка места в буфере механизмом захвата пакетов в ОС, в которой работает tcpdump, если ОС сообщает эту информацию приложениям; если нет, то будет сообщено как 0).
Ядро помещает захваченные пакеты в буфер захвата фиксированного размера . Если tcpdumpэтот буфер не будет очищен достаточно быстро, ядро начнет перезаписывать старые пакеты в буфере и, соответственно, увеличивать сброшенный счетчик. Значение этого счетчика - это то, что вы видите как «отброшено ядром».
Помимо того, что написано на странице руководства, существует еще одна причина, по которой ядро может отбрасывать пакеты. Я испытывал 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показывают мне все пакеты, которые я ожидаю увидеть.
Я считаю полезным использование этой tcpdump -cопции. Таким образом, вы можете установить количество пакетов, а затем остановиться, и вы не можете заполнить буфер.
Ответы:
Из руководства tcpdump:
Немного объяснения:
В
tcpdump
захватывает сырые пакеты , проходящие через сетевой интерфейс. Пакеты должны быть проанализированы и отфильтрованы в соответствии с правилами, указанными вами в командной строке, и это занимает некоторое время, поэтому входящие пакеты должны быть помещены в буфер (помещены в очередь) для обработки. Иногда пакетов слишком много, они сохраняются в буфере, но они сохраняются быстрее, чем обрабатываются, поэтому в конечном итоге в буфере заканчивается свободное пространство, поэтому ядро отбрасывает все последующие пакеты, пока в буфере не будет свободного места.Вы можете увеличить размер буфера с помощью опции
-B
(--buffer-size
) следующим образом:Обратите внимание, что размер указан в килобайтах, поэтому в приведенной выше строке размер буфера равен 4 МБ.
источник
tcpdump -B 4096
.Еще одна вещь, которую следует рассмотреть / попробовать, - это то, что вы
tcpdump
можете тратить много времени на выполнение DNS-запросов для разрешения IP-адресов в доменных именах. Если вам это не нужно, попробуйте-n
добавить флаг (без поиска). например:источник
-nn -B 4096
позволило мне получить0 packets dropped by kernel
По словам
man tcpdump
:Ядро помещает захваченные пакеты в буфер захвата фиксированного размера . Если
tcpdump
этот буфер не будет очищен достаточно быстро, ядро начнет перезаписывать старые пакеты в буфере и, соответственно, увеличивать сброшенный счетчик. Значение этого счетчика - это то, что вы видите как «отброшено ядром».Кстати, вы можете изменить размер буфера захвата : Передайте
tcpdump
на-B
вариант с размером KiB.источник
Помимо того, что написано на странице руководства, существует еще одна причина, по которой ядро может отбрасывать пакеты. Я испытывал 100% -ное падение пакета,
tcpdump
где единственным трафиком в сети был один пакет PRBS 512B в секунду. Очевидно, что объяснение буферного пространства здесь не имеет смысла - я думаю, что ядро может обрабатывать 0,5 кБ / с.Что-то, что пришло вместе с моим дистрибутивом (Ubuntu 14.04), возможно, выполняло какую-то интеллектуальную фильтрацию на канальном уровне, которой не нравились мои тестовые пакеты. Мой обходной путь состоял в том, чтобы создать новое пространство имен сети следующим образом:
Во внутренней
netns
оболочке все процессы ОС, которые раньше вызывали проблемы, не видны иtcpdump
показывают мне все пакеты, которые я ожидаю увидеть.источник
Я считаю полезным использование этой
tcpdump -c
опции. Таким образом, вы можете установить количество пакетов, а затем остановиться, и вы не можете заполнить буфер.Например, этот захватит tcp-запросы на localhost.
источник