Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → TCP-рукопожатие и закрытие соединения

TCP-рукопожатие и закрытие соединения: этапы и состояния

Установка и закрытие TCP-соединения: этапы рукопожатия, состояние ожидания, влияние на повторные подключения и диагностика по состояниям.

Прямой ответ

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

Этап Пакеты Состояние
Установка SYN, SYN-ACK, ACK ESTABLISHED
Закрытие FIN, ACK, FIN, ACK TIME_WAIT у закрывающей стороны
# Состояния соединений
ss -tan state established
ss -tan state time-wait | wc -l

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

Состояние ожидания и повторные подключения

Сторона, первой отправившая завершение, переходит в состояние ожидания, поэтому два аспекта влияют на повторные подключения.

Длительность состояния. Соединение удерживается в состоянии ожидания, чтобы запоздавшие сегменты прежнего соединения не были приняты новым. Длительность определяется удвоенным максимальным временем жизни сегмента.

Исчерпание локальных портов. Каждое соединение занимает локальный порт, поэтому большое число соединений в состоянии ожидания сокращает число доступных портов для новых подключений.

Практическое следствие: частое создание и закрытие соединений приводит к накоплению состояний ожидания, поэтому повторное использование соединения сокращает их число.

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

Три признака проблемы с состояниями соединений.

Большое число состояний ожидания. Локальные порты исчерпываются, поэтому новые подключения не устанавливаются.

Отсутствие повторного использования соединения. Каждое обращение выполняет рукопожатие, поэтому время запроса включает время установки.

Задержка обнаружения разрыва. Соединение, разорванное без уведомления, остаётся открытым до обнаружения. О механизме — в статье про TCP keepalive.

Влияние рукопожатия на время первого запроса

Установка соединения добавляет задержку к первому запросу по соединению, поэтому стоимость рукопожатия учитывается при проектировании обращений.

Один цикл обмена на установку. Установка требует обмена тремя пакетами, поэтому время установки составляет полтора цикла обмена между узлами. При высокой задержке доля установки в общем времени запроса заметна.

Согласование защиты поверх установки. При использовании защищённого соединения добавляется обмен параметрами защиты, поэтому время до передачи данных увеличивается ещё на несколько циклов.

Повторное использование соединения. Установленное соединение переиспользуется, поэтому последующие запросы не включают этапы установки и согласования.

Практическое следствие: при малом объёме передаваемых данных время установки составляет значительную долю общего времени запроса, поэтому повторное использование соединения сокращает общее время.

Практика: работа с жизненным циклом соединения

1. Используйте повторное соединений. Переиспользование исключает рукопожатие и состояние ожидания.

2. Контролируйте число состояний ожидания. Накопление сокращает число доступных локальных портов.

3. Проверяйте состояния через системные утилиты. Перечень соединений с состояниями показывает распределение по этапам жизненного цикла.

4. Учитывайте время установки соединения. Рукопожатие добавляет задержку к первому запросу, поэтому повторное использование сокращает общее время.

5. Закрывайте соединения явно. Соединение, не закрытое приложением, удерживается до обнаружения разрыва.

6. Проверяйте поведение при частых подключениях. Накопление состояний ожидания указывает на отсутствие повторного использования.

7. Учитывайте ограничение на число портов. Диапазон локальных портов ограничен, поэтому исчерпание препятствует новым подключениям.

Рекомендации:

  1. Различайте установку и закрытие по стоимости. Установка требует обмена тремя пакетами, закрытие — четырьмя, поэтому каждое соединение занимает время.
  2. Учитывайте длительность состояния ожидания. Соединение удерживается после закрытия, поэтому порт не освобождается сразу.
  3. Проверяйте распределение состояний. Большое число состояний ожидания указывает на частое создание соединений.
  4. Фиксируйте способ закрытия. Явное закрытие исключает удержание соединения до обнаружения разрыва.
  5. Пересматривайте при изменении частоты обращений. Рост числа обращений увеличивает число состояний ожидания.

Практический сценарий: новые подключения не устанавливались

Контекст: приложение перестало устанавливать новые подключения к внешнему сервису, при этом существующие работали.

  1. Диагностика. Перечень соединений показал большое число состояний ожидания. Диапазон локальных портов был исчерпан, поэтому новое подключение не могло занять порт.
  2. Причина. Соединение создавалось для каждого обращения и закрывалось после получения ответа. Повторное использование не применялось, поэтому число состояний ожидания росло пропорционально числу обращений.
  3. Действия. (а) Включили пул соединений, чтобы соединение переиспользовалось для нескольких запросов; (б) сократили число создаваемых соединений, поскольку один запрос больше не требовал отдельного подключения; (в) проверили распределение состояний после изменения и убедились в сокращении числа состояний ожидания; (г) добавили контроль числа соединений как метрику; (д) зафиксировали правило: внешние обращения выполняются через пул.
  4. Результат. Новые подключения устанавливаются, поскольку число состояний ожидания сократилось.

Вывод: частое создание и закрытие соединений приводит к накоплению состояний ожидания и исчерпанию локальных портов. Повторное использование соединения сокращает число состояний и исключает исчерпание.

FAQ

Сколько пакетов требуется для установки соединения? Три: запрос установки, подтверждение с согласием, подтверждение получения. После обмена соединение переходит в установленное состояние.

Почему соединение остаётся в состоянии ожидания после закрытия? Чтобы запоздавшие сегменты прежнего соединения не были приняты новым. Длительность определяется удвоенным максимальным временем жизни сегмента.

Как сократить число состояний ожидания? Повторным использованием соединения, поскольку переиспользование исключает закрытие после каждого запроса.

Как проверить распределение состояний? Системной утилитой, показывающей перечень соединений с состояниями. Большое число состояний ожидания указывает на частое создание соединений.

Источники: RFC 9293, ss man page, tcp man page — ссылки в шапке.