即使主机未连接,连接仍标记为 ESTABLISHED

即使主机未连接,连接仍标记为 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

相关内容