Ответ
Корректный разрыв TCP-соединения происходит по алгоритму «четырехэтапного рукопожатия» (Four-way handshake):
- Сторона, инициирующая закрытие (клиент), отправляет пакет с флагом
FIN. - Вторая сторона (сервер) отправляет
ACKв подтверждениеFIN. - Сервер, когда будет готов, отправляет свой
FIN. - Клиент отправляет
ACKнаFINсервера.
После этого ресурсы соединения освобождаются.
С точки зрения DevOps/администрирования:
- Внезапный обрыв (сбой сети, хост): Система обнаружит это по таймаутам и отсутствию
ACKна повторно отправляемые (ретранслируемые) пакеты. Параметры ретрансмиссии и таймаута (например,tcp_retries2) настраиваются в ядре ОС. - Состояние
TIME_WAIT: Сторона, отправившая финальныйACK, переходит в состояниеTIME_WAIT(удвоенное максимальное время жизни сегмента, 2*MSL). Это необходимо для корректной обработки «заблудившихся» пакетов. В высоконагруженных сервисах это может привести к исчерпанию портов.# Проверить текущие соединения, включая TIME_WAIT ss -tan state time-wait # Настроить параметры для reuse портов (в /etc/sysctl.conf) net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 # Уменьшить время FIN_TIMEOUT