Тройное рукопожатие
Тройное рукопожатие (англ. three-way handshake) — это процедура установления соединения в протоколе управления передачей (TCP, Transmission Control Protocol), обеспечивающая синхронизацию порядковых номеров (sequence numbers) и подтверждение готовности обеих сторон к обмену данными. Данный механизм является обязательным этапом перед началом передачи полезной нагрузки в TCP-сессии и служит для предотвращения установления ошибочных или дублирующихся соединений, а также для согласования параметров сегментов.
История и назначение
Протокол TCP был разработан в 1970-х годах в рамках проекта ARPANET группой инженеров под руководством Винтона Серфа и Роберта Канна. Первая спецификация TCP была опубликована в 1974 году, а окончательный стандарт, RFC 793, вышел в 1981 году. Одним из ключевых нововведений TCP стала надёжная доставка данных с установлением логического соединения, что потребовало механизма начальной синхронизации. Тройное рукопожатие было предложено как решение проблемы «двух армий» (two-army problem) в распределённых системах: оно позволяет двум узлам согласовать начальные порядковые номера без гарантии доставки каждого сообщения.
Основное назначение процедуры — установить уникальные начальные порядковые номера (ISN, Initial Sequence Number) для каждого направления передачи. Это необходимо для правильной сборки сегментов, обнаружения дубликатов и управления окном перегрузки. Без тройного рукопожатия возможно возникновение «полуоткрытых» соединений (half-open connections), когда одна сторона считает связь установленной, а другая — нет.
Процедура установления соединения
Тройное рукопожатие состоит из трёх этапов обмена сегментами TCP с установленными флагами SYN (synchronize) и ACK (acknowledgment). Процесс инициируется клиентом (активной стороной) и завершается сервером (пассивной стороной), хотя в общем случае обе роли симметричны.
Этап 1: SYN
Клиент отправляет серверу сегмент с флагом SYN и случайным начальным порядковым номером (например, x). Этот сегмент не содержит полезных данных, но занимает один порядковый номер в последовательности. Клиент переходит в состояние SYN_SENT и ожидает ответа.
Этап 2: SYN-ACK
Сервер, получив SYN-сегмент, выделяет ресурсы для нового соединения и отвечает сегментом с двумя установленными флагами: SYN и ACK. В этом сегменте:
- порядковый номер сервера — собственный случайный ISN (например,
y); - номер подтверждения (acknowledgment number) устанавливается равным
x+1, что означает получение SYN от клиента и ожидание следующего байта.
Сервер переходит в состояние SYN_RCVD.
Этап 3: ACK
Клиент, получив SYN-ACK, отправляет серверу сегмент с флагом ACK, где:
- порядковый номер равен
x+1; - номер подтверждения равен
y+1.
После получения этого сегмента сервер переходит в состояние ESTABLISHED. Клиент также переходит в ESTABLISHED сразу после отправки ACK. С этого момента обе стороны могут обмениваться данными.
Диаграмма состояний
`` Клиент Сервер | | |-------- SYN (x) -------->| | | |<------ SYN-ACK (y, x+1)--| | | |-------- ACK (y+1) ------>| | | |<----- Данные/ACK ------->| ``
Варианты и модификации
Быстрое открытие TCP (TCP Fast Open)
В 2012 году в RFC 7413 была предложена оптимизация тройного рукопожатия — TCP Fast Open (TFO). Этот механизм позволяет отправлять данные уже в SYN-сегменте, сокращая задержку первого раунда (RTT) для повторных соединений. TFO использует криптографический cookie, который клиент получает при первом рукопожатии и затем предъявляет при последующих. Однако TFO не отменяет тройное рукопожатие полностью, а лишь совмещает его с передачей данных.
SYN-куки (SYN cookies)
Для защиты от SYN-флуд-атак (см. ниже) применяется техника SYN-куки. Сервер не выделяет ресурсы при получении SYN, а кодирует информацию о соединении в собственный ISN с помощью хеш-функции. При получении ACK от клиента сервер проверяет корректность номера подтверждения и только тогда создаёт полноценное соединение. Это позволяет обойтись без хранения состояния на этапе SYN_RCVD.
Тройное рукопожатие в IPv6
В протоколе IPv6 тройное рукопожатие TCP работает аналогично IPv4, однако может быть затронуто механизмами обнаружения пути MTU (Path MTU Discovery) и расширениями безопасности (IPsec). Сама процедура не зависит от версии IP.
Проблемы и уязвимости
SYN-флуд (SYN flood)
Одна из наиболее известных атак на тройное рукопожатие — SYN-флуд. Злоумышленник отправляет множество SYN-сегментов с поддельными IP-адресами отправителя. Сервер, отвечая SYN-ACK, переводит соединение в состояние SYN_RCVD и выделяет ресурсы (память под буферы). Если ответный ACK не приходит (так как адрес поддельный), соединение остаётся полуоткрытым до истечения тайм-аута (обычно 30–60 секунд). Массовая отправка таких сегментов может исчерпать ресурсы сервера, сделав его недоступным для легитимных подключений.
Методы защиты включают:
- SYN-куки — не хранить состояние до получения ACK;
- увеличение очереди SYN (backlog);
- сокращение тайм-аута для полуоткрытых соединений;
- фильтрация трафика на уровне межсетевого экрана.
Задержка первого пакета
Тройное рукопожатие добавляет как минимум один полный круговой обход (RTT) перед началом передачи данных. Для коротких транзакций (например, HTTP-запросов) это может составлять значительную долю общего времени. TCP Fast Open и другие оптимизации (например, TLS 1.3, совмещающий рукопожатие с шифрованием) частично решают эту проблему.
Атака «человек посередине» (MITM)
Хотя тройное рукопожатие не шифрует данные, злоумышленник, контролирующий сетевой путь, может перехватить SYN и SYN-ACK и подменить порядковые номера. Это позволяет внедрить в поток поддельные сегменты. Для защиты используется шифрование на уровне приложений (TLS/SSL) или IPsec.
Альтернативы и сравнение с другими протоколами
UDP (User Datagram Protocol)
UDP не устанавливает соединение и не использует тройное рукопожатие. Это снижает задержки, но не гарантирует доставку, порядок или целостность данных. UDP применяется в приложениях реального времени (VoIP, видеоконференции, DNS), где потеря пакетов менее критична, чем задержка.
QUIC (Quick UDP Internet Connections)
Протокол QUIC, разработанный Google и стандартизированный в RFC 9000, использует UDP и объединяет рукопожатие транспортного уровня с криптографическим (TLS 1.3). QUIC выполняет установление соединения за 0–1 RTT (при повторном подключении), что значительно быстрее TCP+TLS. QUIC также встроил механизмы, аналогичные тройному рукопожатию, но в рамках шифрованного канала.
SCTP (Stream Control Transmission Protocol)
SCTP, определённый в RFC 4960, использует четырёхэтапное рукопожатие (INIT, INIT-ACK, COOKIE-ECHO, COOKIE-ACK). Это обеспечивает дополнительную защиту от SYN-флуда и позволяет мультиплексировать несколько потоков в одном соединении.
Применение в современных сетях
Тройное рукопожатие остаётся основой TCP-соединений в Интернете. Оно используется во всех приложениях, работающих поверх TCP: HTTP/HTTPS, FTP, SMTP, SSH, WebSocket и других. Даже в HTTP/2 и HTTP/3 (на базе QUIC) сохраняется необходимость в начальной синхронизации, хотя механизмы различаются.
В контексте сетевой безопасности тройное рукопожатие является объектом мониторинга системами обнаружения вторжений (IDS) и межсетевыми экранами. Аномалии в последовательности SYN/SYN-ACK/ACK могут указывать на сканирование портов, DoS-атаки или попытки обхода фильтрации.
Источники
- RFC 793 — Transmission Control Protocol (1981)
- RFC 7413 — TCP Fast Open (2012)
- RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport (2021)
- RFC 4960 — Stream Control Transmission Protocol (2007)
- Стивенс, У. Р. «TCP/IP. Иллюстрированное руководство». Том 1: Протоколы. — М.: Вильямс, 2011.
- Таненбаум, Э., Уэзеролл, Д. «Компьютерные сети». — 5-е изд. — СПб.: Питер, 2012.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →