Answers:
从tcpdump的手册中:
``被内核丢弃的数据包''(这是由于tcpdump运行所在的OS中的操作系统中的数据包捕获机制由于缺少缓冲区空间而丢弃的数据包的数量;如果OS向应用程序报告了该信息;如果不是,它将报告为0)。
一点解释:
所述tcpdump
捕获穿过网络接口原始数据包。必须根据您在命令行中指定的规则来解析和过滤数据包,这需要一些时间,因此必须对传入的数据包进行缓冲(排队)以进行处理。有时,有太多的数据包,它们被保存到缓冲区中,但是它们的保存速度比处理的要快,因此缓冲区最终会耗尽空间,因此内核会丢弃所有其他数据包,直到缓冲区中有可用空间为止。
您可以使用-B
(--buffer-size
)选项来增加缓冲区大小,如下所示:
tcpdump -B 4096 ....
请注意,大小以千字节为单位指定,因此上面的行将缓冲区大小设置为4MB。
除了手册页上所说的内容外,似乎还有其他原因可能导致内核丢弃数据包。我遇到了100%的数据包丢失tcpdump
,网络上唯一的流量是每秒512B的PRBS数据包。显然,这里的缓冲区空间解释没有意义-我认为内核可以处理0.5kiB / s。
我的发行版(Ubuntu 14.04)附带的某些内容可能是在链路层上进行了一些不喜欢我的测试数据包的智能筛选。我的解决方法是创建一个新的网络名称空间,如下所示:
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
在内部netns
外壳中,以前导致问题的所有OS进程都无法tcpdump
显示,并向我显示了我希望看到的所有数据包。