2013-11-10 3 views
1

Я читал через libpcap tutorial и использовал некоторые захваты, которые я хочу проанализировать (я сам их не создал), поэтому я использую автономный режим.Определить слой пакета в файле pcap, созданном tcpdump

При применении учебника ничего похожего не совпало. Я не получил действительных MAC-адресов из рамки ethernet, и даже преамбула, казалось, была правильной. После некоторого истечения срока я выстрелил в провода и заметил что-то странное. Каждый пакет начинается с 6: это не пакеты на уровне ethernet (канал передачи данных), они уже один уровень на уровне IP (сети) (это IPv6-пакеты, которые ожидаются).

Конечно, теперь я могу легко продолжить, но мне все еще интересно: как узнать, на каком слое находятся захваченные пакеты? Кажется, есть по крайней мере два варианта: сохранение на уровне канала передачи данных и сохранение на сетевом уровне. Может также быть, что я получаю пакеты на транспортном уровне? Как я различаю? Должен ли пользователь сказать мне? Мне бы очень не хотелось угадывать, но, видя, как wirehark правильно это понимает, должен быть простой способ ее определить.

ответ

2

Формат файла libpcap имеет поле в своем global header called network, которое указывает тип линии передачи данных. Это соответствует документации по проекту tcpdump о различных Link-Layer Header Types.

Оттуда вы сможете определить, сколько байтов содержит слой ссылки (если есть), и станет верным способом для разбора файлов pcap, созданных с помощью библиотеки libpcap.

Мне не известны параметры программы в «семействе libpcap», которые позволят вам просто захватить, начиная с транспортного уровня.

+2

В частности, обратите внимание, что одним из этих типов заголовков на уровне канала является 'LINKTYPE_RAW'; эти пакеты начинаются с заголовка IPv4 или IPv6, поэтому верхний полубайт первого байта пакета, вероятно, будет 4 для IPv4 или 6 для IPv6. –

+0

Я был удивлен, увидев, что вы не ответили на вопрос в первую очередь @GuyHarris. – RyPeck

+1

И если вы открыли устройство или сохранили файл захвата с помощью libpcap, 'pcap_datalink()' вернет значение 'DLT_' для типа заголовка канального уровня (который обычно * совпадает с значением' LINKTYPE_' , но есть некоторые исключения - 'LINKTYPE_RAW' /' DLT_RAW' является одним из исключений, для раздражающих исторических «разные BSD выбрали разные номера для« DLT_RAW », но мы хотим, чтобы файлы« raw IP »с любой платформы могли быть прочитаны на любом другой платформы "). –

Смежные вопросы