Уничтожает ли TCP мертвое простое соединение после отправки сохраняемого пакета

#tcp #tcp-keepalive

#tcp #tcp-keepalive

Вопрос:

Мое понимание для TCP keepalive:

Этот keepalive на самом деле не «поддерживает соединение». Вместо этого «detectAlive» может быть более подходящим словом: уровни Tcp обмениваются пакетом сердцебиения, чтобы определить, является ли незанятое соединение мертвым или живым.

Вот мои вопросы:

  1. После того, как TCP узнает, что соединение разорвано, автоматически ли уровень TCP закрывает соединение?
  2. После того, как TCP узнает, что соединение разорвано, как уровень приложения узнает эту информацию? Зная эту информацию, он, таким образом, закрывает сокет и освобождает ресурс

Ответ №1:

После того, как TCP узнает, что соединение разорвано, автоматически ли уровень TCP закрывает соединение?

TCP — это протокол. Он ничего не «знает». Однако конкретная реализация в ОС определит, не может ли TCP-соединение больше обмениваться данными с полезной нагрузкой или без нее (т. Е. Поддерживать работоспособность), и закроет локальное состояние соединения. Это не приведет к закрытию обычного TCP-соединения, которое включает отправку FIN и т. Д., Поскольку Можно предположить, что соединение разорвано.

После того, как TCP узнает, что соединение разорвано, как уровень приложения узнает эту информацию? Зная эту информацию, он, таким образом, закрывает сокет и освобождает ресурс

Это зависит от приложения. Приложению необходимо каким-то образом отслеживать состояние сокета, т.Е. Выполнять запись, чтение, выбор или что-то подобное. После этого эти функции больше не будут блокироваться, и нарушенное состояние соединения может быть определено, например, на основе кода ошибки при чтении / записи или аналогичного. Если приложение вместо этого некоторое время не заботится о сокете, оно осознает проблему только после того, как снова начнет заботиться.