double arrow

Расчёт контрольной суммы

Перед расчетом контрольной суммы UDP-сообщение дополняется в конце нулевыми битами до длины, кратной 16 битам (псевдозаголовок и добавочные нулевые биты не отправляются вместе с сообщением). Поле контрольной суммы в UDP-заголовке во время расчета контрольной суммы отправляемого сообщения принимается нулевым.

Для расчета контрольной суммы псевдозаголовок и UDP-сообщение разбивается на слова (1 слово = 2 байта (октета) = 16 бит). Затем рассчитывается поразрядное дополнение до единицы суммы всех слов с поразрядным дополнением. Результат записывается в соответствующее поле в UDP-заголовке.

В том случае, если контрольная сумма получилась равной нулю, поле заполняют единицами. Если контрольную сумму не требуется рассчитывать, значение поля оставляют нулевым.

При получении сообщения получатель считает контрольную сумму заново (уже учитывая поле контрольной суммы), и, если в результате получится двоичное число из шестнадцати единиц (то есть 0xffff), то контрольная сумма считается сошедшейся, и сообщение принимается.

Поля

Если задействован порт отправителя, то он указывает порт процесса, посылающего датаграмму. Можно принять, что это тот порт, на который при отсутствии какой-либо иной информации следует адресовать ответную датаграмму. Если данное поле не задействовано, то в него следует записать нули. Порт получателя имеет смысл только в контексте конкретного Internet адреса получателя.

Длина — длина в октетах данной датаграммы, включая как заголовок, так и данные (Это означает, что минимальное значение поля длины равно восьми).

В псевдозаголовке, который «понарошку» добавляется к UDP-заголовку, указываются адреса отправителя и получателя, номер протокола и длина UDP-датаграммы. Процедура вычисления контрольной суммы такая же, как и в протоколе TCP.

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

Здесь следует внести небольшое пояснение. При дополнении до единицы, или, что то же, при обратном представлении числа, запись со всеми нулями эквивалентна записи со всеми единицами. Обе они обозначают нуль. Поскольку первый бит является знаковым, число, состоящее из всех нулей называют положительным нулём, а состоящее из всех единиц — отрицательным. Несмотря на их математическую эквивалентность, в поле контрольной суммы UDP, как можно было видеть, они используются по-разному. Положительный ноль указывает на то, что контрольная сумма намеренно не вычислялась, а отрицательный ноль, на то, что вычисленная контрольная сумма оказалась равной нулю.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: