操作系统:Ubuntu 16.04
我使用 Scapy 数据包创建工具创建了一些数据包。数据包的目标地址是我的本地主机(即)127.0.0.1
while(True):
packet = IP(src='127.0.1.1',dst="127.0.0.1")/TCP(dport=80)/"from scapy packet"
send(packet)
print "tcp sent"
现在,当我在我的机器上运行 tcpdump 并在一段时间后停止时,捕获的数据包仅为过滤器收到的数据包数量的一半,但没有任何数据包被丢弃。这是 tcpdump 的输出:
sudo tcpdump -i any dst 127.0.0.1
OUTPUT:
119 packets captured
238 packets received by filter
0 packets dropped by kernel
即使我运行
tcpdump -i lo
,我也会遇到同样的问题。使用 tshark 代替 tcpdump 也显示捕获的相同数量的数据包。
为什么会出现这种情况?是因为 tcpdump 缓冲区大小太小吗?我怎样才能捕获其余的数据包?
来自 tcpdump 手册页:
当 tcpdump 完成捕获数据包时,它将报告以下计数:
捕获的数据包(这是 tcpdump 捕获的数据包数量) 已收到并已处理);
过滤器收到的数据包(含义 这取决于您运行 tcpdump 的操作系统,并且 可能是在配置操作系统的方式上 - 如果指定了过滤器 在命令行上,在某些操作系统上,它会对数据包进行计数,而不管 它们是否与过滤器表达式匹配,即使它们 与过滤器表达式匹配,无论是否 tcpdump 已读取并处理它们,在其他操作系统上仅计算数据包 与过滤器表达式匹配,无论是否 tcpdump 已经读取并处理了它们,并且在其他操作系统上它也很重要 仅与过滤器表达式匹配的数据包 由 tcpdump 处理);
数据包“被内核丢弃”(这是 由于缺少缓冲区空间而被丢弃的数据包数量 运行 tcpdump 的操作系统中的数据包捕获机制,如果 操作系统向应用程序报告该信息;如果没有,就会是 报告为 0)。
http://www.tcpdump.org/tcpdump_man.html
因此,我猜想,在您的情况下,捕获了 238 个数据包,其中 119 个数据包通过了过滤器(以 localhost 作为目的地)。这是因为数据包被捕获两次(离开和到达同一接口)并且 tcpdump 会删除这些重复项。如果您尝试 ping 到 127.0.0.1,也会发生同样的情况。