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

Как TCP устанавливает соединение

1.3 Junior🔥 251 комментариев
#Linux и администрирование#Сети и протоколы

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

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

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

Процесс установки соединения TCP (TCP Handshake)

TCP (Transmission Control Protocol) использует механизм **«трёхстороннего рукопожатия»** (Three-way Handshake) для установки надежного соединения между клиентом и сервером. Этот процесс гарантирует, что обе стороны готовы к передаче данных и согласовали начальные параметры.

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

Процесс состоит из трёх этапов, в которых участвуют два типа TCP-сегментов: с установленными флагами SYN (Synchronize) и ACK (Acknowledgement).

1. SYN (от клиента к серверу)

Клиент, желающий установить соединение, отправляет серверу сегмент с:

  • Флагом SYN=1, указывающим на запрос синхронизации (начало соединения).
  • Случайно выбранным начальным номером последовательности (Sequence Number) клиента. Например, Seq=1000. Это число будет использоваться для отслеживания порядка байтов данных от клиента.
# Пример в упрощенном виде (не реальный код, а логика)
Client -> Server: TCP Segment [Flags: SYN | Seq: 1000]

2. SYN-ACK (ответ сервера)

Сервер, получивший SYN, отвечает сегментом с двумя флагами:

  • SYN=1, подтверждая своё согласие на соединение и также отправляя свой собственный начальный номер последовательности.
  • ACK=1, подтверждая успешное получение SYN от клиента. В поле Acknowledgement Number сервер указывает Seq клиента + 1 (например, Ack=1001), что означает: «Я получил ваш Seq=1000 и ожидаю следующий байт с номером 1001».
Server -> Client: TCP Segment [Flags: SYN, ACK | Seq: 5000, Ack: 1001]

3. ACK (финальное подтверждение от клиента)

Клиент завершает рукопожатие, отправляя сегмент с:

  • Флагом ACK=1. В поле Acknowledgement Number он указывает Seq сервера + 1 (например, Ack=5001), подтверждая получение SYN от сервера.
  • На этом этапе флаг SYN уже не устанавливается.
Client -> Server: TCP Segment [Flags: ACK | Seq: 1001, Ack: 5001]

После этого третьего шага соединение считается полностью установленным (ESTABLISHED). Обе стороны знают начальные номера последовательности друг друга (1001 у клиента и 5001 у сервера для последующих ACK) и могут начинать передачу данных.

Ключевые цели и особенности процесса

  • Согласование номеров последовательности: Это фундаментально для надежности TCP. Номера позволяют:
    *   Упорядочивать полученные байты.
    *   Выявлять потерянные сегменты (по отсутствующим номерам).
    *   Отправлять подтверждения (ACK) о получении.
  • Гарантия двусторонней готовности: Сервер не начинает тратить ресурсы на соединение до получения финального ACK от клиента.
  • Защита от устаревших или повторных SYN-сегментов: Использование случайных начальных номеров последовательности помогает избежать конфликтов и проблем, если в сети «застрял» старый SYN-сегмент от предыдущей попытки соединения.

Практический взгляд DevOps/SRE

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

  • Диагностике сетевых проблем: Зависшие соединения в состоянии SYN_SENT или SYN_RECEIVED в выводе netstat или ss указывают на проблемы с рукопожатием (например, фильтрацию SYN-пакетов firewallом).
  • Тюнинге производительности: Параметры, такие как tcp_syn_retries (число попыток отправки SYN) или использование TCP Fast Open, напрямую влияют на скорость установки соединения и нагрузку на сервисы, особенно под высоким RPS (Requests Per Second).
  • Анализе безопасности: Атаки типа SYN Flood пытаются истощить ресурсы сервера, отправляя множество SYN-запросов без завершения рукопожатия. Механизмы защиты (SYN cookies, ограничения в iptables/nftables) построены на глубоком понимании этого этапа.
# Пример команды для мониторинга состояний TCP соединений
$ ss -tn state syn-sent
$ netstat -tn | grep SYN_SENT

Таким образом, трёхстороннее рукопожатие — это не просто теоретический алгоритм, а основа функционирования и диагностики практически любого сетевого сервиса в современной инфраструктуре.