Кратко

  • Контрольная сумма TCP охватывает заголовок и данные TCP, а также концептуальный псевдозаголовок, составленный из сведений IP.
  • Псевдозаголовок не передаётся как байты TCP: отправитель и получатель восстанавливают его независимо.
  • Он помогает обнаруживать ошибки и некоторые случаи ошибочной доставки, но не является аутентификацией или доказательством маршрута.

Сегмент TCP визуально начинается с номеров портов, однако его контрольная сумма зависит и от контекста IP. Отправитель добавляет к расчёту адреса источника и назначения, идентификатор протокола и длину TCP. Получатель восстанавливает те же значения перед проверкой.

Для IPv4 RFC 793 описывает 96-битный псевдозаголовок: два адреса, нулевой байт, номер протокола IP и вычисленную длину TCP. Эти данные уже находятся в контексте IP, поэтому TCP не копирует их в сегмент. Они передаются через границу между протоколами.

Так решается конкретная проблема с доказательством целостности. Сумма только по байтам TCP могла бы остаться прежней после изменения адресов или идентификатора протокола окружающего пакета. Включение выбранных сведений IP позволяет заметить некоторые повреждения и доставки в иной контекст.

Расчёт использует сложение 16-битных слов с дополнением до единицы, а затем берётся дополнение до единицы полученной суммы. Во время расчёта поле контрольной суммы считается нулевым. При нечётном числе покрываемых октетов справа добавляется нулевой октет только для формирования последнего слова; он не передаётся. Длина TCP включает заголовок и данные TCP, но исключает двенадцать концептуальных октетов IPv4-псевдозаголовка.

RFC 9293 сохраняет этот механизм: отправитель обязан сформировать контрольную сумму, а получатель обязан её проверить. Любой нижележащий протокол, используемый с TCP, должен предоставлять адреса, идентичность протокола и способ определить длину TCP.

В IPv6 псевдозаголовок имеет длину 320 бит. В него входят адреса IPv6, длина пакета верхнего уровня, три нулевых байта и значение Next Header, обозначающее TCP. Если между IPv6 и TCP находятся расширенные заголовки, используется значение, идентифицирующее TCP в конце цепочки, а не обязательно ближайшее значение фиксированного заголовка IPv6. При исходной маршрутизации применяются исходный адрес и конечное назначение, а не промежуточные адреса.

Совпавшая сумма показывает лишь совместимость восстановленных покрываемых слов. Она не подтверждает личность отправителя, полномочия или пройденный путь и не мешает злоумышленнику изменить трафик и пересчитать значение. Псевдозаголовок — это соглашение между уровнями, а не скрытая часть передаваемого пакета.

Источники