Соединение остается помеченным как 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
Другие вопросы по тегам