38

我们在 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

4

3 回答 3

25

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

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

我不知道任何情况下会给你一个 caplen > len。我通常看起来他们是平等的,因为我的 snaplen 足够高。

于 2009-09-29T16:11:30.170 回答
6

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

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

于 2013-01-02T16:22:25.790 回答
3

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

于 2013-01-05T22:21:28.483 回答