Ответ
TCP использует трехстороннее рукопожатие для установки надежного дуплексного соединения с синхронизацией номеров последовательности (Sequence Numbers). Как DevOps-инженер, я часто анализирую эти пакеты при диагностике проблем с сетевым подключением между сервисами.
Процесс шаг за шагом:
-
SYN (Synchronize)
- Клиент (инициатор) отправляет пакет с флагом
SYN=1. - В пакете устанавливается начальный номер последовательности клиента (Client ISN), например,
Seq=100. Этот номер генерируется случайным образом для безопасности.
- Клиент (инициатор) отправляет пакет с флагом
-
SYN-ACK (Synchronize-Acknowledge)
- Сервер, получив SYN, отвечает пакетом с флагами
SYN=1иACK=1. Acknowledgment Numberсервера устанавливается вClient ISN + 1(т.е.,Ack=101). Это подтверждение получения клиентского SYN.- Сервер также отправляет свой начальный номер последовательности (Server ISN), например,
Seq=300.
- Сервер, получив SYN, отвечает пакетом с флагами
-
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) в приложениях.