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

Ale*_*iro 14 ip tcpdump

我们有一个脚本调用

tcpdump -v src host <IP address> and port <port number> >>out.txt 2>>err.txt -w capture.cap
Run Code Online (Sandbox Code Playgroud)

在多个 IP 上,而脚本的其他部分在后台启动一些流量。我们想要检查数据包是否返回给我们,并仅在我们收到数据包时手动检查那些情况。tcpdump 的错误输出起初似乎很好,但是。

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

如果我们想过滤没有收到回复数据包的情况,我需要知道要查找什么。

sr_*_*sr_ 12

我希望这能对这个问题有所了解。从联机帮助页

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

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

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

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

还有一个 2009 年的邮件列表条目解释:

“过滤器接收到的数据包”编号是ps_recv呼叫的编号pcap_stats();使用BPF,这是bs_recv来自BIOCGSTATS ioctl. 该计数包括传递给 BPF 的所有数据包;这些数据包可能仍位于尚未被 libpcap 读取的缓冲区中(因此未交给 tcpdump),或者可能位于已被 libpcap 读取但尚未交给 tcpdump 的缓冲区中,因此它可以计算未报告为“已捕获”。

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

由于您的问题似乎非常专业,您也可以libpcap直接使用通过数百种语言绑定之一使用

对于你的问题,因为你得到的只是文件中捕获的capture.cap,你可以看看它不是空的运行并检查这些,即,嗯,计算行数?

tcpdump -r capture.cap | wc -l
Run Code Online (Sandbox Code Playgroud)

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