我打开一个 TCP 套接字并将其连接到网络上其他位置的另一个套接字。然后我就可以成功发送和接收数据。我有一个计时器,每秒向套接字发送一些内容。
然后,我通过强行断开连接(在本例中拔出以太网电缆)来粗暴地中断连接。我的套接字仍然报告它每秒都在成功写出数据。这种情况持续大约 1 小时 30 分钟,最终出现写入错误。
什么指定了套接字最终接受另一端的超时消失了?是操作系统(Ubuntu 11.04)、TCP/IP 规范还是套接字配置选项?
拉动网络电缆不会中断 TCP 连接(1),但会中断通信。您可以重新插入电缆,一旦建立 IP 连接,所有后台数据都会移动。这就是 TCP 可靠的原因,即使在蜂窝网络上也是如此。
当 TCP 发送数据时,它期望得到 ACK 回复。如果在一段时间内没有收到任何数据,它将重新传输数据并再次等待。传输之间等待的时间通常呈指数增长。
经过一定次数的重传或在一定时间后没有收到 ACK,TCP 将认为连接“已断开”。多少次或多长时间取决于您的操作系统及其配置,但通常会超时大约几分钟。
来自 Linux 的tcp.7 手册页 http://www.kernel.org/doc/man-pages/online/pages/man7/tcp.7.html:
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) 也有例外情况。操作系统在注意到电缆被移除后,可以通知上层所有连接都应被视为“断开”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)