pcap struct pcap_pkthdr len vs caplen

我们在linux上使用libpcap嗅探数据包我们在每个数据包上获得的头文如下所示:

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

您的理解是正确的,至少基于pcap手册页。

caplen是捕获中可用的数据量。 len是数据包的实际长度。

我不知道任何会给你一个caplen> len的案例。 我通常认为它们是相同的,因为我的snaplen足够高。

是的,你的理解是正确的,Caplen总是比Len少。 有时我们不需要捕获整个数据包。 但是为什么你不能抓住整个数据包呢? 因为在繁重的网络流量中,这不是一个好主意。 如果我们不捕获线上出现的整个数据包,我们是否真的丢失了宝贵的数据? 实际上,这取决于你的目的,如果你只想根据协议及其预定的应用程序对数据包进行分类,你只需要大约14个字节(以太网)加上20个字节(Ip)+加上另外20个(Tcp)因此,您显然只需要54个字节的数据来根据协议对数据包进行分类,因此在减少处理大小时节省了大量的负载和时间,从pcappkthdr-> len到pcappkthdr-> caplen 🙂

如果数据包中的标头已损坏(意味着如果标头长度值以某种方式混乱),则捕获的长度将大于数据包的实际长度。

如果caplen> len,那就是一个bug; 您使用的是什么版本的libpcap?