Порядковый номер TCP
Порядковый номер TCP (англ. TCP sequence number) — это 32-битное целое число без знака, которое используется в протоколе управления передачей (TCP) для обеспечения надёжной доставки данных, восстановления порядка сегментов и управления потоком. Каждый байт данных, передаваемый по TCP-соединению, имеет свой порядковый номер, а в заголовке TCP-сегмента указывается номер первого байта данных в этом сегменте. Порядковые номера являются ключевым механизмом, позволяющим протоколу корректно собирать данные на стороне получателя, обнаруживать потери и дублирование пакетов, а также реализовывать алгоритмы скользящего окна.
Назначение и роль в протоколе TCP
Протокол TCP (Transmission Control Protocol) является транспортным протоколом с установлением соединения, ориентированным на надёжную передачу потока байтов. В отличие от протокола UDP, TCP гарантирует доставку данных в том же порядке, в котором они были отправлены, и без потерь. Эта гарантия обеспечивается именно благодаря системе порядковых номеров.
Каждый байт данных, переданный в рамках одного TCP-соединения, получает уникальный порядковый номер. Когда отправитель передаёт сегмент, он помещает в его заголовок порядковый номер первого байта данных в этом сегменте. Получатель, в свою очередь, использует номер подтверждения (acknowledgment number) в своих сегментах, чтобы указать, какой байт он ожидает следующим. Таким образом, порядковые номера позволяют:
- Восстанавливать порядок сегментов: если сегменты приходят в неправильной последовательности, получатель может переупорядочить их на основе порядковых номеров.
- Обнаруживать потери: если отправитель не получает подтверждение для определённого порядкового номера в течение тайм-аута, он повторно отправляет данные.
- Удалять дубликаты: получатель может игнорировать повторно отправленные сегменты, если их порядковые номера уже были обработаны.
- Управлять потоком: получатель сообщает отправителю размер своего окна приёма, и отправитель не может отправлять данные с порядковыми номерами, выходящими за пределы этого окна.
Структура и формат
Порядковый номер в TCP является 32-битным полем, что позволяет адресовать до 4 294 967 296 байт (2^32). В заголовке TCP-сегмента присутствуют два поля, связанных с порядковыми номерами:
- Sequence Number (SEQ): 32 бита. Содержит порядковый номер первого байта данных в данном сегменте. Если установлен флаг SYN (синхронизация), то это начальный порядковый номер (ISN, Initial Sequence Number), и первый байт данных будет иметь номер ISN+1.
- Acknowledgment Number (ACK): 32 бита. Содержит порядковый номер следующего байта, который получатель ожидает получить от отправителя. Это поле действительно только при установленном флаге ACK.
Оба поля являются беззнаковыми целыми числами. При достижении максимального значения (2^32 - 1) порядковый номер сбрасывается в 0 — это явление называется циклическим переполнением (wrap-around). Для современных высокоскоростных сетей, где за короткое время может быть передано более 4 ГБ данных, это создаёт потенциальные проблемы, которые решаются с помощью расширения временных меток (TCP Timestamps) в опциях заголовка.
Начальный порядковый номер (ISN)
При установлении TCP-соединения (тройное рукопожатие) каждый из участников выбирает свой начальный порядковый номер (ISN). Этот номер не может быть предсказуемым, так как это делает соединение уязвимым для атак типа TCP-спуфинг (подделка сегментов). В современных реализациях TCP ISN генерируется с использованием псевдослучайных алгоритмов, часто привязанных к системному времени или счётчику.
Процесс установления соединения выглядит следующим образом:
- Клиент отправляет серверу сегмент с флагом SYN и своим ISN (например, X).
- Сервер отвечает сегментом с флагами SYN и ACK, где:
- Sequence Number = свой ISN (Y).
- Acknowledgment Number = X + 1 (подтверждение получения SYN клиента и ожидание первого байта данных).
- Клиент отправляет сегмент с флагом ACK, где:
- Sequence Number = X + 1.
- Acknowledgment Number = Y + 1.
После этого соединение считается установленным, и первый байт данных от клиента будет иметь порядковый номер X+1, а от сервера — Y+1.
Подтверждение и скользящее окно
Получатель TCP использует поле Acknowledgment Number для подтверждения успешного приёма данных. Важно понимать, что подтверждение является кумулятивным: номер ACK = N означает, что все байты с порядковыми номерами до N-1 включительно были успешно получены, и получатель ожидает байт с номером N.
Этот механизм лежит в основе скользящего окна (sliding window). Отправитель может передавать несколько сегментов без ожидания подтверждения, но не более, чем позволяет размер окна приёма, объявленный получателем. Окно приёма — это количество байт, которое получатель готов принять в данный момент. Если отправитель не получает подтверждение для сегмента с определённым номером, он запускает таймер повторной передачи.
Проблема циклического переполнения
Поскольку поле порядкового номера имеет размер 32 бита, после передачи 4 ГБ данных номера начинают повторяться (переполнение). В классическом TCP это может привести к путанице: старый, задержавшийся в сети сегмент с тем же порядковым номером, что и новый, может быть ошибочно принят за актуальные данные. Для решения этой проблемы в спецификацию TCP были добавлены опции:
- TCP Timestamps (RFC 1323): каждый сегмент снабжается временной меткой. Даже при совпадении порядковых номеров получатель может отличить старый сегмент от нового по значению метки.
- Защита от циклического переполнения (PAWS, Protection Against Wrapped Sequences): алгоритм, использующий временные метки для отбрасывания старых дубликатов.
На практике для большинства приложений (например, веб-серфинг) 4 ГБ — это большой объём, и переполнение происходит редко. Однако для высокоскоростных каналов (10 Гбит/с и выше) переполнение может происходить за секунды, и PAWS становится обязательным.
Безопасность и атаки
Порядковые номера TCP являются критическим элементом безопасности протокола. Основные угрозы:
- Предсказание ISN: если злоумышленник может угадать начальный порядковый номер, он может подделать сегмент и внедрить его в соединение (атака TCP hijacking). Современные операционные системы генерируют ISN случайным образом.
- Атака Blind TCP Reset: злоумышленник отправляет поддельный сегмент с флагом RST (сброс) и правильным порядковым номером, что разрывает соединение. Защита достигается использованием случайных ISN и опций, таких как TCP MD5 Signature (RFC 2385) или TCP-AO (RFC 5925).
- Атака SYN flood: злоумышленник отправляет множество SYN-пакетов с поддельными ISN, заставляя сервер выделять ресурсы под частично открытые соединения. Защита реализуется через SYN-куки (SYN cookies), где ISN сервера вычисляется на основе хеша от адресов и времени.
Применение в сетевой диагностике
Порядковые номера TCP активно используются в инструментах анализа трафика (например, Wireshark, tcpdump). Аналитики могут отслеживать:
- Повторные передачи: если один и тот же порядковый номер появляется в нескольких сегментах, это указывает на потерю пакета.
- Дубликаты подтверждений (DupACK): три одинаковых ACK с одним и тем же номером являются признаком потери сегмента и запускают механизм быстрой повторной передачи (Fast Retransmit).
- Разрывы в последовательности: пропуски в порядковых номерах указывают на потерянные или переупорядоченные сегменты.
Интересные факты
- В ранних реализациях TCP (RFC 793, 1981 год) начальный порядковый номер выбирался на основе 4-микросекундного таймера, что делало его предсказуемым. Это привело к известной атаке Кевина Митника на компьютер Цутому Симомуры в 1994 году.
- Поле порядкового номера является единственным полем в заголовке TCP, которое может циклически переполняться; все остальные поля (порты, флаги, окно) имеют фиксированную логику.
- В протоколе TCP существует понятие «тишины» (silent discard): если сегмент с порядковым номером, выходящим за пределы окна приёма, отбрасывается без уведомления отправителя.
Источники
- RFC 793 — Transmission Control Protocol (1981)
- RFC 1323 — TCP Extensions for High Performance (1992)
- RFC 5961 — Improving TCP's Robustness to Blind In-Window Attacks (2010)
- Стивенс, У. Р. «TCP/IP. Иллюстрированное руководство. Том 1: Протоколы» (2003)
- Таненбаум, Э., Уэзеролл, Д. «Компьютерные сети» (5-е издание, 2012)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →