1

Поле Internet Checksum. Как IP считает контрольную сумму

Господа, дамы, здравствуйте!

Ниже поговорим о контрольной сумме в IP и посмотрим на то, как узлы вычисляют ее. Напомню, что IP не контролирует целостность пользовательских данных, контрольная сумма считается только для заголовка. Поскольку на каждом транзитном узле заголовок пакета изменяется, каждый узел пересчитывает контрольную сумму с учетом внесенных изменений при отправке пакета дальше.

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

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

Алгоритм расчета контрольной суммы в IP-заголовке

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

  1. Заголовок разбивается на слова по 16 бит слева направо.

  2. Поле контрольной суммы само равно 16 бит, узел, получивший пакет, для расчета контрольной суммы не должен учитывать значение поля контрольная сумма.

  3. Таким образом если у заголовка нет опций, а само поле контрольной суммы мы отбрасываем, то получается 9 слов по шестнадцать бит, в общем виде одно слово будем обзывать буквой W, таким образом у нас есть слова от W0 до W8.

  4. Чтобы узнать контрольную сумму мы должны сперва сложить все слова: Wsum = W0+W1+W2+W3+W4+W5+W6+W7+W8. Правило о том, что от перестановки мест слагаемых сумма не меняется здесь тоже работает.

  5. Если Wsum получилась размером больше, чем 16 бит, получившееся число разбивается на два слова по 16 бит, которые затем складываются между собой(и так нужно будет повторять до тех пор, пока не получим число 16 бит).

  6. И наконец нужно выполнить операцию "исключающего ИЛИ" между шестнадцатеричным числом FFFF и получившимся Wsum. Это и будет контрольная сумма.

Если честно мне никогда не был понятен алгоритм, описанный словами. Поэтому ниже пример.

Рассчитываем контрольную сумму на калькуляторе

Чтобы проверить свои расчет, проще всего сделать дамп пакета, в котором контрольная сумма уже посчитана.

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

Дамп IP-пакета для расчета контрольной суммы

Слева в Wireshark мы видим представление пакетов удобное нам, человекам, а справа мы видим байтовой представление пакетов, где каждый байт представлен числом в шестнадцатеричной системе счисления, минимальное значение одного байта 00(ноль в десятичной), максимальное его значение FF(255 в десятичной), но для расчета нас интересуют слова по два байта.

Если слева нажать на строку Internet Protocol Version 4..., то справа нам подсветятся байты, соответствующие IP-заголовку. Байты я разбил на слова зелеными рамками, красная рамка это поле контрольная сумма и его мы отбросим.

Итого у нас получилась вот такая сумма:

Wsum = 4500 + 54 + 413C + 4000 + 3D01 + C0A8 + 010F + C0A8 + 020C = 287FC

Не забудьте переключить калькулятор в режим HEX, чтобы выполнять вычисления в шестнадцатеричном формате:

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

Складываем слова IP-заголовка

Число 287FC в шестнадцатеричной системе счисления занимает места больше, чем 16 бит, а значит надо разбить его на два числа по 16 бит и сложить их, делается это так:

Wsum = 0002 + 87FC = 87FE

Чтобы записать шестнадцатеричное число 87FE в двоичном виде шестнадцати бит хватит, а значит нам надо сделать FFFF XOR 87FE, здесь XOR это ИСКЛЮЧАЮЩЕЕ ИЛИ, подробнее про операцию можете почитать на вики, мы же сейчас возьмем калькулятор, переведем своё число в двоичный вид и сделаем XOR с двоичным числом 1111111111111111 (в HEX на калькуляторе можно сделать то же самое).

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

Выполняем операцию исключающее ИЛИ

В результате получилась та же контрольная сумма, что и насчитал роутер (7801 в шестнадцатеричном виде):

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

Контрольная сумма IP-заголовка посчитана

В общем, ничего сложного нет.

Для самостоятельного расчета

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

Поле Internet Checksum. Как IP считает контрольную сумму Сисадмин, Компьютерные сети, IT, Хост, Роутер, IP, Протокол, Сети, Связь, Телеком, Данные, Системное администрирование, Инженер, Урок, Обучение, YouTube, Образование, Видео, Длиннопост

Дамп пакета на следующем узле

Оранжевым выделено поле TTL, его значение изменилось(3c в шестнадцатеричной это 60 в десятичной), красным выделена контрольная сумма, у нее изменился первый байт, все остальные байты заголовка без изменений. Для закрепления алгоритма попробуйте самостоятельно рассчитать контрольную сумму этого заголовка.

Видео версия

Для тех, кому проще смотреть, чем читать.