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

Трёхэтапное рукопожатие

Трёхэтапное рукопожатие (англ. three-way handshake) — это процедура установления соединения в протоколе управления передачей (TCP), обеспечивающая синхронизацию порядковых номеров (sequence numbers) и подтверждение готовности обеих сторон к обмену данными. Является обязательным этапом перед началом передачи данных в TCP-соединении, гарантируя надёжную связь между отправителем и получателем в сетях с коммутацией пакетов, таких как Интернет.

История и происхождение

Протокол TCP был разработан в 1970-х годах в рамках проекта ARPANET (США) под руководством Винтона Серфа и Роберта Канна. Первоначальная спецификация, опубликованная в 1974 году, не содержала явного описания трёхэтапного рукопожатия; вместо этого использовались более простые механизмы синхронизации. Однако с ростом масштабов сети и необходимостью надёжной передачи данных в условиях потери пакетов и задержек, в 1981 году в RFC 793 (Transmission Control Protocol) была формализована процедура трёхэтапного рукопожатия. Этот стандарт остаётся основой TCP по сей день, хотя в последующие десятилетия вносились уточнения (например, в RFC 1122, 1989 год, и RFC 5681, 2004 год).

В России трёхэтапное рукопожатие используется во всех TCP-соединениях, лежащих в основе работы веб-серверов, электронной почты, файловых протоколов и других сетевых служб. Разработчики российских операционных систем и сетевого оборудования, таких как ОС «Эльбрус» или «Альт Линукс», реализуют стандартный TCP-стек, включающий данную процедуру.

Принцип работы

Трёхэтапное рукопожатие состоит из трёх последовательных шагов, каждый из которых передаёт управляющие флаги в заголовке TCP-сегмента. Основные флаги: SYN (synchronize) — запрос на синхронизацию порядковых номеров, ACK (acknowledgment) — подтверждение получения, и FIN (finish) — завершение соединения. В рукопожатии участвуют две стороны: клиент (инициатор) и сервер (слушатель).

Шаг 1: SYN (Клиент → Сервер)

Клиент отправляет серверу TCP-сегмент с установленным флагом SYN и случайным начальным порядковым номером (ISN, Initial Sequence Number), например, x. Этот сегмент информирует сервер о желании установить соединение и указывает, с какого номера клиент начнёт отсчёт своих данных.

Шаг 2: SYN-ACK (Сервер → Клиент)

Сервер, получив SYN-сегмент, отвечает сегментом с двумя установленными флагами: SYN и ACK. В этом сегменте:

  • Номер подтверждения (ACK number) устанавливается равным x + 1, что означает успешный приём SYN от клиента.
  • Сервер отправляет свой собственный начальный порядковый номер, например, y. Таким образом, сервер подтверждает готовность к обмену данными и синхронизирует свой счётчик.

Шаг 3: ACK (Клиент → Сервер)

Клиент, получив SYN-ACK, отправляет серверу сегмент с установленным флагом ACK. Номер подтверждения в этом сегменте равен y + 1, что подтверждает приём SYN от сервера. После этого соединение считается установленным, и обе стороны могут начинать передачу данных.

Пример числового представления

  • Клиент отправляет SYN с ISN = 100.
  • Сервер отвечает SYN-ACK с ISN = 200 и ACK = 101.
  • Клиент отправляет ACK с номером 201.
  • Соединение установлено; данные передаются, начиная с порядковых номеров 101 (клиент) и 201 (сервер).

Назначение и значение

Трёхэтапное рукопожатие решает несколько ключевых задач в сетевой связи:

  • Синхронизация порядковых номеров: обе стороны согласовывают начальные значения счётчиков, что позволяет корректно собирать пакеты в правильном порядке и обнаруживать потери.
  • Подтверждение готовности: сервер и клиент убеждаются, что противоположная сторона активна и способна принимать данные.
  • Предотвращение дублирования соединений: случайные ISN (часто генерируемые с помощью псевдослучайных алгоритмов) снижают риск конфликтов с предыдущими или параллельными соединениями.
  • Защита от атак типа SYN-flood: хотя рукопожатие само по себе не предотвращает атаки, его механизмы (например, SYN-куки) используются для смягчения последствий.

