
пакета вставить поле контрольной суммы, которое бы рассчитывалось для
всего пакета: и заголовка и данных, было бы хорошо или плохо? Разумеется,
это было бы плохо, так как, по крайней мере, заголовок пакета меняется при
прохождении маршрутизаторов, следовательно, контрольную сумму каждому
маршрутизатору пришлось бы пересчитывать, что является дополнительной
вычислительной нагрузкой на маршрутизатор, а если бы маршрутизатору
пришлось бы при этом еще и пересчитывать контрольную сумму по ВСЕМУ
пакету, было бы очень печально . Поэтому в стеке TCP/IP поступают так:
всякий протокол, желающий положить свои данные в IP пакет САМ должен
позаботится о защите передаваемых им данных и собственного заголовка
контрольной суммой, т.е. IP получает уже защищенные данные. Т.е., если
повредится содержимое IP пакета, ничего страшного не произойдет, ошибка
будет обнаружена, но что будет, если повредится сам заголовок IP пакета? Для
защиты заголовка IP пакета в этом самом заголовке присутствует поле
«Контрольная сумма заголовка», таким образом, достигается разумный
компромисс: маршрутизаторы все равно должны пересчитывать контрольную
сумму для каждого обрабатываемого пакета, но она рассчитывается только для
нескольких десятков байт заголовка, т.е. вычислительная нагрузка на
маршрутизатор снижена.
О механизме расчета контрольной суммы: в IP не используется метод
CRC, а применяется гораздо более примитивная защита – контрольная сумма
заголовка рассчитывается как дополнение до единицы всех двухбайтовых слов
заголовка. Следовательно, изменением пары подходящих бит заголовка можно
добиться того, что заголовок поврежден, а контрольная сумма об этом не
сигнализирует. Почему применен именно этот алгоритм? Вследствие его малой
вычислительной сложности, в противовес высокой сложности алгоритма CRC.
Авторы RFC791 декларировали, что впоследствии алгоритм вычисления
контрольной суммы может быть изменен,
This is a simple to compute checksum and experimental evidence
indicates it is adequate, but it is provisional and may be replaced by
a CRC procedure, depending on further experience.
но как это сделать сейчас, когда огромное количество маршрутизаторов и
узлов в Интернете используют именно старый алгоритм? Собственно никак.
Так как поле контрольной суммы заголовка само принадлежит заголовку,
то для расчета контрольной суммы необходимо для начала положить поле
контрольной суммы равным 00 00, а уже затем рассчитать контрольную сумму.
The checksum field is the 16 bit one's complement of the one's
complement sum of all 16 bit words in the header. For purposes of
computing the checksum, the value of the checksum field is zero.
Переходим к рассмотрению двух последних слов заголовка: