Кратко
- IPv4 защищал только изменяемый заголовок. Маршрутизатор проверял входную версию, уменьшал TTL или менял разрешённые поля и создавал новое значение для нового состояния, ничего не обещая о полезной нагрузке.
- TCP и UDP включали заголовок, данные и псевдозаголовок с выбранными фактами IP. Это помогало обнаруживать ошибочную доставку, но не подтверждало отправителя, владельца адреса или законность пути.
- В арифметике дополнения до единицы существуют положительный и отрицательный ноль. RFC 1141 мог получить
0xFFFF, когда полный пересчёт давал0x0000; RFC 1624 исправил границу. IPv6 убрал сумму из базового заголовка, но не ответственность верхних уровней.
Заголовок, который менялся в пути
Time to Live в IPv4 уменьшается в каждой точке обработки. Фрагментация меняет длину, флаги и смещение; некоторые опции тоже допускают изменение заголовка. Поэтому маршрутизатор не всегда передаёт ровно ту структуру, которую получил.
RFC 791 задаёт Header Checksum как дополнение до единицы от суммы с дополнением до единицы всех 16-битных слов заголовка. Само поле при вычислении считается нулём. Область покрытия — только заголовок.
Маршрутизатор проверяет входное состояние, отбрасывает ошибку, выполняет допустимое изменение и оставляет значение для новой версии. Это не неизменная печать источника, а локальное утверждение между двумя точками обработки.
Тот же RFC исключает контроль ошибок данных, подтверждения и повторы. Успешная проверка заголовка IPv4 ничего не говорит о payload. Она защищает сведения, нужные интернет-уровню для обработки.
Несколько границ в одном пакете
IPv4 суммирует собственный заголовок. RFC 768 охватывает в UDP заголовок, данные и псевдозаголовок. RFC 793 охватывает заголовок и текст TCP вместе с 96-битным псевдозаголовком.
Благодаря разделению изменение TTL не требует от маршрутизатора трогать сквозную проверку транспорта. Он обновляет IPv4; конечные узлы отвечают за TCP или UDP. Канальный уровень может иметь собственную проверку кадра, срок которой заканчивается на одном соседстве.
Несколько успешных проверок не образуют универсальный сертификат. У каждой свой материал, производитель и срок действия.
Псевдозаголовок, которого нет на проводе
UDP включает в расчёт адрес источника, назначения, номер протокола и длину UDP. TCP использует источник, назначение, протокол и длину TCP. Отдельный псевдозаголовок не передаётся; получатель восстанавливает его из IP.
RFC 768 и RFC 793 объясняют назначение защитой от неверно доставленных датаграмм и сегментов. Неизменные байты TCP не должны легко пройти, если оказались под другим назначением или протоколом.
Это не аутентификация. Тот, кто создаёт пакет или намеренно меняет покрытые поля, может пересчитать сумму. Псевдозаголовок не доказывает владение адресом, точность реестра, разрешение маршрута или отсутствие перехвата.
Два нуля с разным смыслом
В дополнении до единицы 0x0000 — положительный ноль, а 0xFFFF — отрицательный. RFC 768 использует оба представления: вычисленный нулевой результат UDP передаётся как все единицы; переданное поле из всех нулей означает, что отправитель не создавал контрольную сумму.
Поэтому 0xFFFF может быть действительным результатом, а 0x0000 в UDP поверх IPv4 — сигналом пропуска проверки. Кодирование различает «посчитано и получилось ноль» и «не считалось».
RFC 8200 делает UDP-проверку в IPv6 обязательной по умолчанию. Ноль записывается как 0xFFFF, а все нули должны быть отброшены. Ограниченное исключение предусмотрено для отдельных UDP-туннелей при дополнительных условиях, не как общее разрешение.
Разные реализации, общий ответ
RFC 1071 описывает свойства для ускорения. При сохранении чётной и нечётной позиции байтов сумма коммутативна и ассоциативна: буфер можно делить, частичные суммы объединять. Возможны оба порядка байтов, широкие аккумуляторы, развёрнутые циклы и параллельная работа. Один последний байт дополняется нулём только для вычисления.
Протокол фиксирует охват и итоговые биты, а не одну программу. Свобода заканчивается, когда спаривание байтов, циклический перенос или хвост дают другой результат.
Малое изменение без полной суммы
Уменьшая TTL, маршрутизатор знает изменившееся 16-битное слово. RFC 1141 показывает, как убрать старый вклад и добавить новый. Уменьшение TTL на один означает прибавление 1 или 256 к сохранённому полю в зависимости от позиции байта, по правилам дополнения до единицы.
RFC 1624 также называет фрагментацию и изменение source route. Затрата соответствует изменению. Но сокращённая операция верна лишь тогда, когда во всех случаях совпадает с полным пересчётом.
Формула, выбравшая невозможный ноль
RFC 1624 сообщает, что выражение RFC 1141 неявно использовало распределительное свойство, которое нарушается при нулевом результате. В примере слово меняется с 0x5555 на 0x3285, остальные октеты дают 0xCD7A. Полный пересчёт выдаёт 0x0000, старый метод — 0xFFFF.
В заголовке IPv4 это не свободные варианты. Хотя бы одно поле ненулевое. Сложение ненулевых входов с дополнением до единицы может дать отрицательный ноль, но не положительный; после финального дополнения поле может быть 0x0000, но канонически не 0xFFFF.
Исправление: HC' = ~(~HC + ~m + m'), где каждое сложение выполняется по правилам дополнения до единицы. Оно избегает неверного преобразования и совпадает с эталоном.
Некоторые получатели добавляли принятое поле к сумме и сравнивали результат с отрицательным нулём по RFC 1071; в примере они могли принять оба варианта. Другие пересчитывали и сравнивали непосредственно. Условие обнаружили испытания продукта, а анализ и моделирование подтвердили исправление.
Терпимость части получателей не делает неканонический выход допустимым. Производитель обязан дать представление, которое определяет общий расчёт.
IPv6 перенёс проверку
В базовом заголовке IPv6 из RFC 8200 нет контрольной суммы интернет-уровня. TCP, UDP и ICMPv6 продолжают использовать псевдозаголовок с 128-битными адресами, длиной верхнего уровня и значением Next Header.
RFC объясняет, что ICMPv6 включает эти сведения, поскольку зависящие от них поля IPv6 уже не покрыты проверкой интернет-уровня, как в IPv4. Ответственность не исчезла — она перешла к протоколам, которые используют поля.
IPv4 заставлял каждый маршрутизатор проверять и обновлять маленькое утверждение, часто рядом с канальной и транспортной проверкой. IPv6 убрал повтор из фиксированного заголовка, сохранил проверки конечных узлов и закрыл пропуск UDP по умолчанию.
Источники и неопределённость
RFC 768 задаёт UDP и нули; RFC 791 — IPv4; RFC 793 — TCP; RFC 1071 — свойства вычисления; RFC 1141 — обновление; RFC 1624 — исправление; RFC 8200 — границу IPv6.
Они не доказывают единственного изобретателя, универсальную реализацию, нынешнюю распространённость offload или конкретную долю необнаруженных ошибок. Успех не исключает намеренное изменение с пересчётом; ошибка сама не называет устройство или человека.
Надёжен более узкий вывод: точное определение байтов, производителя и предела действия сделало многие несоответствия дешёвыми для обнаружения, не превратив сумму во всеобщую власть.
Обзор для участников
Подробный контекст профиля
Войдите с подходящим уровнем подписки, чтобы открыть полный обзор и примечания к источникам.
Только для Стратегического сообщества
Стратегическое сообщество
Открыто всем читателям. Вступите и войдите, чтобы открыть обзоры профилей.
Вступить в Стратегическое сообществоТолько для Альянса лидеров
Альянс лидеров
Для проверенных владельцев IP-активов и руководителей. Войдите, чтобы открыть обзоры Альянса.
Вступить в Альянс лидеров
