操作系统:Ubuntu 16.04
我使用Scapy数据包创建工具创建了一些数据包。数据包的目标地址是我的localhost(即)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缓冲区大小?我如何捕获其余的数据包?
答案 0 :(得分:0)
从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,也会发生同样的情况。