2009-09-29 6 views
21

Мы нюхать пакеты с помощью Libpcap на Linux заголовке мы получаем каждый пакет выглядит следующим образом:PCAP структура pcap_pkthdr Len против Caplen

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

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

+3

Вы должны разместить pcap, который вызывает эту проблему на pcapr.net, было бы довольно интересно. Человек, я этого никогда не видел. – bortzmeyer

ответ

13

Ваше понимание верное, по крайней мере, на основе страницы man pcap.

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

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

4

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

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

2

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