为什么tcpdump只捕获过滤器接收的一半数据包?

时间:2017-07-23 13:24:49

标签: ubuntu networking scapy tcpdump libpcap

操作系统: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缓冲区大小?我如何捕获其余的数据包?

1 个答案:

答案 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,也会发生同样的情况。