Есть программа учебная, для отправки своих пакетов. Возникла проблема с вычислением контрольной суммы для ICMP заголовка третьего типа, то есть, отправка об ошибке (порт недоступен). Пакет формируется из Ethernet-Layer'a 2 версии, IPv4 заголовка, ICMP заголовка и UDP(вместе с IPv4 заголовком для него) Итак, теперь к вопросу, никак не догоняю какие байты пакета используются для вычисления контрольной суммы ICMP заголовка. Объяснения для меня в RFC(https://tools.ietf.org/html/rfc792) было непонятном, поэтому обращаюсь сюда, надеясь на помощь. Все остальные контрольные суммы верны.
Код создания пакета: https://pastebin.com/q1F3bWni (без кода псевдозаголовка UDP, да он и не нужен, ведь с ним всё впорядке) Код вычисления контрольной суммы: https://pastebin.com/72tmxMi7 (входные данные для расчёта контрольной суммы: сам собственно набор данных, второе значение - откуда начинать. Третье же - сколько смещаться с текущего места вперёд)
Update, посмотрев выложенный код:
Если коротко, контрольные суммы у вас считаются в обратном порядке. Т.е. получается, что вы ICMP checksum посчитали, а потом те данные, по которым она считалась, взяли и поменяли, вставив туда UDP checksum и т.д. Надо начинать с самого "внутреннего" пакета (UDP в вашем случае) и идти в обратном порядке. Если других ошибок нет, то должно заработать.
А эта ошибка от того, что не понимаете "физического смысла" того, что делаете. Разберитесь с инкапсуляцией сетевых пакетов (типа такого "http://www.tcpipguide.com/free/t_IPDatagramEncapsulation.htm", вам должны были всё это на лекциях давать).
Оригинальный ответ: RFC792 говорит (для Destination Unreachable Message, приведенного в вопросе): Checksum: The checksum is the 16-bit ones's complement of the one's complement sum of the ICMP message starting with the ICMP Type. For computing the checksum , the checksum field should be zero. This checksum may be replaced in the future.
То есть, глядя на ваш пример, начиная с Type: 3 и до конца Data. При этом 2 байта отведенные под checksum во время вычисления должны быть заполнены нулями. Потом на их место положить вычисленный результат. Для других типов могут быть нюансы с padding (см. Echo), так что надо быть внимательным.
Продвижение своими сайтами как стратегия роста и независимости