Кратко

  • TCP называет соединение полуоткрытым, когда одна сторона потеряла или удалила состояние, а другая об этом не знает.
  • Если сторона, сохранившая состояние ESTABLISHED, отправляет данные, сторона без состояния отвечает RST и прерывает старое состояние.
  • После перезагрузки новый SYN может столкнуться с прежним состоянием соединения, сохранённым другой стороной; несовместимый ACK приводит к RST.
  • RST не восстанавливает данные и не создаёт прежнее соединение заново: он удаляет устаревшее состояние для нового рукопожатия.

Одно соединение, две памяти

Каждая сторона TCP хранит номера последовательности, подтверждения, окна и позицию в конечном автомате. Соединение остаётся общим лишь до тех пор, пока состояния обеих сторон совместимы.

RFC 793 и RFC 9293 называют соединение полуоткрытым, если одна сторона закрыла его или прервала без ведома другой либо сбой и перезагрузка привели к потере памяти и рассинхронизации. Это не обычное полузакрытие: FIN намеренно закрывает одно направление, оставляя другое доступным; полуоткрытое состояние возникает из-за случайного расхождения.

Когда первой говорит сохранившая состояние сторона

Пусть B всё ещё считает соединение установленным и отправляет данные. Узел A перезагрузился, находится в CLOSED и не имеет соответствующего состояния. Он считает сегмент принадлежащим несуществующему соединению и отправляет RST. B принимает сброс и отбрасывает устаревшее соединение.

RST не сообщает, какие данные были обработаны до сбоя и завершилась ли операция приложения. Он лишь показывает, что A больше не может участвовать в соединении, состояние которого сохранил B.

Когда забывшая сторона начинает заново

После перезагрузки узел A может отправить новый SYN. B всё ещё хранит старое соединение и видит, что SYN находится вне соответствующего окна приёма. В ответ B посылает ACK с ожидаемым номером последовательности. Узел A рассинхронизирован и понимает, что этот ACK не подтверждает ничего из новой попытки; он отправляет RST. B удаляет старое состояние, после чего узел A может продолжить обычное трёхстороннее рукопожатие.

TCP не объединяет несовместимые состояния. Он завершает то, которое стороны уже не могут разделять.

Граница транспортного уровня

RST делает конфликт состояния явным, но не возвращает потерянные байты, аутентификацию, сеанс или транзакцию. Восстановление относится к более высоким протоколам и приложениям. Эти примеры также не являются закрытием FIN, обязательным keepalive или механизмом challenge-ACK из RFC 5961.

Источники