我的应用程序在以太网接口上滥用数据包(使用已编译的数据包过滤器)并且我想知道是否有任何数据包被丢弃而没有进入我的应用程序缓冲区。
pcap_stats的联机帮助页面含糊不清,可能(或可能不会)解释该函数。
那么如何确定我的内核,发行版和libpcap的特定组合是否支持丢弃数据包检测?
统计信息在所有平台上的行为都不一样。 ps_recv 可能会计算数据包是否通过任何过滤器集 是否为pcap_setfilter(3PCAP),或者它可能只计算通过的数据包 过滤器。它也可能会或可能不会计算丢弃的数据包因为 当他们到达时,操作系统的缓冲区中没有空间。 ps_drop并非在所有平台上都可用;它在平台上为零 它不可用的地方。如果在libpcap中完成包过滤, 而不是在操作系统中,它会计算不包含的数据包 通过过滤器。 ps_recv和 ps_drop都可能计数,也可能不计数 尚未从操作系统中读取的数据包,因此尚未见到 通过申请。 ps_ifdrop可能会或可能不会实施;如果 它是零,这可能意味着没有丢弃数据包 接口,或者它可能意味着统计数据不可用,所以它 不应被视为接口没有掉落的迹象 任何数据包。
$ uname -a
Linux dvstorblackXS 3.10.80-1.el6.elrepo.i686 #1 SMP Sun Jun 7 08:15:14 EDT 2015 i686 i686 i386 GNU/Linux
$ ldd *myApplicationBinary*
libpcap.so.1 => /usr/local/lib/libpcap.so.1 (0xb76e2000)
$ ls -l /usr/local/lib/libpcap.*
-rw-r--r-- 1 root root 774522 Mar 5 2016 /usr/local/lib/libpcap.a
lrwxrwxrwx 1 root root 12 Mar 5 2016 /usr/local/lib/libpcap.so -> libpcap.so.1
lrwxrwxrwx 1 root root 16 Mar 5 2016 /usr/local/lib/libpcap.so.1 -> libpcap.so.1.6.2
-rwxr-xr-x 1 root root 572307 Mar 5 2016 /usr/local/lib/libpcap.so.1.6.2
$ cat /etc/redhat-release
CentOS release 6.6 (Final)
答案 0 :(得分:1)
根据comments on the libpcap source:
Reports the number of dropped packets iff the kernel supports
the PACKET_STATISTICS "getsockopt()" argument (2.4 and later
kernels, and 2.2[.x] kernels with Alexey Kuznetzov's turbopacket
patches); otherwise, that information isn't available, and we lie
and report 0 as the count of dropped packets.
这似乎是ps_drop
报告:
"ps_drop" counts packets dropped because we ran
out of buffer space. It doesn't count packets
dropped by the interface driver. It counts only
packets that passed the filter.
任何内核版本似乎都支持 ps_ifdrop
。它报道:
It will return the number
of drops the interface reports in /proc/net/dev,
if that is available.
因此,您可以通过ps_drop + ps_ifdrop
获取环境中丢弃的数据包数量。