为什么内核会丢包?

rɑː*_*dʒɑ 54 kernel tcpdump

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

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Run Code Online (Sandbox Code Playgroud)

什么是“内核丢弃的数据包”?为什么会这样?

Dmi*_*try 54

来自 tcpdump 的手册:

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

一点解释:

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

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

tcpdump -B 4096 ....
Run Code Online (Sandbox Code Playgroud)

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

  • 另请注意,tcpdump 中对“长选项”的支持相对较新;在旧版本中(除了不支持设置缓冲区大小的更旧版本),您可以执行`tcpdump -B 4096`。 (4认同)
  • 此外,我故意将 kibi-/mebi- 更改为kilo-/mega- 并省略了有关 libpcap 的一个字,以免混淆。 (2认同)

小智 30

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

tcpdump -n port 80
Run Code Online (Sandbox Code Playgroud)

  • 这是一个救世主。没有意识到 tcpdump 在转储到文件时做了反向解析!!使用 `-nn -B 4096` 允许我得到 `0 个被内核丢弃的数据包` (4认同)

Ank*_*nko 12

根据man tcpdump

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

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

顺便说一句,你可以调整捕获缓冲区:通过tcpdump-B与昆明植物大小选项。