TCP套接字没有连接超时

ogg*_*ter 40 networking network-programming timeout tcp

我打开一个TCP套接字并将其连接到网络上其他位置的另一个套接字.然后,我可以成功发送和接收数据.我有一个计时器,每秒钟向套接字发送一些东西.

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

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

Bri*_*ite 67

拉网络电缆不会破坏TCP连接(1),但会中断通信.您可以重新插入电缆,一旦建立IP连接,所有后向数据都将移动.这就是使TCP可靠的原因,即使在蜂窝网络上也是如此.

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

经过一定数量的重传或一些没有ACK的总时间后,TCP会认为连接"已损坏".多少次或多长时间取决于您的操作系统及其配置,但通常会在很多分钟的时间内超时.

从Linux的tcp.7手册页:

   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.
Run Code Online (Sandbox Code Playgroud)

这可能是您需要调整的值,以更改检测连接是否消失所需的时间.

(1)有例外.操作系统在注意到电缆被移除时,可以通知上层所有连接应被视为"损坏".