tcpdump:“捕获的数据包”与“过滤器收到的数据包”


11

我们有一个脚本

tcpdump -v src host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap

在多个IP上运行,而脚本的其他部分在后台启动一些流量。我们要检查数据包是否返回给我们,并仅在收到包裹时手动检查那些情况。首先,tcpdump的错误输出对此似乎还不错。

正如主题所暗示的,问题是“捕获的数据包”和“过滤器接收的数据包”之间有什么区别?有些捕获没有记录任何数据包,而是输出“捕获了0个数据包,过滤器接收了2个数据包”,这听起来像是一个矛盾,因为如果没有捕获任何数据包,那么其中的2个如何被过滤?最初,我们一直在寻找“过滤器接收到0个数据包”,但是当没有接收到数据包时,它始终不会写入错误输出。那么这些数字显示了什么?

如果要过滤未收到回复数据包的情况,我需要知道要查找的内容。

Answers:


12

我希望这可以阐明这个问题。从联机帮助页

当tcpdump完成捕获数据包时,它将报告以下计数:

捕获的数据包(这是tcpdump已接收和处理的数据包数量);

过滤器接收到的数据包(其含义取决于您运行tcpdump的操作系统,并且可能取决于操作系统的配置方式-如果在命令行上指定了过滤器,则在某些操作系统上,它将对数据包进行计数,而不管是否它们与过滤器表达式匹配,即使它们与过滤器表达式匹配,无论tcpdump是否已读取和处理它们,在其他OS上,无论tcpdump是否已读取,它仅计算与过滤器表达式匹配的数据包并对其进行处理,在其他操作系统上,它仅计算与过滤器表达式匹配并由tcpdump处理的数据包);

内核丢弃的数据包(如果操作系统向应用程序报告该信息,这是运行tcpdump的操作系统中的数据包捕获机制由于缺少缓冲区空间而丢弃的数据包的数量;否则,它是将报告为0)。

还有2009年的邮件列表条目,说明:

“过滤器收到的数据包”编号是ps_recv从调用的编号pcap_stats();使用BPF时,这是的bs_recv数字BIOCGSTATS ioctl。该计数包括所有交给BPF的数据包;这些数据包可能仍在尚未被libpcap读取的缓冲区中(因此没有传递给tcpdump),或者可能在libpcap所读取但尚未传递给tcpdump的缓冲区中,因此它可以对那些没有报告为“被俘”。

也许进程杀死得太快了?还有一个-c N标志告诉tcpdump N在捕获数据包时退出。

因为你的问题似乎很专业,你也可以使用libpcap直接通过数以百计的语言绑定之一

对于您的问题,由于您所获得的只是文件中捕获的软件包,因此capture.cap您可以仅查看不为空的运行并检查这些运行,即,计算行数吗?

tcpdump -r capture.cap | wc -l

使用libpcap返回捕获文件中的条目数可能是更好的方法...


1
另外,如果数据包处理速度很慢,则有可能在内核看到数据包之前将其丢弃在NIC硬件中。
Craig 2012年

@Craig:运行此脚本的框已虚拟化,所以我不知道NIC的速度。
亚历克斯·比罗

@sr_:行的好主意,太简单了:)我想我们不必使用-w开关,而只需将输出重定向到文件并计算行号即可。将尽快检查。
Alex Biro 2012年

@ tuareg85:分析捕获的数据包-w非常棒。您可以例如使用Wireshark。
sr_

1
尽快终止进程可能不是问题,因为我们在停止流量后等待3秒钟,我认为这已经足够了。此外tcpdump的有时间来完成错误输出过了,包下降内核总是0
亚历克斯·比罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.