Получение позиции udp заголовка

Рейтинг: 0Ответов: 1Опубликовано: 02.11.2014

Вот есть код из мануала Wincap: ссылка.

И в нем не совсем понятен следующий момент:

/* retireve the position of the udp header */
ip_len = (ih->ver_ihl & 0xf) * 4;
uh = (udp_header *) ((u_char*)ih + ip_len);

Почему сдвиг только на 20 байт, а не больше? Получается, данные не учитываются, а где тогда они? Я имею ввиду данные 46-1500. Где они расположены?

Получается, что все заголовки идут до 46 байта, а за ними идут данные до 1500 байта?

Ответы

▲ 2Принят

@xinakapu, откуда у Вас 20, 46 и 1500 байт?

ip_len -- максимум 15 * 4 = 60 байт.
sizeof(*uh) = 8
60 + 8 = 68 -- это максимальное смещение данных (после ip и udp заголовков).
Максимальный размер всего пакета (всех фрагментов вместе со всеми заголовками) -- 65535 байт (ih->tlen)

(см. структуру заголовков в, например, udp header и ip header)

Обновление

@xinakapu, извините, немного ошибся и обманул Вас.

--

tlen в ip заголвке -- это длина фрагмента, а не всех фрагментов.

Данные находятся в каждом фрагменте после заголовков. В первом фрагменте, том у которого Fragment offset = 0, после udp заголовка, в остальных сразу после ip.

--

А Вы описание IP внимательно прочли?

Обновление 2

@xinakapu, максимальная длина ip header 60 -- это, естественно, минимальная длина = 20 + Options.

А про смещение 14 в коде вашего примера написано:

 /* retireve the position of the ip header */
 ih = (ip_header *) (pkt_data +
                      14); //length of ethernet header

Про последний вопрос:

 И сколько вообще может ещё быть заголовков других протоколов над tcp или udp?

не знаю, думаю зависит от того, во что они инкапсулируются на datalink(?) уровне.