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

sim*_*-zz 8 networking linux tcp timeout

我正在开发一个 Linux 嵌入式发行版,我需要监视传入和传出连接(如果它们仍然处于活动状态等)并且我遇到了问题,因为我注意到,即使远程主机关闭连接,我也可以看到通过 netstat建立的连接。

我有这个 Linux 嵌入式系统的两个不同版本:一个使用旧的 2.6.34 内核并且运行良好,而一个失败的使用内核 3.18.18。

寻找更多信息,我怀疑我必须设置/更改TCP 超时,所以我通过 syctl.conf 配置了它们,但没有改变任何内容。使用2.6.34内核的系统没有配置TCP超时,所以这让我觉得TCP不是我问题的根源。

您是否知道连接保持为ESTABLISHED的原因可能是什么?

nKn*_*nKn 2

如果一台主机与另一台主机断开连接,并且您仍然看到其连接为ESTABLISHED,则可能与它不遵守TCP协议并且未彻底关闭连接有关。

输出netstat是当前TCP连接状态的解释器。如果客户端想要断开/关闭先前打开和建立的套接字,他们应该将此通知远程系统。这是将 发送到FIN request其他节点(更多信息请参见此处),在本例中为服务器。

如果他们没有这样做,客户端确实会断开连接,但远程服务器一直认为客户端仍然处于连接状态,因此将其状态保持为ESTABLISHED,这就是tcp_keepalive_time参数加入方程的地方。由于不再收到数据包,内核将等待该参数指定的时间,以使连接超时并强制关闭它。

您可以使用该tcpdump工具调试此问题。您可以简单地监听服务器端客户端主机的连接,并检查它是否无法发送请求FIN

tcpdump host X.X.X.X and port Y
Run Code Online (Sandbox Code Playgroud)