Соединение остается помеченным как ESTABLISHED, даже если хост не подключен
Я работаю над встроенным дистрибутивом Linux и мне нужно отслеживать входящие и исходящие соединения (если они все еще активны и т. Д.), И у меня возникают проблемы, потому что я заметил, что даже если удаленный хост отключает соединение, я могу видеть Соединение как установлено через netstat.
У меня есть две разные версии этой встроенной системы Linux: одна, которая использует старое ядро 2.6.34, и она работает нормально, а другая, которая не работает, использует ядро 3.18.18.
В поисках дополнительной информации, я подозреваю, мне пришлось установить / изменить тайм-ауты TCP, поэтому я настроил их через syctl.conf, но ничего не изменил. Система, которая использует ядро 2.6.34, не имеет настроенных тайм-аутов TCP, поэтому я думаю, что TCP не является корнем моей проблемы.
У вас есть представление о том, что может быть причиной того, что соединение остается установленным?
1 ответ
Если хост отключается от другого, и вы по-прежнему видите его соединение как ESTABLISHED
это, вероятно, связано с тем, что TCP
протокол и не закрытие соединения чисто.
netstat
вывод является интерпретатором текущего состояния TCP
соединения. Если клиент хочет отключить / закрыть ранее открытый и установленный сокет, он должен уведомить об этом удаленную систему. Это сделано отправка FIN request
на другой узел (подробнее здесь), в данном случае, на сервер.
Если они этого не делают, клиент действительно отключается, но удаленный сервер продолжает думать, что клиент все еще подключен и, таким образом, сохраняет свое состояние как ESTABLISHED
и вот где tcp_keepalive_time
параметр присоединиться к уравнению. Поскольку дальнейшие пакеты не будут получены, ядро будет ожидать указанное время для этого параметра, чтобы установить время ожидания соединения и принудительно закрыть его.
Вы можете устранить эту проблему, используя tcpdump
инструмент. Вы можете просто прослушать соединение с клиентского хоста на стороне сервера и проверить, не удается ли отправить FIN
запрос.
tcpdump host X.X.X.X and port Y