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


16

通过的手册页tcpdump,看来如果缓冲区已满,内核可以丢弃数据包。我想知道是否:

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

在手册页中(为便于参考):

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

Answers:


27

Tcpdump可以选择-B设置捕获缓冲区的大小。然后将该值通过函数传递给libpcap(tcpdump使用的库来进行实际的数据包捕获)pcap_set_buffer_size()。Tcpdump联机帮助页没有指定使用-B指定缓冲区大小的单位,但是从源头看,它似乎是KiB。

的手册页pcap_set_buffer_size()未指定默认缓冲区大小(如果未调用此函数,则使用默认缓冲区大小),但是从libpcap来源来看,这至少是2 MiB,至少在linux上(但最有可能取决于系统)。

关于数据包缓冲和丢弃,还应注意相应地设置snaplen(-s)参数。man tcpdump

-s     Snarf  snaplen bytes of data from each packet rather than the
default of 65535 bytes.  Packets truncated because of a limited snapshot
are indicated in the output with ``[|proto]'', where proto is the name of
the protocol level at which the truncation has occurred. Note that  taking
larger  snapshots both increases the amount of time it  takes  to
process packets and, effectively, decreases the amount of packet buffering.
This may cause packets to be lost. You should limit snaplen to the
smallest number that will capture the protocol information you're
interested in. Setting snaplen to 0 sets it to the default of 65535, for
back-wards compatibility with recent older versions of tcpdump.

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


2
我知道这是一个旧线程(我喜欢这个答案),但是当您引用GitHub上的源代码时,请指向当前提交(因为master分支可以更改),例如:github.com/mcr/tcpdump/blob/ ……
bruno nery12年

@brunonery这对于Stack Exchange网站来说不是问题,我们实际上鼓励用户改善答案,即使帖子本身已经很旧了。(与皱眉的论坛不同。)
LéoLam 2015年

修复了过时的链接
Eli Heady'1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.