Кратко

  • Таймер повторной передачи определяет момент следующей попытки, а USER TIMEOUT — момент разрыва соединения.
  • RFC 5482 передаёт предпочтение другого узла, но локальные границы и CHANGEABLE сохраняют окончательное решение.

У повторной передачи и отказа разные часы

Если подтверждение для переданных данных не приходит, таймер повторной передачи может истечь. TCP снова отправляет сегмент из начала очереди и запускает таймер заново. Это не означает, что приложение готово хранить соединение сколько угодно.

USER TIMEOUT отвечает на другой вопрос: как долго переданные данные могут оставаться недоставленными? RFC 793 описывал этот параметр как локально заданный предел TCP. RFC 9293 прямо различает события. Истечение таймера повторной передачи отправляет первый ожидающий сегмент и переинициализирует таймер. Событие USER TIMEOUT очищает очереди, сообщает об отказе, удаляет TCB и переводит соединение в CLOSED.

Поэтому две шкалы времени могут привести к разным решениям без противоречия. Новая передача ещё может быть технически возможна, когда местный предел ожидания уже достигнут. RTO подстраивает ритм попыток под наблюдаемые задержки и неопределённость потерь. USER TIMEOUT выражает, как долго оправдано сохранять состояние, память и неопределённость для приложения.

Это также не тайм-аут запроса приложения. Приложение может отменить одну операцию, сохранив соединение, либо потребовать завершить само соединение, если ожидаемые данные уже нельзя доставить.

Предложение в секундах или минутах

Изначально тайм-аут был локальным. Один узел не знал, как долго другой хочет сохранять соединение после сбоя. RFC 5482 ввёл опцию TCP User Timeout, чтобы сделать такое ожидание видимым.

Опция имеет Kind 28 и Length 4. Один бит гранулярности выбирает секунды или минуты, а остальные 15 бит несут предложенный интервал. Можно выразить значение от одной секунды до более чем девяти часов либо от одной минуты до более чем 22 дней.

Это рекомендация для другой стороны, а не удалённая команда разорвать соединение. Абстрактное состояние RFC 5482 включает USER_TIMEOUT, ADV_UTO, ENABLED и CHANGEABLE. ENABLED по умолчанию выключен и управляет отправкой и обработкой опции. CHANGEABLE определяет, может ли полученная рекомендация изменить локальный тайм-аут.

Если приложение зафиксировало значение, а CHANGEABLE имеет значение false, полученная опция не может его заменить. TCP всё же должен уведомить приложение о предложении другой стороны. Передаётся информация, но не полномочия.

Границы защищают ресурсы

Реализация должна установить локальные верхнюю и нижнюю границы. Слишком короткое значение может преждевременно завершить соединение на медленном или временно повреждённом маршруте. Слишком длинное удерживает буферы и состояние и повышает риск исчерпания ресурсов. Помочь могут аутентификация и ограничения для отдельных узлов.

Отсутствие UTO не доказывает отсутствие USER TIMEOUT. Реализация без поддержки может молча проигнорировать опцию, а ограниченное пространство TCP-опций может не позволить её передать. Межсетевой экран также способен удалить своё состояние раньше конечных узлов. Захват трафика показывает предложение в конкретной точке, но не его принятие и не срок хранения состояния посредником.

Если одновременно включены keepalive и UTO, таймер keepalive должен быть больше принятого USER_TIMEOUT. Keepalive проверяет живость простаивающего соединения, а USER TIMEOUT ограничивает сохранение недоставленных данных.

Исторический шаг RFC 5482 был осторожным: локальная политика стала видимой ограниченной рекомендацией, но окончательное право на разрыв не перешло к другой стороне.

Источники