我们在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 :)
如果数据包中的标头已损坏(意味着如果标头长度值以某种方式混乱),则捕获的长度将大于数据包的实际长度.