2012-10-26 153 views
28

我打开一个TCP套接字并将它连接到网络上其他地方的另一个套接字。然后,我可以成功发送和接收数据。我有一个计时器,每秒钟都会向套接字发送一些内容。TCP套接字无连接超时

然后粗暴地断开连接,强行断开连接(在这种情况下拉出以太网电缆)。我的套接字仍在报告说它正在成功地每秒钟写出数据。这将持续大约1小时30分钟,最终会出现写入错误。

什么指定了套接字最终接受另一端的超时时间已经消失?它是操作系统(Ubuntu 11.04),它是来自TCP/IP规范还是套接字配置选项?

+2

也许[this](http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux)为您提供了答案。 – SKi

回答

49

拉动网线不会中断TCP连接(1),尽管它会中断通信。您可以重新插入电缆,一旦IP连接建立,所有的后台数据都会移动。这使得TCP可靠,甚至在蜂窝网络上也是如此。

当TCP发送数据时,它期待一个ACK的回复。如果没有人在一定的时间内到达,它会重新传输数据并再次等待。在传输之间等待的时间通常呈指数增长。

经过一定次数的重传或一定数量的无ACK的总时间后,TCP会认为连接“断开”。多少次或多长时间取决于您的操作系统及其配置,但通常会在几分钟内超时。

从Linux的tcp.7 man page

tcp_retries2 (integer; default: 15; since Linux 2.2) 
      The maximum number of times a TCP packet is retransmitted in 
      established state before giving up. The default value is 15, which 
      corresponds to a duration of approximately between 13 to 30 minutes, 
      depending on the retransmission timeout. The RFC 1122 specified 
      minimum limit of 100 seconds is typically deemed too short. 

这可能是你要适应变化需要多长时间来检测,如果你的连接已经消失的值。

(1)也有例外。操作系统在注意到电缆被移除后可以通知上层所有连接应被视为“断开”。

+1

这是非常有用的谢谢你的答案! – corvid

+0

我每天都会做成千上万个Http请求,现在我在Websockets(nodejs)工作,所以自然我想知道更多关于好老套接字的知识,现在我明白了SocketsWork是多么的美妙。 可靠,面向连接和主机的特定协议,因为这就是为什么没有。的重试取决于操作系统! –