2014-06-25 4 views
-1

Я хочу изменить пакеты, которые у меня есть, и отправить эти пакеты через сетевую карту. Для этого мне нужно рассчитать мой уровень UDP Checksum.Вычислить контрольную сумму уровня UDP

Так что я нашел this функцию, которая принимает массив и возвращает Checksum, но у меня есть два маленьких вопроса:

  1. UDP слой имеет 8 байт: 2 порта источника, 2 порта назначения, 2 длины и 2 контрольная сумма. функция, которую я нашел, должна быть вызвана с массивом, поэтому следует ли отправлять эту функцию в мой 6-байтовый массив с 2 байтами контрольной суммы или без нее?

  2. Эта функция упоминает, что она вычисляет контрольную сумму IP, это также подходит для вычисления контрольной суммы UDP?

    Edit:

Я нашел this статью, вычислить IP/TCP/UDP контрольной суммы, может у меня есть помощь, чтобы преобразовать код вычисления контрольной суммы UDP в C#?

+0

Вы проверили википедию? Хорошая страница с algos и все. – TomTom

+0

yes Я проверил – user3637066

+0

Контрольные суммы IP используют только заголовок. Контрольные суммы TCP/UDP используют заголовок и данные. – clcto

ответ

0

Автор этого поста говорит в своем комментарии

»... Первым параметром является массив, содержащий пакет IP заголовка (уже сформирован, но с поля контрольной суммы [два байта] устанавливается равным нулю). "

Итак, вы должны установить два байта контрольной суммы (байты 7 и 8) на ноль, а затем отправить все 8 байтов вашего заголовка, чтобы вычислить контрольную сумму.

Что касается контрольных сумм UDP/IP, это две разные вещи, и автор заявил, что этот расчет был специально предназначен для создания контрольной суммы заголовка IP.

+0

, поэтому я могу использовать эту функцию для контрольной суммы UDP? – user3637066

+0

№ Как указано в последнем предложении, автор сказал, что это была контрольная сумма IP-заголовка. Это, несомненно, приведет к неправильному значению контрольной суммы UDP.См. Это сообщение SO для получения информации о контрольных суммах UDP: http://stackoverflow.com/questions/1480580/udp-checksum-calculation – GEEF

+0

См. Мое обновление – user3637066

0

Вы пробовали установить его на ноль? Согласно RFC 768, это необязательно.

http://tools.ietf.org/html/rfc768

«все равны нулю переданное значение контрольной суммы означает, что передатчик не генерируется не контрольной суммы (для отладки или для протоколов более высокого уровня, которые не уход).»

Если вы действительно хотите вычислить его, вы можете попробовать посмотреть функцию assemble_udp_ip_header в FreeBSD: http://svnweb.freebsd.org/base/head/sbin/dhclient/packet.c?view=markup.

Вы не должны называть его только массивом из 6 байтов, потому что процедура контрольной суммы должна выполняться на псевдо-заголовке. Хотя вы, вероятно, могли бы использовать функцию, которую вы упомянули в псевдо-заголовке, я подозреваю, что у нее есть ошибка, в которой он может получить доступ к концу массива, если параметр длины не равен.

Контрольная сумма, которую вы вычислили, неверна, поскольку ее необходимо вычислить в заголовке psuedo. Вам не хватает таких полей, как протокол, источник ip-адреса, адрес IP-адреса и фактическая полезная нагрузка. Вы также записываете только 6 из 8 байтов, которые вы выделили.

+0

См. Мое обновление – user3637066

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