2015-03-26 1 views
1

У меня есть приложение захвата пакетов, которое выполняет захват пакетов с помощью pcap_loop(), но я вижу потерю пакетов.потеря пакетов при использовании pcap_loop

Я пытаюсь отправить 20 DNS-запросов на главный компьютер. Запуск tcpdump на машине показывает, что я получил 20 запросов DNS-запросов и 20 DNS-запросов. Но приложение для захвата пакетов получает 20 запросов, но получает только 11 пакетов resposne. Любая идея, почему в pcap_loop отсутствуют некоторые пакеты ответов?

Я наткнулся на эту ссылку ниже, в которой говорится: ссылка: Asynchronous libpcap: losing packets? ** "Это может быть случай, когда вы посылаете слишком много запросов слишком быстро, а сервер посылает ответ быстрее, чем вы можете справиться Таким образом, их переполнения буфера сети в ОС и отбрасывание пакетов.

Даже если вы видите пакеты в ТСРйитр, они по-прежнему может быть отброшен ОС, если ваше приложение не может работать со скоростью они принимаются в. "**

Может ли это быть причиной потери моего пакета? если да, как я могу справиться с таким случаем, потому что я не могу добавить задержку, чтобы отправить ответ позже, потому что будут затронуты другие приложения, запущенные на моем хосте.

я использую следующую PCAP рутинной конфигурацию для моего пакета приложения captue в следующем порядке:

  1. pcap_lookupnet ((символ *) Dev, & сети, & маски, errbuf)
  2. pcap_open_live ((символ *) Dev, 65535, 0, 1000, errbuf)
  3. pcap_compile (ПК, & прог (символ *) filterexpr, 0, нетто)
  4. pcap_setfilter (ПК, & прог)
  5. pcap_compile (pc, & prog, (char *) filterexpr, 0, net)
  6. pcap_loop (pc, -1, handle_packet, NULL);

Примечание: filterexp ехр порт UDP 53

если я посылаю около 10 DNS запросов, то я получаю все запросы и resposne packets.I увидеть эту проблему только тогда, когда мы имеем больше пакетов. Любые указатели были бы полезны.

Спасибо. ******

