为什么内核会丢包?

为什么内核会丢包?

tcpdumpCtrl+打断C并得到了这个总摘要:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

什么是“内核丢弃的数据包”?为什么会发生这种情况?

答案1

tcpdump(1)(tcpdump 的手册页):

“由内核丢弃”的数据包(这是由于缺少缓冲区空间,正在tcpdump运行的操作系统中的数据包捕获机制丢弃的数据包数量,如果操作系统向应用程序报告该信息;如果否,将报告为 0)。

一点解释:

tcpdump 程序捕获通过网络接口的原始数据包。必须根据您在命令行中指定的规则来解析和过滤数据包,这需要一些时间,因此必须缓冲(排队)传入数据包以进行处理。有时数据包太多,因此将它们保存到缓冲区中。但它们的保存速度比处理速度快,因此最终缓冲区会耗尽空间,因此内核会丢弃所有其他数据包,直到缓冲区中有一些可用空间。

-B您可以使用( ) 选项增加缓冲区大小,--buffer-size如下所示:

tcpdump -B 4096 ....

或者

tcpdump --buffer-size=4096 ...

请注意,大小以 kibibytes 为单位指定,因此上面的行将缓冲区大小设置为 4 MiB。

答案2

另一件需要考虑/尝试的事情是,tcpdump可能会花费大量时间进行 DNS 查询以将 IP 解析为域名。如果您不需要这些,请尝试添加-n(无查找)标志。例如:

tcpdump -n port 80

答案3

根据man tcpdump

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

内核将捕获的数据包放入固定大小的捕获缓冲区。如果tcpdump没有足够快地清空该缓冲区,内核将开始覆盖缓冲区中的旧数据包并相应地增加掉落柜台。该计数器的值就是您所看到的“被内核删除”。

顺便说一下,你可以调整捕获缓冲区的大小:以 KiB 大小传递选项tcpdump-B

答案4

我发现使用该tcpdump -c选项很有用。这样你可以设置数据包的数量然后停止并且不能填满缓冲区。

例如,这个将捕获本地主机上的 tcp 请求。

tcpdump -ni lo tcp -c 20

相关内容