内核空间中捕获数据包的缓冲区大小?

内核空间中捕获数据包的缓冲区大小?

浏览 的手册页tcpdump,如果缓冲区已满,内核似乎可以丢弃数据包。我想知道是否:

  1. 该大小是可配置的和/或
  2. 我在哪里可以看到我的发行版的大小?

从手册页(为了方便参考):

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

答案1

Tcpdump 可以选择-B设置捕获缓冲区大小。然后该值通过该函数传递给 libpcap(tcpdump 用于执行实际数据包捕获的库)  pcap_set_buffer_size()。  tcpdump(1)(tcpdump 的手册页)说捕获缓冲区大小以 KiB(1024 字节)为单位指定;这 来源似乎证实了这一点。

pcap_set_buffer_size(3pcap)(pcap_set_buffer_size 的手册页)没有指定默认缓冲区大小(如果未调用此函数则使用默认缓冲区大小),但同样,来自libpcap 源代码,这似乎是 2 MiB,至少在 Linux 上是这样(但很可能取决于系统)。

关于数据包缓冲和丢弃,还应注意-s适当设置 snaplen( ) 参数。从tcpdump(1):

-s snaplen
--snapshot-length=snaplen

    斯纳尔夫斯纳普伦每个数据包的数据字节数,而不是默认的 65535 1 个字节。由于快照有限而被截断的数据包在输出中用“[ ]”指示,其中|protoproto是发生截断的协议级别的名称。

     

    请注意,拍摄较大的快照不仅会增加处理数据包所需的时间,而且会有效地减少数据包缓冲量。这可能会导致数据包丢失。
               ︙
            ...你应该限制斯纳普伦到将捕获您感兴趣的协议信息的最小数字。设置斯纳普伦to 0 将其设置为默认值 65535 1,以便向后兼容最近的旧版本tcpdump.

    ________________
    1 最新版本的手册页显示为 262144 而不是 65535(两个地方)。

这意味着,在固定缓冲区大小的情况下,您可以通过减少缓冲区大小来增加适合缓冲区的数据包数量(因此不会被丢弃) snaplen尺寸。

相关内容