当客户端断开连接后,TCP 连接还能保持打开状态吗?

当客户端断开连接后,TCP 连接还能保持打开状态吗?

我们有一个服务器应用程序,在连接数约为 4000 时面临 TCP 耗尽问题。这种情况大约每 3 或 4 周发生一次。创建此服务器应用程序的供应商在检查 netstat -b 的输出后告诉我们,即使客户端已断开连接,某些连接仍保持打开状态。

我被赋予了调查某个客户端应用程序为何无法正确关闭 TCP 连接的任务。我认为,如果客户端计算机关闭,它就不可能从服务器报告仍与该客户端建立 TCP 连接。不幸的是,我找不到任何信息来验证我的观点。我不想再浪费时间调查一个我认为根本不可能成为问题的潜在问题。

太长不看;

服务器是否可以向已关闭的计算机报告已建立的连接?

答案1

TCP 不会尝试检测死连接,除非在传输数据的一方。这是调用 TCP 堆栈的应用程序代码的责任。这里涉及什么协议?(TCP 之上的协议。)

这是一个非常丑陋的“解决方案”,但你可以启用TCP 保持连接。 有本文包含更多内容

答案2

是的,这是可能的。正如 David 和 Paul 在他们的回答中所述,TCP 中没有机制(除了可选的 TCP 保持活动之外)来检测半开连接。由应用程序供应商确定连接的状态并相应地采取适当的措施。

就 TCP 而言,无法检测或区分半开连接和长空闲连接。

您必须从 OSI 模型的第 1 层(物理)开始排查,直到第 7 层(应用程序),才能找出问题所在。我的建议是,在受影响的客户端之一上安装并运行数据包捕获程序,直到问题发生,然后分析捕获的内容,尝试确定导致客户端无法关闭连接的原因。

答案3

当工作站想要关闭与服务器的连接时,它会发送 TCP FIN。如果客户端行为不正常且未关闭其连接,则这些连接实际上可能仍会保留在服务器上。您可以在服务器上设置打开连接的超时来清除这些连接 - 尽管最好找到原因。打开的连接进入哪个端口?一旦您知道正在访问什么服务,您就可能能够识别正在访问服务器的客户端应用程序。

相关内容