← Назад к вопросам

Как работает трехстороннее рукопожатие TCP?

1.0 Junior🔥 111 комментариев
#Сети и протоколы

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Трехстороннее рукопожатие TCP: установка надежного соединения

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

Основные шаги рукопожатия

Процесс можно детально разобрать по следующим этапам:

  1. SYN (Synchronize) — от клиента к серверу
    *   Клиент отправляет серверу пакет с флагом **SYN=1**.
    *   В этом пакете также устанавливается начальный порядковый номер (**Sequence Number**, например, `ISN_C`), который используется для отслеживания потока данных от клиента.
    *   Клиент переходит в состояние `SYN_SENT`.

  1. SYN-ACK (Synchronize-Acknowledge) — ответ от сервера
    *   Сервер, получив SYN, отправляет ответный пакет с двумя флагами: **SYN=1** и **ACK=1**.
    *   Пакет подтверждает получение клиентского SYN (устанавливает **ACK=1** и поле **Acknowledgement Number** = `ISN_C + 1`).
    *   Сервер также устанавливает свой начальный порядковый номер (**Sequence Number**, например, `ISN_S`).
    *   Сервер переходит в состояние `SYN_RECEIVED`.

  1. ACK (Acknowledge) — подтверждение от клиента
    *   Клиент получает SYN-ACK и отправляет финальный пакет с флагом **ACK=1**.
    *   Этот пакет подтверждает получение серверного SYN (устанавливает поле **Acknowledgement Number** = `ISN_S + 1`).
    *   После этого обе стороны считают соединение установленным (`ESTABLISHED`) и могут начинать передачу данных.

Пример заголовков пакетов в рукопожатии

Вот как выглядит обмен на уровне TCP заголовков (в упрощенном виде):

Клиент (порт 12345) -> Сервер (порт 80)
Packet 1 (SYN):
  Source Port: 12345
  Destination Port: 80
  Sequence Number: 1000 (ISN_C)
  Flags: SYN=1

Сервер (порт 80) -> Клиент (порт 12345)
Packet 2 (SYN-ACK):
  Source Port: 80
  Destination Port: 12345
  Sequence Number: 2000 (ISN_S)
  Acknowledgement Number: 1001 (ISN_C + 1)
  Flags: SYN=1, ACK=1

Клиент (порт 12345) -> Сервер (порт 80)
Packet 3 (ACK):
  Source Port: 12345
  Destination Port: 80
  Sequence Number: 1001
  Acknowledgement Number: 2001 (ISN_S + 1)
  Flags: ACK=1

Почему именно три шага? Значение рукопожатия

Процесс служит нескольким критически важным целям:

  • Согласование параметров соединения: Обе стороны согласовывают начальные порядковые номера (ISN), которые обеспечивают надежную нумерацию и сборку данных, а также предотвращают смещение сегментов из предыдущих соединений.
  • Доказательство готовности и доступности: Каждая сторона получает подтверждение от другой, что гарантирует работоспособность обоих узлов и сетевого пути между ними. Без этого могут возникать "полуоткрытые" соединения.
  • Механизм надежности: Подтверждение (ACK) каждого шага является основой для всей системы подтверждений в TCP, которая обеспечивает надежность передачи данных.
  • Согласование параметров (например, MSS): В пакетах SYN и SYN-ACK также могут передаваться опции TCP, такие как Maximum Segment Size (MSS) для оптимизации передачи.

На практике и в DevOps

Для инженеров, работающих с инфраструктурой, понимание рукопожатия критически важно:

  • Диагностика проблем сети: Задержки или сбои на любом из трех шагов (например, неответ на SYN) указывают на проблемы с сетью, firewall (SYN_RECEIVED), или нагрузкой на сервер.
  • Настройка безопасности: Firewalls и системы защиты (например, SYN flood protection) часто отслеживают состояние рукопожатия для предотвращения атак (например, SYN flood), когда злоумышленник отправляет множество SYN, но не завершает рукопожатие, истощая ресурсы сервера.
  • Мониторинг и анализ трафика: Инструменты типа tcpdump позволяют видеть этот процесс. Например, команда для захвата рукопожатия на порту 80:
sudo tcpdump -i any 'tcp port 80 and (tcp[tcpflags] & (tcp-syn|tcp-ack) != 0)'
  • Оптимизация высоконагруженных систем: Знание этапов соединения помогает правильно настроить параметры системы, такие как таймауты (SYN_RECEIVED), размеры очередей и ограничения на количество полуоткрытых соединений.

Таким образом, трехстороннее рукопожатие — не просто формальный обмен пакетами, а основа надежности и управляемости TCP, напрямую влияющая на производительность и безопасность сетевых сервисов в современной инфраструктуре.