Открыть сервис

Контрольная сумма TCP

Контрольная сумма TCP — это 16-битное поле в заголовке сегмента протокола TCP (Transmission Control Protocol), предназначенное для обнаружения ошибок, возникающих при передаче данных между отправителем и получателем. Она вычисляется на основе псевдозаголовка, самого TCP-заголовка и полезной нагрузки (данных прикладного уровня) и проверяется на стороне получателя для обеспечения целостности переданного сегмента. Контрольная сумма TCP является обязательной для всех сегментов и реализует механизм обнаружения ошибок, но не их исправления.

История и развитие

Контрольная сумма TCP была введена в спецификации протокола TCP, опубликованной в 1981 году в RFC 793 (Transmission Control Protocol). Изначально алгоритм вычисления был основан на 16-битном дополнении до единицы (one's complement sum), что позволяло эффективно реализовать проверку на аппаратном уровне. В ранних версиях TCP контрольная сумма охватывала только заголовок и данные, но позже, с учётом необходимости проверки корректности адресации, был добавлен псевдозаголовок, включающий IP-адреса отправителя и получателя, протокол и длину сегмента.

В 1990-х годах, с ростом скорости сетей, возникли проблемы с производительностью вычисления контрольной суммы на программном уровне. Это привело к разработке аппаратных ускорителей (TCP Offload Engine) и оптимизаций, таких как использование инструкций SSE (Streaming SIMD Extensions) в процессорах. В 2000-х годах были предложены альтернативные алгоритмы, например, CRC (Cyclic Redundancy Check), но они не были приняты для TCP из-за обратной совместимости и дополнительных накладных расходов.

Структура и вычисление

Поле контрольной суммы

В заголовке TCP поле контрольной суммы занимает 16 бит (2 байта) и располагается сразу после поля «Указатель важности» (Urgent Pointer). Если контрольная сумма не вычисляется (что теоретически возможно, но не рекомендуется), поле устанавливается в нулевое значение. В типичной реализации отправитель вычисляет сумму, а получатель проверяет её.

Псевдозаголовок

Для корректной проверки целостности сегмента в контексте IP-пакета используется псевдозаголовок (pseudo-header), который не передаётся в сети, а добавляется только при вычислении и проверке контрольной суммы. Псевдозаголовок состоит из следующих полей (в порядке байтов):

  • IP-адрес источника (32 бита) — из IP-заголовка.
  • IP-адрес назначения (32 бита) — из IP-заголовка.
  • Зарезервированный байт (8 бит, обычно нулевой).
  • Протокол (8 бит) — для TCP значение 6.
  • Длина TCP-сегмента (16 бит) — длина заголовка TCP и данных в байтах.

Использование псевдозаголовка позволяет обнаружить ошибки маршрутизации, при которых сегмент TCP может быть доставлен не тому узлу или приложению.

Алгоритм вычисления

Контрольная сумма TCP вычисляется по алгоритму 16-битного дополнения до единицы (one's complement sum). Процесс включает следующие шаги:

  1. Поле контрольной суммы в заголовке TCP временно устанавливается в нулевое значение.
  2. Данные (псевдозаголовок, TCP-заголовок и полезная нагрузка) разбиваются на 16-битные слова. Если общая длина данных нечётна, последний байт дополняется нулевым байтом (padding).
  3. Все 16-битные слова суммируются с использованием арифметики дополнения до единицы: при переполнении (переносе старшего бита) результат увеличивается на 1.
  4. Итоговая сумма инвертируется (все биты заменяются на противоположные) и записывается в поле контрольной суммы.

На стороне получателя выполняется аналогичное вычисление, но с учётом переданного значения контрольной суммы. Если результат равен 0xFFFF (все биты равны 1), то ошибок не обнаружено. Любое другое значение указывает на наличие ошибки в сегменте.

Пример

Для простого TCP-сегмента с заголовком длиной 20 байт и данными длиной 10 байт (всего 30 байт) псевдозаголовок добавляет 12 байт. После дополнения до чётного числа (30 + 12 = 42 байта, что нечётно, добавляется нулевой байт) получается 22 16-битных слова. После суммирования и инвертирования получается контрольная сумма, например, 0x1A2B.

Проверка и обнаружение ошибок

Процесс проверки

Получатель после приёма IP-пакета извлекает TCP-сегмент, восстанавливает псевдозаголовок на основе IP-заголовка и вычисляет контрольную сумму тем же алгоритмом. Если результат вычисления совпадает с полем контрольной суммы (то есть итоговая сумма всех 16-битных слов, включая переданную контрольную сумму, равна 0xFFFF), сегмент считается корректным. В противном случае сегмент отбрасывается, и отправитель не получает подтверждения (ACK), что приводит к повторной передаче по тайм-ауту.

Типы обнаруживаемых ошибок

Контрольная сумма TCP обнаруживает:

  • Одиночные битовые ошибки.
  • Двойные битовые ошибки (если они не компенсируют друг друга в рамках одного 16-битного слова).
  • Ошибки в чётном числе битов в пределах одного слова.
  • Ошибки, связанные с перестановкой байтов (из-за побайтового суммирования).
  • Ошибки в адресации (благодаря псевдозаголовку).

Однако алгоритм дополнения до единицы не обнаруживает ошибки, при которых количество битовых изменений кратно 16, или ошибки, приводящие к циклическому сдвигу данных. Вероятность необнаруженной ошибки для TCP оценивается как крайне низкая (менее 10⁻⁵ для типичных каналов), но не нулевая.

Критика и ограничения

Надёжность

Контрольная сумма TCP не является криптографически стойкой. Она не защищает от преднамеренных изменений данных (например, при атаке «человек посередине»), так как злоумышленник может пересчитать контрольную сумму после модификации сегмента. Для обеспечения целостности на более высоком уровне используются протоколы TLS (Transport Layer Security) или IPsec.

Производительность

На высокоскоростных сетях (10 Гбит/с и выше) программное вычисление контрольной суммы может стать узким местом. Для решения этой проблемы применяются аппаратные ускорители (TCP Offload Engine, TOE) и оптимизации на уровне ядра ОС (например, использование инструкций CRC32 в процессорах x86). В некоторых реализациях (например, в Linux) используется алгоритм с использованием таблиц предварительных вычислений.

Альтернативы

В протоколах, ориентированных на высокую надёжность, таких как SCTP (Stream Control Transmission Protocol), используется 32-битная контрольная сумма CRC32, которая обеспечивает лучшую обнаруживающую способность. Однако для TCP сохранение 16-битного поля обусловлено обратной совместимостью и минимальными накладными расходами (дополнительные 2 байта на сегмент).

Применение

Контрольная сумма TCP используется во всех реализациях стека TCP/IP, включая:

В современных сетях, где каналы передачи данных обладают низкой вероятностью ошибок (например, оптоволокно), контрольная сумма TCP часто остаётся единственным механизмом обнаружения ошибок, так как на канальном уровне (Ethernet) используется CRC32, но он не защищает от ошибок в маршрутизаторах.

Интересные факты

  • В спецификации RFC 793 допускается, что контрольная сумма может быть нулевой, если отправитель не вычисляет её. Однако на практике это не используется, так как нарушает совместимость.
  • При вычислении контрольной суммы для сегментов, содержащих данные с выравниванием по границе слова, производительность может быть выше из-за отсутствия необходимости дополнения.
  • В некоторых реализациях TCP (например, в FreeBSD) для ускорения вычислений используется предварительная сумма для псевдозаголовка, которая затем добавляется к сумме данных.

Источники

  • RFC 793 — Transmission Control Protocol (1981).
  • RFC 1122 — Requirements for Internet Hosts — Communication Layers (1989).
  • RFC 1071 — Computing the Internet Checksum (1988).
  • Stevens, W. Richard. TCP/IP Illustrated, Volume 1: The Protocols. Addison-Wesley, 1994.
  • Comer, Douglas E. Internetworking with TCP/IP, Volume 1: Principles, Protocols, and Architecture. Pearson, 2014.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →