【问题标题】:What happens in a TCP connection if the receiving process stops or suspends?如果接收进程停止或挂起,TCP 连接会发生什么?
【发布时间】:2012-11-07 17:03:57
【问题描述】:

例如,在 TCP Tahoe 连接中,如果发生大文件传输。突然接收进程或主机被关闭或挂起,我知道我们将有一个超时,此时窗口大小将被重置等。据我了解,我们将重新发送未确认的数据包,然后再试一次,并可能再次?

我想知道,在这样的超时之后,在假定接收器不再存在并且数据将停止发送之前,数据将被重新发送多少次。如果进程从挂起状态恢复,它是否能够继续接收数据?

我知道在三次重复确认或超时后会重新传输数据。但是,如果多次重传失败,或者接收进程突然停止接收,我找不到太多可阅读的内容。

【问题讨论】:

    标签: networking tcp


    【解决方案1】:

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

    如果接收主机干净关闭,它应该杀死所有进程,这将导致上述情况发生。

    如果接收主机和进程处于活动状态,但进程处于挂起状态(例如 Ctl-z),则在 TCP 级别不会检测到问题。窗口最终会填满,但接收系统将继续确认零窗口探测。要检测这种情况,就需要应用层的keepalive机制。

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

    如果接收系统在超时发生之前重启,它会以RST包响应下一次重传,这将导致ECONNRESET错误。

    【讨论】:

    • 如果接收器断电,我认为 send() 会立即返回 -1 并获得 SIGPIPE?在此之前会发生重传吗?
    • @BinTAN-Victor send() 怎么会在这种情况下立即返回?知道接收器已关闭的唯一方法是等待确认超时。这需要一两分钟,因为它会在放弃之前重新传输几次。
    • 谢谢它现在对我有意义。如果接收器关闭,阻塞的 send() 是否会立即返回?
    • 如果启用了 TCP keepalive,并且自上次传输触发它们以来已经足够长的时间,堆栈可能已经检测到超时。然后下一次发送将立即返回 ECONNRESET。
    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2021-10-14
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多