Несоответствие длины пакета при использовании libpcap

Я перехватываю пакеты, используя libpcap. Я рассчитываю размер полезной нагрузки, как указано здесь size_payload = ntohs(ip->ip_len) - (size_ip + size_tcp);
Теперь для пакета size_payload 1228, заголовок Ethernet составляет 14 байтов, IP-заголовок IP - 20 байтов, Заголовок TCP составляет 32 байта. В то время как header.caplen и header.len составляют 1514 байт. Разве size_payload+size_ip+size_tcp+size_ethernet не должно быть равно header.caplen? Кроме того, когда я выгружаю те же пакеты с помощью tcpdump, длина захвата отображается как 1514. Почему они отличаются? Я ожидал, что ntohs(ip->ip_len) будет равно header.caplen и header.len

ИЗМЕНИТЬ
Я ожидал, что ntohs(ip->ip_len) будет равно header.caplen и header.len. Но я нахожу ntohs(ip->ip_len) = 1280 и header.caplen = header.len = 1514


person Abhishek Chanda    schedule 28.09.2012    source источник
comment
На какой ОС вы делаете захват? И что вы имеете в виду под «Кроме того, когда я выгружаю одни и те же пакеты с помощью tcpdump, длина захвата отображается как 1514». Вы говорите, что это отличается, но если вы говорите, что header.caplen в вашей программе равно 1514, а tcpdump показывает длину захвата как 1514, это звучит так, как будто они сообщают об одном и том же.   -  person    schedule 30.09.2012


Ответы (1)


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

Если caplen >= len вы знаете, что вам должно быть доступно все содержимое пакета. В противном случае захват пакета был усечен.

person Alnitak    schedule 28.09.2012
comment
В этом случае caplen и len равны (оба 1514 байт). У меня есть большой SNAPLEN. Но ip_len составляет 1280 байт. - person Abhishek Chanda; 28.09.2012