pcap struct pcap_pkthdr len vs caplen

nos*_*nos 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) */
};
Run Code Online (Sandbox Code Playgroud)

现在,我的理解是caplen是我们捕获的数据的长度,而len是线路上数据包的长度.在某些情况下(例如,在打开pcap设备时将snaplen设置得太低),我们可能只捕获数据包的一部分,该长度将为'caplen',而'len'为原始长度.因此,caplen应该等于或小于len,但绝不会大于len.

这是正确的理解吗?我们在某些机器上看到了caplen> len

Jas*_*son 19

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

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

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


小智 5

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

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