#tcp #tcp-keepalive
#tcp #tcp-keepalive
Вопрос:
Мое понимание для TCP keepalive:
Этот keepalive на самом деле не «поддерживает соединение». Вместо этого «detectAlive» может быть более подходящим словом: уровни Tcp обмениваются пакетом сердцебиения, чтобы определить, является ли незанятое соединение мертвым или живым.
Вот мои вопросы:
- После того, как TCP узнает, что соединение разорвано, автоматически ли уровень TCP закрывает соединение?
- После того, как TCP узнает, что соединение разорвано, как уровень приложения узнает эту информацию? Зная эту информацию, он, таким образом, закрывает сокет и освобождает ресурс
Ответ №1:
После того, как TCP узнает, что соединение разорвано, автоматически ли уровень TCP закрывает соединение?
TCP — это протокол. Он ничего не «знает». Однако конкретная реализация в ОС определит, не может ли TCP-соединение больше обмениваться данными с полезной нагрузкой или без нее (т. Е. Поддерживать работоспособность), и закроет локальное состояние соединения. Это не приведет к закрытию обычного TCP-соединения, которое включает отправку FIN и т. Д., Поскольку Можно предположить, что соединение разорвано.
После того, как TCP узнает, что соединение разорвано, как уровень приложения узнает эту информацию? Зная эту информацию, он, таким образом, закрывает сокет и освобождает ресурс
Это зависит от приложения. Приложению необходимо каким-то образом отслеживать состояние сокета, т.Е. Выполнять запись, чтение, выбор или что-то подобное. После этого эти функции больше не будут блокироваться, и нарушенное состояние соединения может быть определено, например, на основе кода ошибки при чтении / записи или аналогичного. Если приложение вместо этого некоторое время не заботится о сокете, оно осознает проблему только после того, как снова начнет заботиться.