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