pcap struct pcap_pkthdr len vs caplen

时间:2009-09-29 10:09:29

标签: c pcap

我们在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在某些机器上

3 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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