Виды и модификации

Хотя базовая процедура трёхэтапного рукопожатия остаётся неизменной, в различных реализациях TCP могут применяться вариации:

Ускоренное рукопожатие (TCP Fast Open, TFO)

Предложено в RFC 7413 (2014 год) и позволяет клиенту отправлять данные уже на первом шаге (вместе с SYN), если ранее было установлено соединение с тем же сервером. Это сокращает задержку, но требует сохранения криптографического ключа (TFO cookie) на стороне клиента.

Рукопожатие с нулевым окном (Zero Window)

В редких случаях, когда сервер не может принять данные (например, из-за переполнения буфера), он может отправить SYN-ACK с нулевым размером окна (window size = 0). Клиент в ответ на ACK может приостановить передачу до получения обновления.

Рукопожатие в IPv6

В протоколе IPv6 трёхэтапное рукопожатие TCP работает аналогично IPv4, но с учётом более длинных адресов (128 бит) и возможных расширений заголовков.

Применение

Трёхэтапное рукопожатие используется в любых TCP-соединениях, включая:

  • Веб-серфинг: HTTP/HTTPS-запросы (например, при открытии сайта в браузере).
  • Электронная почта: протоколы SMTP, IMAP, POP3.
  • Файловые передачи: FTP, SFTP.
  • Удалённый доступ: SSH, Telnet.
  • Потоковое видео и аудио: протоколы RTMP, HLS (через TCP).

В России трёхэтапное рукопожатие лежит в основе работы всех государственных и коммерческих интернет-сервисов, включая портал «Госуслуги», системы электронного документооборота и банковские приложения.

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

Несмотря на надёжность, трёхэтапное рукопожатие имеет недостатки:

  • Задержка установления соединения: три шага увеличивают время отклика, особенно на каналах с высокой задержкой (например, спутниковая связь). Для коротких транзакций (например, DNS-запросы) это может быть неэффективно.
  • Уязвимость к атакам SYN-flood: злоумышленник может отправлять множество SYN-сегментов с поддельными адресами, заполняя очередь полуоткрытых соединений на сервере. Для защиты применяются SYN-куки (RFC 4987) и ограничение частоты запросов.
  • Отсутствие шифрования: само рукопожатие не обеспечивает конфиденциальность; для защиты данных используется TLS (Transport Layer Security), который может добавлять свои шаги (например, TLS-рукопожатие поверх TCP).
  • Сложность в мобильных сетях: в условиях частой смены IP-адресов (например, при переходе между вышками сотовой связи) трёхэтапное рукопожатие может приводить к разрывам соединений.

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

  • Трёхэтапное рукопожатие иногда называют «SYN, SYN-ACK, ACK» по названиям флагов.
  • В протоколе UDP (User Datagram Protocol) рукопожатие отсутствует, что делает его быстрее, но менее надёжным.
  • Российские учёные из Института системного программирования РАН в 2010-х годах исследовали оптимизацию TCP-рукопожатия для высокоскоростных сетей, предложив модификации, уменьшающие задержки при передаче больших объёмов данных.
  • В некоторых реализациях TCP (например, в Linux) начальные порядковые номера генерируются с использованием хэш-функций на основе времени и IP-адресов, что затрудняет подделку.

Источники

  • RFC 793 — Transmission Control Protocol (1981).
  • RFC 1122 — Requirements for Internet Hosts — Communication Layers (1989).
  • RFC 7413 — TCP Fast Open (2014).
  • RFC 4987 — TCP SYN Flooding Attacks and Common Mitigations (2007).
  • Стивенс У. Р. «TCP/IP. Иллюстрированное руководство. Том 1: Протоколы» (русский перевод, 2003).
  • Таненбаум Э., Уэзеролл Д. «Компьютерные сети» (5-е издание, 2012).

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

На главную BFOmetr →