用于PCAP实时捕获的最佳SNAPLEN

ziu*_*ziu 7 c snapshot live mtu pcap

pcap_open_live用于从界面嗅探时,我已经看到很多使用各种数字作为SNAPLEN值的例子,范围从BUFSIZ(<stdio.h>)到"魔术数字".

将SNAPLEN设置为我们捕获的接口的MTU是不是更有意义?通过这种方式,我们可以在PCAP缓冲区中同时容纳更多数据包.假设MRU等于MTU是否安全?

否则,是否有一种非常规的方式来设置SNAPLEN值?

谢谢

小智 6

MTU是可以传递给链路层的最大有效载荷大小; 它不包括任何链路层报头,因此,例如,在以太网上它将是1500,而不是1514或1518,并且不会大到足以捕获全尺寸的以太网数据包.

此外,它不包括任何元数据标头,例如802.11无线电信息的radiotap标头.

而如果适配器做任何形式的分裂/分段/重组和卸载,数据包交给适配器或收到适配器可能尚未被分割或分割,或可能已被重新组装,并且,正因为如此,可能是很多大比MTU.

至于在PCAP缓冲区中安装更多数据包,这仅适用于Linux中具有固定大小数据包插槽的内存映射TPACKET_V1和TPACKET_V2捕获机制; 其他捕获机制不为每个数据包保留最大大小的插槽,因此较短的快照长度无关紧要.对于TPACKET_V1和TPACKET_V2,较小的快照长度可能会有所不同,但至少对于以太网,libpcap 1.2.1尽可能地尝试为以太网选择合适的缓冲区大小.(TPACKET_V3似乎没有固定大小的每个数据包插槽,在这种情况下它不会出现这个问题,但它最近才出现在官方发布的内核中,并且在libpcap中还没有支持它.)

  • *如果*您正在使用具有现代版本的libpcap的Linux,并且该版本不是1.2.1或更高版本,或者您没有在以太网上捕获(或者通过分段/分段/重组卸载在以太网上捕获),*和*你不想分配一个巨大的共享内存缓冲区(使用`pcap_create()`/`pcap_set_buffer_size()`/`pcap_activate()`),并且想要避免丢包,你必须猜测传递给libpcap的数据包的可能最大大小. (2认同)