$ tcpdump udp -i eth1 -n 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 
10:05:27.066801 IP 10.36.0.96.45267 > 10.35.103.6.domain: 1+ A? Baaaaaaaaaaaaaaaaaa.t2oovm3zgkx9xp05gvn0y2.com. (64) 
10:05:27.066828 IP 10.36.0.96.45267 > 10.35.103.6.domain: 2+ A? aaaaaaaaaaaaaaaaab.ad2rn4fqq7uc0tlsqz4ygm.net. (63) 
10:05:27.066831 IP 10.36.0.96.45267 > 10.35.103.6.domain: 3+ A? aaaaaaaaaaaaaaaaac.aawabh0usmsle87qtdg8br.edu. (63) 
10:05:27.066837 IP 10.36.0.96.45267 > 10.35.103.6.domain: 4+ A? aaaaaaaaaaaaaaaaad.vrgztlp1fatm1hipf315r9.jp. (62) 
10:05:27.066842 IP 10.36.0.96.45267 > 10.35.103.6.domain: 5+ A? aaaaaaaaaaaaaaaaae.xr3au4o2plet984siue2wr.xxx. (63) 
10:05:27.066845 IP 10.36.0.96.45267 > 10.35.103.6.domain: 6+ A? aaaaaaaaaaaaaaaaaf.gvcx9lia6hlah8ay4wheps.com. (63) 
10:05:27.066848 IP 10.36.0.96.45267 > 10.35.103.6.domain: 7+ A? aaaaaaaaaaaaaaaaag.jhiu5ebw9bmbnq0reufe9z.net. (63) 
10:05:27.066851 IP 10.36.0.96.45267 > 10.35.103.6.domain: 8+ A? aaaaaaaaaaaaaaaaah.a325vjl3v1gkw9sf8mjgna.edu. (63) 
10:05:27.066853 IP 10.36.0.96.45267 > 10.35.103.6.domain: 9+ A? aaaaaaaaaaaaaaaaab.ad2rn4fqq7uc0tlsqz4ygm.net. (63) 
10:05:27.066857 IP 10.36.0.96.45267 > 10.35.103.6.domain: 10+ A? aaaaaaaaaaaaaaaaac.aawabh0usmsle87qtdg8br.edu. (63) 
10:05:27.066860 IP 10.36.0.96.45267 > 10.35.103.6.domain: 11+ A? aaaaaaaaaaaaaaaaad.vrgztlp1fatm1hipf315r9.jp. (62) 
10:05:27.066882 IP 10.36.0.96.45267 > 10.35.103.6.domain: 12+ A? aaaaaaaaaaaaaaaaae.xr3au4o2plet984siue2wr.xxx. (63) 
10:05:27.066886 IP 10.36.0.96.45267 > 10.35.103.6.domain: 13+ A? aaaaaaaaaaaaaaaaaf.gvcx9lia6hlah8ay4wheps.com. (63) 
10:05:27.066888 IP 10.36.0.96.45267 > 10.35.103.6.domain: 14+ A? aaaaaaaaaaaaaaaaag.jhiu5ebw9bmbnq0reufe9z.net. (63) 
10:05:27.066892 IP 10.36.0.96.45267 > 10.35.103.6.domain: 15+ A? aaaaaaaaaaaaaaaaah.a325vjl3v1gkw9sf8mjgna.edu. (63) 
10:05:27.066935 IP 10.36.0.96.45267 > 10.35.103.6.domain: 16+ A? aaaaaaaaaaaaaaaaai.f5t6kc1ijgnd655fauwk6e.jp. (62) 
10:05:27.066940 IP 10.36.0.96.45267 > 10.35.103.6.domain: 17+ A? aaaaaaaaaaaaaaaaai.f5t6kc1ijgnd655fauwk6e.jp. (62) 
10:05:27.066944 IP 10.36.0.96.45267 > 10.35.103.6.domain: 18+ A? aaaaaaaaaaaaaaaaai.f5t6kc1ijgnd655fauwk6e.jp. (62) 
10:05:27.066946 IP 10.36.0.96.45267 > 10.35.103.6.domain: 19+ A? aaaaaaaaaaaaaaaaai.f5t6kc1ijgnd655fauwk6e.jp. (62) 
10:05:27.066983 IP 10.36.0.96.45267 > 10.35.103.6.domain: 20+ A? aaaaaaaaaaaaaaaaaj.iaoq8srst9fud1uvgv72iw.xxx. (63) 
10:05:27.067239 IP 10.35.103.6.domain > 10.36.0.96.45267: 1 1/0/0 A 158.143.55.1 (80) 
10:05:27.067252 IP 10.35.103.6.domain > 10.36.0.96.45267: 3 1/0/0 A 169.143.55.1 (79) 
10:05:27.067288 IP 10.35.103.6.domain > 10.36.0.96.45267: 2 1/0/0 A 164.143.55.1 (79) 
10:05:27.067300 IP 10.35.103.6.domain > 10.36.0.96.45267: 4 1/0/0 A 159.143.55.1 (78) 
10:05:27.067335 IP 10.35.103.6.domain > 10.36.0.96.45267: 7 1/0/0 A 167.143.55.1 (79) 
10:05:27.067343 IP 10.35.103.6.domain > 10.36.0.96.45267: 5 1/0/0 A 165.143.55.1 (79) 
10:05:27.067345 IP 10.35.103.6.domain > 10.36.0.96.45267: 6 1/0/0 A 177.143.55.1 (79) 
10:05:27.067375 IP 10.35.103.6.domain > 10.36.0.96.45267: 10 1/0/0 A 169.143.55.1 (79) 
10:05:27.067383 IP 10.35.103.6.domain > 10.36.0.96.45267: 8 1/0/0 A 168.143.55.1 (79) 
10:05:27.067412 IP 10.35.103.6.domain > 10.36.0.96.45267: 12 1/0/0 A 165.143.55.1 (79) 
10:05:27.067421 IP 10.35.103.6.domain > 10.36.0.96.45267: 13 1/0/0 A 177.143.55.1 (79) 
10:05:27.067448 IP 10.35.103.6.domain > 10.36.0.96.45267: 14 1/0/0 A 167.143.55.1 (79) 
10:05:27.067455 IP 10.35.103.6.domain > 10.36.0.96.45267: 9 1/0/0 A 164.143.55.1 (79) 
10:05:27.067470 IP 10.35.103.6.domain > 10.36.0.96.45267: 11 1/0/0 A 159.143.55.1 (78) 
10:05:27.067485 IP 10.35.103.6.domain > 10.36.0.96.45267: 17 1/0/0 A 176.143.55.1 (78) 
10:05:27.067495 IP 10.35.103.6.domain > 10.36.0.96.45267: 18 1/0/0 A 176.143.55.1 (78) 
10:05:27.067502 IP 10.35.103.6.domain > 10.36.0.96.45267: 16 1/0/0 A 176.143.55.1 (78) 
10:05:27.067532 IP 10.35.103.6.domain > 10.36.0.96.45267: 15 1/0/0 A 168.143.55.1 (79) 
10:05:27.067539 IP 10.35.103.6.domain > 10.36.0.96.45267: 19 1/0/0 A 176.143.55.1 (78) 
10:05:27.067618 IP 10.35.103.6.domain > 10.36.0.96.45267: 20 1/0/0 A 171.143.55.1 (79) 
10:05:34.642563 IP 42.0.1.41.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from 00:30:48:9e:a3:bb, length 300 
+0

