Если я создаю парсер, как я узнаю, сколько байтов мне нужно пропустить, чтобы получить мой первый блок данных?
Это не так, как вы это делаете.
Если вы создаете парсер, обратите внимание, что парсер должен смотреть не только на первый блок фрейма данных.
Прежде всего, он должен смотреть на Заголовок раздела Блок (SHB), чтобы определить порядок байтов данных во всех последующих блоках путем просмотра поля Byte-Order Magi c.
После этого вам нужно просмотреть все последующие блоки, ища Интерфейс Описание Блоки и Расширенные пакетные блоки (EPB), Простые пакетные блоки (SPB) и, возможно, Пакетные блоки (PB) (они устарели, поэтому ни одна программа не должна записывать их, но программы должны быть готовы читать их). Каждый EPB или PB имеет идентификатор интерфейса, который относится к IDB, который должен был появиться перед рассматриваемым EPB или PB; SPB неявно ссылается на первый IDB, который, опять же, должен был появиться до рассматриваемого SPB.
Формат данных пакета в EPB, SPB или PB зависит от указанного типа канального уровня IDB, к которому он относится, поэтому вам необходимо прочитать рассматриваемый IDB.
И, как указано выше, не имеет фиксированного числа байтов между SHB и первый EPB, SPB или PB, поэтому нет простого фиксированного числа байтов, которое нужно пропустить, чтобы добраться до первого блока кадра данных. Во-первых, есть переменное число байтов, которое вы можете определить, только прочитав все блоки перед первым EPB, SPB или PB. С другой стороны, вы не можете пропустить их, вы должны прочитать их, чтобы получить достаточно информации для интерпретации в них пакетных данных.
Где хранятся данные? Под данными я подразумеваю весь кадр, содержащий данные Ethe rnet, IP и TCP, как показано на рисунке ниже (рисунок 1).
Он хранится в EPB, SPB или PB. Смотрите описания этих трех типов блоков; кадры находятся в полях «Packet Data» этих блоков.
Так что я нахожусь в моем блоке описания интерфейса и 64-битном числе, которое содержит разрешение временной метки 9 (10 ^ -9, Наносекунды?) И 6 (10 ^ -6, микросекунды).
Как указал Кристофер Мейнард, 9 не является разрешением временной метки, это тип параметра. Блоки Pcapng имеют как фиксированную информацию в начале, так и опции ; опция начинается с типа опции и длины значения опции, за которой следуют данные опции. Опция IDB if_tsresol имеет
- 2 байта типа опции со значением 9;
- 2 байта длины значения опции со значением 1;
- 1 байт значения параметра со значением, указанным в описании этого параметра.
Значение 6 означает, что разрешение метки времени составляет 1/10 ^ 6 секунды, что означает 1 микросекунду.