Кратко

  • TIME-WAIT сохраняет состояние после закрытия, чтобы задержанные сегменты прежнего соединения не были приняты за сегменты нового соединения с тем же четырёхкомпонентным идентификатором.
  • RFC 1337 описал цепочку: неприемлемый старый сегмент вызывает ACK, узел без соответствующего соединения отвечает RST, а RST преждевременно удаляет TIME-WAIT.
  • Предложение игнорировать RST в TIME-WAIT содержится в Informational RFC и не является универсальным требованием для современных реализаций.
  • RFC 6191 допускает отдельные случаи раннего повторного использования только тогда, когда временные метки и номера последовательности подтверждают новый экземпляр соединения.

Состояние, которое хранит историю

После активного закрытия TCP обычно удерживает блок управления в течение 2×MSL. За это время старые дубликаты должны исчезнуть до повторного использования тех же адресов и портов. TIME-WAIT не задаёт повторные передачи и не ограничивает доставку приложению: оно разделяет поколения соединения.

Как состояние уничтожается

В примере RFC 1337 узел A находится в TIME-WAIT, а узел B уже перешёл в CLOSED. К A приходит старый сегмент данных или ACK, признанный неприемлемым. A отправляет ACK с текущими ожиданиями. У B нет соответствующего соединения, поэтому он отвечает RST. A принимает RST, удаляет блок управления и покидает TIME-WAIT раньше времени.

Каждое действие может быть локально корректным. Опасной становится их композиция: RST удаляет память, которая должна была удерживать старые дубликаты. Последующее нарушение может вызвать уже другой старый пакет, а не сам RST.

Простое исправление и проверяемое повторное использование

F1 из RFC 1337 предлагало игнорировать RST в TIME-WAIT. Документ называл это простым краткосрочным решением при соблюдении MSL и требовал длительных производственных испытаний. В базовой обработке RFC 9293 по-прежнему указано, что проверенный RST в TIME-WAIT переводит соединение в CLOSED и удаляет блок управления. Поэтому нельзя утверждать, что F1 целиком стало универсальным правилом.

RFC 6191 решает проблему высокой скорости установления иначе. Для входящего SYN проверяются временные метки и номера последовательности; при недостатке доказательств SYN молча отбрасывается, а TIME-WAIT сохраняется. RFC 9293 допускает прямое повторное открытие только при выполнении защитных условий для номера последовательности и возврате в TIME-WAIT, если SYN окажется старым дубликатом; для высокой частоты соединений он рекомендует алгоритм временных меток RFC 6191. Удаление состояния не доказывает безопасность нового экземпляра соединения.

Источники