Соединение остается помеченным как ESTABLISHED, даже если хост не подключен

Я работаю над встроенным дистрибутивом Linux, и мне нужно отслеживать входящие и исходящие соединения (если они все еще являются активами и т. Д.), И я испытываю проблемы, потому что заметил, что даже если удаленный хост отключит соединение, я вижу Соединение как ESTABLISHED через netstat.

У меня есть две разные версии этой встроенной системы Linux: одна, которая использует старое ядро ​​2.6.34, и оно отлично работает, а в том, что сбой использует ядро ​​3.18.18.

Ищете дополнительную информацию. Я подозреваю, что мне пришлось устанавливать / изменять тайм-ауты TCP , поэтому я настроил их через syctl.conf, но ничего не менял. Система, использующая ядро ​​2.6.34, не имеет настроенных тайм-аутов TCP, поэтому мне кажется, что TCP не является корнем моей проблемы.

Есть ли у вас представление о том, что может быть причиной того, что соединение остается как ESTABLISHED ?

Если хост отключается от другого, и вы все еще видите его соединение как ESTABLISHED , это, вероятно, связано с тем, что он не соблюдает протокол TCP и не закрывает соединение.

Выход netstat является интерпретатором текущего состояния TCP соединений. Если клиент хочет отключить / закрыть сокет, который ранее был открыт и установлен, они должны уведомить об этом в удаленной системе. Это делается при отправке FIN request на другой узел (подробнее здесь ), в данном случае на сервере.

Они не могут этого сделать, клиент действительно отключается, но удаленный сервер продолжает думать, что клиент все еще подключен и, таким образом, сохраняет свое состояние как ESTABLISHED , и именно tcp_keepalive_time параметр tcp_keepalive_time объединяется с этим уравнением. Поскольку никакие дополнительные пакеты не будут получены, ядро ​​будет ждать указанное время для этого параметра, чтобы отключить соединение и принудительно закрыть его.

Вы можете отладить эту проблему с помощью инструмента tcpdump . Вы можете просто прослушать соединение с хостом клиента на стороне сервера и проверить, не отправляет ли запрос FIN .

 tcpdump host XXXX and port Y 
  • Различия между сокетами TCP и веб-сокетами, еще раз
  • Искусственно создать ошибку тайм-аута соединения
  • Могут ли сокеты TCP и UDP использовать один и тот же порт?
  • Как работает функция accept API ()?
  • Какова цель портов?
  • Проверить скрипт оболочки, если удаленный TCP-порт открыт
  • Ethernet против TCP против IP?
  • Как пакеты IP-ответа достигают своего адресата внутри частной локальной сети?
  • Узел js ECONNRESET
  • Что означает «сброс соединения с помощью сверстника»?
  • Как работает прокси?
  • Давайте будем гением компьютера.