Кратко

  • Зонд TCP Keep-Alive побуждает удалённую сторону ответить на основании сохранённого состояния последовательности; он не проверяет работоспособность приложения.
  • Чистые ACK передаются ненадёжно, поэтому отсутствие ответа на один зонд не доказывает отказ соединения.

Если в течение долгого интервала не приходит ни одного входящего сегмента и нет новых либо неподтверждённых данных для отправки, TCP-соединение может оставаться бездействующим. Это может означать, что исправному приложению нечего передавать, либо скрывать потерю доступности пути или удалённой стороны. Keep-Alive используется на этой границе, чтобы получить ещё одно наблюдение состояния последовательности.

Этот механизм не заменяет повторную передачу. Пока отправленные данные остаются неподтверждёнными, TCP уже использует повторную передачу и User Timeout, чтобы решить, может ли продолжаться доставка. Keep-Alive начинает работать только после того, как соединение во всех остальных отношениях стало бездействующим.

RFC 1122 описывает зонд, для которого обычно используется номер последовательности SND.NXT-1 — непосредственно перед следующим байтом для новых данных. Удалённая сторона, сохранившая состояние TCP, может ответить на его основе. Зонд рекомендуется отправлять без данных. Для ошибочных реализаций, которые неправильно обрабатывают такую форму, может существовать форма совместимости с одним октетом. Это обмен управления транспортом, а не обычное сообщение приложения.

Поддержка Keep-Alive необязательна. При её наличии приложение должно уметь включать и выключать её для каждого соединения, а по умолчанию эта возможность должна быть выключена. Зонд разрешено отправлять только при отсутствии отправленных данных, ожидающих подтверждения, и при отсутствии данных или подтверждений за заданный интервал. Интервал должен настраиваться, а нормативное значение по умолчанию должно быть не меньше двух часов.

RFC 9293 сохраняет главное ограничение RFC 1122: сегменты, состоящие только из ACK, TCP передаёт ненадёжно. Удалённая сторона может получить зонд и сформировать ответный ACK, но это подтверждение может потеряться в пути. Поэтому отсутствие ответа на конкретный зонд само по себе не является доказательством отказа. Объединённая спецификация также не превратила Keep-Alive в универсальную службу проверки доступности.

Источники