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

«Как работает трехстороннее рукопожатие (TCP handshake)?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TCP использует трехстороннее рукопожатие для установки надежного дуплексного соединения с синхронизацией номеров последовательности (Sequence Numbers). Как DevOps-инженер, я часто анализирую эти пакеты при диагностике проблем с сетевым подключением между сервисами.

Процесс шаг за шагом:

  1. SYN (Synchronize)

    • Клиент (инициатор) отправляет пакет с флагом SYN=1.
    • В пакете устанавливается начальный номер последовательности клиента (Client ISN), например, Seq=100. Этот номер генерируется случайным образом для безопасности.
  2. SYN-ACK (Synchronize-Acknowledge)

    • Сервер, получив SYN, отвечает пакетом с флагами SYN=1 и ACK=1.
    • Acknowledgment Number сервера устанавливается в Client ISN + 1 (т.е., Ack=101). Это подтверждение получения клиентского SYN.
    • Сервер также отправляет свой начальный номер последовательности (Server ISN), например, Seq=300.
  3. ACK (Acknowledge)

    • Клиент отправляет финальный пакет с флагом ACK=1.
    • Acknowledgment Number клиента устанавливается в Server ISN + 1 (т.е., Ack=301), подтверждая получение серверного SYN.

После этого соединение считается установленным (ESTABLISHED). Обе стороны знают, что их партнер готов к приему данных, и им известны начальные номера последовательностей для отслеживания порядка пакетов.

Практический пример анализа в tcpdump:

sudo tcpdump -i any -nn 'tcp port 80 and host 192.168.1.100'

Вывод может выглядеть так:

10:00:01.123 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 123456789, ...
10:00:01.124 IP 93.184.216.34.80 > 192.168.1.100.54321: Flags [S.], seq 987654321, ack 123456790, ...
10:00:01.124 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [.], ack 987654322, ...

[S] = SYN, [S.] = SYN-ACK, [.] = ACK.

Зачем это нужно в DevOps?

  • Диагностика: Если SYN уходит, а SYN-ACK не приходит — проблема с фаерволом, маршрутизацией или сервисом на целевом порту.
  • Настройка: Понимание handshake помогает правильно конфигурировать правила сетевых политик (например, в iptables или облачных Security Groups), разрешающие не только установку соединения, но и обратный трафик.
  • Производительность: Каждое новое TCP-соединение добавляет задержку (RTT) на handshake, что обосновывает использование пулов соединений (connection pooling) в приложениях.