@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(?) уровне.