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


12

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

我已经完成了调查为什么特定的客户端应用程序无法正确关闭TCP连接的任务。我相信,如果关闭了客户端计算机,则无法从服务器报告仍然与该客户端建立了TCP连接。不幸的是,我找不到任何信息来验证我的观点。我不想再浪费时间来研究一个我认为甚至不会成为问题的潜在问题。

tldr;

服务器可以报告与已关闭计算机的已建立连接吗?

Answers:


13

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

这是一个非常丑陋的“解决方案”,但是您可以启用TCP keepalive。本文还有更多内容


您可能是指TCP所在的传输层之上的层及其会话层。
Rilindo 2011年

1
@Rilindo:实际上,在这种情况下,您有一个应用程序对TCP堆栈进行调用。TCP之上的协议(HTTP,POP或其他协议)通常指定如何执行此操作,因为这些协议的设计者知道TCP本身无法执行此操作。
David Schwartz

哎呀,我的错。然后是它的第7层。
Rilindo

我现在不会启用keepalive,但是知道该选项的存在很方便。该文章似乎暗示已经有2个小时的超时时间了。AFAIK,连接保持开放状态数天/周。
乔什·史密顿

很可能没有启用keepalive。某些代码必须启用它们。听起来,如果应用程序甚至没有启用keepalive且没有超时/收割机制,则该应用程序将被破坏。我们在谈论什么协议?(HTTP?SMTP?FTP?)
David Schwartz

8

对的,这是可能的。正如David和Paul在回答中所指出的那样,TCP中没有检测到半开连接的机制(TCP保持活动除外,TCP保持活动是可选的)。由应用程序供应商确定连接状态并采取相应的措施。

就TCP而言,没有检测到半开连接和长空闲连接之间的区别。

从OSI模型的第1层(物理)到第7层(应用程序),您将必须开始对此进行故障排除,以找出问题出在哪里。我的建议是在一个受影响的客户端上安装并运行一个数据包捕获程序,直到出现问题为止,然后分析捕获以尝试确定是什么原因导致客户端无法关闭连接。


3
或者让供应商实施合理的超时时间:)
Shane Madden

5

当工作站想要关闭与服务器的连接时,它将发送TCP FIN。如果客户端行为不正常且未关闭其连接,则实际上它们仍可以在服务器上保持建立状态。您可以为服务器上的打开连接设置超时以清除这些超时-虽然最好查找原因。开放连接进入哪个端口?一旦知道要访问什么服务,您就可以确定正在访问服务器的客户端应用程序。


我们知道客户是明显的问题。这是我们数百名用户每天使用的桌面应用程序。我假设问题是应用程序崩溃,硬重置或最终任务。我认为在所有这些情况下,服务器都将意识到断开的连接。
Josh Smeaton

4
就服务器而言,除非它从客户端收到FIN或RST,否则连接是打开的。否则,服务器将假定连接仍在建立,但客户端没有要发送的数据。就服务器而言,半开连接和空闲连接之间没有区别。
joeqwerty 2011年

@joeqwerty:是的,但是服务器可以决定不希望无限期地保持打开连接,并且可以实现某些超时/关闭机制。这就是David Schwartz在回答中的意思,即“这是应用程序代码的责任”。因此,服务器可以根据需要在半开连接和空闲连接之间进行区分。但是,对于TCP,半开连接和空闲连接之间确实没有区别。
sleske 2011年

@sleske:同意应用程序代码可以执行此操作,但是TCP除非启用了保持活动状态,否则无法执行。
joeqwerty 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.