如果接收进程停止或暂停,TCP连接会发生什么?

5
例如,在TCP Tahoe连接中,如果正在进行大文件传输。突然,接收进程或主机关闭或暂停,我知道我们会有一个超时,在此时窗口大小将被重置等。据我所知,我们会重新发送未确认的数据包,然后再次尝试发送,可能会重复多次?
然而,我想知道,在这样的超时之后,数据会被重新发送多少次,才会假定接收方不再存在,并停止发送数据。如果进程从暂停状态恢复,它是否能够继续接收数据?
我知道在三次重复确认或超时后会重新传输数据。然而,我无法找到更多关于多个重新传输失败会发生什么,或者如果接收进程突然停止接收的信息。
1个回答

12

如果接收进程退出或被杀死,则其端口的套接字将被关闭。当发送方继续发送数据包时,会提示RST数据包,这会立即导致错误(ECONNRESET)。

如果接收主机正常关闭,则应该终止所有进程,这将导致上述情况发生。

如果接收主机和进程处于活动状态,但进程暂停(例如,Ctl-z),TCP层不会检测到问题。窗口最终将填满,但接收系统将继续确认零窗口探测。要检测此情况,需要一个应用程序层保持活动机制。

如果接收主机崩溃、断电或其网络连接失败,则重传超时变得相关。重传次数和频率取决于实现,并且还可以由系统配置参数进行控制。我不知道典型参数是什么。

如果接收系统在超时之前重新启动,则它将使用RST数据包响应下一个重传,这会导致ECONNRESET错误。


如果接收方失电,我认为send()会立即返回-1并收到一个SIGPIPE信号吗?在此之前会发生重新传输吗? - Bin TAN - Victor
@BinTAN-Victor 当这种情况发生时,send()如何立即返回?唯一知道接收方已关闭的方法是等待确认超时。在放弃之前,它会重新传输多次,因此需要一两分钟的时间。 - Barmar
谢谢,我现在明白了。如果接收者宕机,阻塞的 send() 会立即返回吗? - Bin TAN - Victor
如果启用了TCP keepalives,并且自上次传输以来已经过了足够长的时间以触发它们,那么堆栈可能已经检测到超时。然后下一次发送将立即返回ECONNRESET。 - Barmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接