pcap struct pcap pkthdr len vs caplen

мы нюхаем пакеты с помощью libpcap в linux Заголовок, который мы получаем на каждом пакете, выглядит так:

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-это длина данных, которые мы захватили, пока лен-это длина пакета на проводе. В некоторых случаях (например, при установке snaplen слишком низко при открытии устройства pcap) мы можем захватить только части пакета, эта длина будет "caplen", а " len " - исходная длина. Таким образом, caplen должен быть равен или меньше чем лен, но не больше Лена.

Это правильное понимание ? Мы видим caplen > len на некоторых машинах

3 ответов


ваше понимание правильно, по крайней мере, на основе справочной страницы pcap.

caplen-это объем данных, доступных вам в захвате. лен был фактической длиной пакета.

Я не знаю ни одного случая, который дал бы вам caplen > len. Я обычно кажусь им равными, поскольку мой snaplen достаточно высок.


Да, ваше понимание правильно Caplen всегда меньше, чем Len . Иногда нам не нужно захватывать весь пакет . Но почему бы вам не захватить весь пакет, если у вас есть шанс ? Потому что в условиях интенсивного сетевого трафика это было бы не очень хорошей идеей . Разве мы не теряем драгоценные данные, если не захватим весь пакет, который появляется на проводе ? Нет. На самом деле это зависит от вашей цели, если вы просто хотите классифицировать пакеты на основе протоколов и приложения, которое оно предназначено К , U просто нужно около 14 байт( локальные сети ) плюс 20 байт ( ИС ) + плюс еще 20 ( ПТС), таким образом, вам видимо нужен только 54 байт данных для классификации пакетов на основе протоколов , так много нагрузки и время экономится на уменьшение размера обрабатываемых с pcappkthdr->лен pcappkthdr->caplen :)

Если заголовки в пакетах повреждены ( это означает, что если значения headerlength каким-то образом перепутались), то захваченная длина будет больше фактической длины пакет.


Если caplen > len, это ошибка; какую версию libpcap вы используете?