2016-10-05 2 views
0

Я использую tcpdump для захвата сетевых пакетов и запугивания при запуске удаления пакетов. Я запускал приложение, которое быстро обменивает пакеты по сети; что приводит к высокой пропускной способности сети.Как устранить упавшие пакеты tcpdump?

>> tcpdump -i eno1 -s 64 -B 919400 
126716 packets captured 
2821976 packets received by filter 
167770 packets dropped by kernel 

Поскольку меня интересует только связанная с протоколом часть из пакета TCP; Я хочу собирать пакеты TCP без данных/полезной нагрузки. Я надеюсь, что эта стратегия также может помочь в захвате большего количества пакетов перед удалением пакетов. Похоже, что я могу увеличить размер буфера (-B аргумент) до определенного предела. Даже с более высоким пределом я удаляю больше пакетов, чем захваченных.

вы можете мне помочь понять выше сообщения и вопросы у меня есть

  1. какие пакеты захватили?
  2. Что такое пакеты, полученные фильтром?
  3. Что такое пакеты, сброшенные ядром?
  4. как я могу захватить все пакеты с высокой пропускной способностью, не отбрасывая какие-либо пакеты. Мое тестовое приложение работает в течение 3 минут и обменивается пакетами с очень высокой скоростью. Меня интересует только информация, связанная с протоколом, а не при отправке фактических данных/полезной нагрузки.

ответ

1

От Guy Harris сами:

«пакеты Захваченных» номер является номером, который увеличивается каждый раз, когда ТСРйитр видит пакет, поэтому он рассчитывает пакеты, которые ТСРйитр считывает из Libpcap и, таким образом, что Libpcap считываемых из BPF и поставки в tcpdump.

Число «пакетов, полученных по фильтру», является номером «ps_recv» из вызова pcap_stats(); с BPF, это номер bs_recv из BIOCGSTATS ioctl. Этот счет включает все пакеты, которые были переданы БНФ; эти пакеты все еще могут находиться в буфере, который еще не был прочитан libpcap (и, следовательно, не передан tcpdump), или может быть в буфере, который был прочитан libpcap, но еще не передан tcpdump, поэтому он может считать пакеты, которые не сообщаются как «захваченные».

И от tcpdump man page:

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

Чтобы попытаться улучшить производительность захвата, вот несколько вещей, чтобы попробовать:

  • Не захватывать в беспорядочном режиме, если не нужно. Это сократит объем трафика, который должен обработать ядро. Сделайте это, используя опцию -p.
  • Поскольку вас интересует только трафик TCP, примените выражение захвата, которое ограничивает трафик только TCP. Сделайте это, добавив "tcp" к вашей команде.
  • Попробуйте записать пакеты в файл (или файлы для ограничения размера), а не отображать пакеты на экран. Сделайте это с помощью опции -w file или просмотрите параметры -C file_size и -G rotate_seconds, если вы хотите ограничить размер файлов.
  • Вы можете попытаться улучшить приоритет планирования tcpdump через nice.

С Performance вики страницы Wireshark в:

  • остановки другие программы, работающие на этой машине, чтобы удалить системную нагрузку
  • купить большую, быструю машину :)
  • увеличить размер буфера (который вы уже делаете)
  • установить длинную длину (которую вы уже делаете)
  • записывать файлы захвата на RAM-диск

Пробуйте использовать PF_RING.

Вы также можете попробовать использовать dumpcap вместо tcpdump, хотя я был бы удивлен, если бы производительность была существенно иной.

Вы можете попытаться выполнить захват с помощью внешнего выделенного устройства с использованием порта TAP или Switch + SPAN. Смотрите wiki-страницу Wireshark's Ethernet Capture Setup для идей.

Другая перспективная возможность: Capturing Packets in Linux at a Speed of Millions of Packets per Second without Using Third Party Libraries.

См. Также Шаркфест Эндрю Брауна '14 Maximizing Packet Capture Performance документ для еще большего количества идей.

Удачи вам!

+0

Большое спасибо !!!! –

Смежные вопросы