客户端断开连接时TCP连接是否可以保持打开状态?

我们有一个服务器应用程序,它面临大约4000个连接的TCP耗尽问题。 这将每3或4周(大约)发生一次。 创build此服务器应用程序的供应商在检查netstat -b的输出后告诉我们,即使客户端已经丢失,某些连接仍处于打开状态。

我已经被赋予了调查为什么特定的客户端应用程序没有正确closuresTCP连接的任务。 我相信,如果客户端计算机被closures,它不能从服务器报告与该客户端build立了TCP连接。 不幸的是,我找不到任何信息来validation我的观点。 我不想浪费更多的时间来调查一个我认为不成问题的潜在问题。

tldr;

服务器可以向已closures的计算机报告build立的连接吗?

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

这是一个可怕的“解决scheme”,但你可以启用TCP Keepalive 。 这篇文章还有更多 。

是的,这是可能的。 正如David和Paul在他们的回答中指出的那样,TCP中没有任何机制(除了可选的TCP保留)以检测半开连接。 由应用程序供应商决定连接的状态并相应采取适当的行动。

就TCP而言,在半开连接和长空闲连接之间没有检测或区分。

您将不得不从OSI模型的第1层(物理)到第7层(应用程序)开始进行故障排除,以确定问题发生的位置。 我的build议是在受影响的客户端上安装并运行一个数据包捕获程序,直到问题发生,然后分析捕获以确定是什么导致客户端不closures连接。

当工作站想要closures与服务器的连接时,它会发送一个TCP FIN。 如果客户端的行为不正常,而且没有closures连接,那么他们实际上可以在服务器上build立起来。 您可以在服务器上设置打开连接的超时时间,以清理这些连接 – 尽pipefind原因会更好。 什么港口是开放的连接进入? 一旦你知道什么服务被访问,你可能能够识别到达服务器的客户端应用程序。