PCAP结构体中的pcap_pkthdr len和caplen有什么区别?

39
我们正在使用libpcap在Linux上嗅探数据包,每个数据包的头部看起来像是:
struct pcap_pkthdr {
        struct timeval ts;      /* time stamp */
        bpf_u_int32 caplen;     /* length of portion present */
        bpf_u_int32 len;        /* length this packet (off wire) */
};
现在,我理解caplen是我们捕获的数据长度,而len是在线路上数据包的长度。在某些情况下(例如打开pcap设备时设置snaplen过低),我们可能仅捕获数据包的部分内容,那么这部分内容的长度将是'caplen',而'len'是原始长度。因此,caplen应该小于或等于len,但永远不应大于len。
这是一个正确的理解吗?我们在一些机器上看到caplen>len。

3
你应该在pcapr.net上发布触发此问题的pcap文件,这将非常有趣。就我个人而言,我从未见过这种情况。 - bortzmeyer
3个回答

26
您的理解是正确的,至少基于pcap手册来看是这样的。
caplen是在捕获中可用的数据量。len是数据包的实际长度。
我不知道是否有任何情况会使caplen>len。通常情况下它们应该相等,因为我的snaplen足够高。

7
是的,你的理解是正确的,caplen总是小于Len。有时候我们并不需要捕获整个数据包。
但是,如果在网络流量较大的情况下,捕获整个数据包并不是一个好主意。
如果我们只是想根据协议和应用程序对数据包进行分类,您仅需大约54字节的数据即可:14字节(以太网)+ 20字节(IP)+ 20字节(TCP)。这样可以通过将处理大小从pcappkthdr-> len降低到pcappkthdr-> caplen来减轻负载和时间。
至于你关于snaplen有时大于len的问题:
如果数据包中的标头已损坏(这意味着标头长度值出现了错误),则捕获长度将大于数据包的实际长度。

3
如果caplen > len,则表示存在错误;您使用的libpcap版本是什么?

我在Ubuntu 20.04上使用libpcap0.8 + usbmon时遇到了相同的问题。 - Marcelo Neves
可能是libpcap bug 808(https://github.com/the-tcpdump-group/libpcap/issues/808),该问题现已得到修复。 - user16139739

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接