Какую версию какой ОС вы делаете (если это не Windows, запустите 'uname -sr', чтобы получить информацию о версии), и какую версию libpcap/WinPcap вы используете? –

+0

Привет, моя версия ОС и libcap версия: -bash-4,0 # uname -sr Linux 2.6.32.8 Баш-4.0 # LDCONFIG -p | grep pcap \t libpcap.so.1 (libc6, x86-64) => /usr/lib64/libpcap.so.1 -bash-4.0 # – Pam

+0

Это просто говорит, что «общая библиотека libpcap - это версия 1»; несколько разных версий libpcap имеют одну и ту же версию (потому что есть двоичная совместимость вверх). Что делает 'tcpdump -h' печатать? –

ответ

0

ОК, они оба используют Libpcap 1.1.1.

К сожалению, это означает, что «буфер ОС» всегда будет представлять собой набор слотов с одним пакетом, размер которых будет равен длине моментальной копии, используемой при открытии устройства захвата. Он по умолчанию имеет значение 2 МБ, поэтому с длиной моментального снимка 65535 это 32 буфера, поэтому, если ваша программа не обрабатывает пакеты достаточно быстро, 40 пакетов могут переполнять буфер. 20 + 11 = 31, так что похоже, что это может произойти.

Tcpdump также использует длину снимка 65535; , если он делает меньше работы в своем обратном вызове pcap_loop(), чем ваша программа делает в своем обратном вызове, и , если не получает блокировку печати на стандартный вывод больше, чем ваша программа делает, делая любой ввод/вывод на пакет , он может быть в состоянии идти в ногу.

Попробуйте использовать, например, 2048 как длину снимка, а не 65535. Вы не будете получать пакеты TCP, поэтому вам не придется беспокоиться о разгрузке сегментации TCP, заставляя вашу программу получать очень большие пакеты, и вы, вероятно, захватываете сеть, длина которой ограничена максимальным размером пакета Ethernet (1514 байт, если не используются «большие рамки»), поэтому этого должно быть достаточно. Это уменьшит размер слотов с одним пакетом и, таким образом, увеличит количество этих слотов.

Это не означает, что ваша программа не отстает, поэтому, если она будет работать в течение значительного периода времени, вы должны убедиться, что она может обрабатывать пакеты со средней скоростью, с которой они поступать - буферизация в ОС обрабатывает всплески, где для короткий период времени пакеты поступают быстрее, чем они могут быть использованы, но где программа может догнать в течение «более медленного» периода.

Более поздние версии Libpcap (1.2 и позже) попытка, , если они могут, чтобы уменьшить размер слотов буфера один пакет до максимального размера пакета («, если они могут» означает, что он может 't всегда определяет максимальный размер пакета, он работает только на Ethernet, а затем только при отключении различных форм разгрузки сегментации TCP/десементации).

До Linux 3.2, в котором введен TPACKET_V3 (у которого нет таких раздражающих одноплатных слотов с фиксированной длиной одной строки), сокеты Linux PF_PACKET (который является встроенным механизмом, предлагаемым Linux для захвата пакетов) не поддерживали пакетный захват очень хорошо, и даже у TPACKET_V3 есть некоторые досадные удары, которые не фиксируются до 3.19.

+0

благодарит за подробную информацию. что помогло, я изменил snap_len на 2048, и теперь я вижу больше пакетов. Я могу видеть все/большинство пакетов, если я отправлю 20, 100, 500. Однако, если моя программа получает около 100 тыс. DNS-пакетов, я вижу падение количества. Как вы упомянули выше, это может быть связано с тем, что моя программа не обрабатывает пакеты, поступающие с огромным счетом, со средней скоростью. – Pam

+0

В следующем заявлении мое приложение должно убедиться, что оно считывает все пакеты с регулярным интервалом из буфера ОС? «Это, конечно, не заставит вашу программу отставать, поэтому, если она будет работать в течение значительного периода времени, вы должны убедиться, что она может обрабатывать пакеты со средней скоростью, по которой они поступают, буферизация в ОС обрабатывает всплески, где в течение короткого периода времени пакеты поступают быстрее, чем их можно потреблять, но где программа может догнать в течение «более медленного» периода ». – Pam

+0

Ваша программа должна удостовериться, что для работы каждого пакета это занимает в среднем не больше времени, чем средний интервал между обработанными пакетами. Если вы не можете сделать это, вам понадобится более быстрый компьютер. –