【问题标题】:What happens to a TCP packet if the server is terminated?如果服务器终止,TCP 数据包会发生什么?
【发布时间】:2010-10-07 09:00:11
【问题描述】:

我知道 TCP 非常可靠,发送的任何内容都可以保证到达目的地。但是如果一个数据包被发送,但是它到达服务器之前,服务器宕机了会发生什么?报文发送成功的确认是在数据包最初发送时服务器存在,还是在数据包成功到达服务器时触发?

基本上我要问的是 - 如果服务器在发送和接收数据包之间发生故障,客户端会知道吗?

【问题讨论】:

    标签: tcp


    【解决方案1】:

    这真的没关系,但这里有一些更详细的细节:

    您需要区分服务器机器宕机和服务器进程宕机。

    如果服务器机器崩溃了,那么很明显,没有任何东西可以接收到数据包。发送客户端将不会收到重试请求,也不会确认成功或失败。在完全没有收到任何反馈后,客户端最终会收到超时,并认为连接已断开。这与意外物理切割的电缆几乎相同。

    但是,如果服务器机器仍然运行,但服务器进程由于编程错误而崩溃,那么接收 TCP 堆栈(它是操作系统的函数,而不是进程的函数)可能会确认数据包,以及到达的任何其他人。这将一直持续到操作系统通知 TCP 堆栈该进程不再处于活动状态。 TCP 堆栈可能会向客户端发送 RST(重置)通知,或者可能会断开连接(如上所述)

    【讨论】:

    • +1。只是澄清一下:tcp 不提供保证交付,它只提供可靠的交付。 ACK 来自接收方的 TCP 堆栈,因此如果服务器机器宕机,将不会有任何响应,正如 abelenky 所说。
    • 另外:如果客户端在发送数据后读取套接字,可能只会通知连接被丢弃(或重置)(除非客户端的发送缓冲区在发送所有数据之前填满)。
    • 如果客户端需要知道数据是否发送成功,最佳实践是应用协议让服务器在传输完成时发送确认(而不是依赖网络协议打开/关闭)握手,这违反了 OSI 层分离)。
    • 我想我需要强调:发送客户端不知道最终数据包是否到达那里,因为它从未收到 ACK。因此,它必须假设数据包没有到达目的地。
    【解决方案2】:

    基本上就是这样。如果不纠缠于不必要的细节,就很难描述完整的现实。

    TCP 管理定义为 4 元组(source-ip、source-port、dest-ip、dest-port)的连接。

    当服务器关闭连接时,连接会进入 TIME_WAIT2 状态,在该状态下不能再使用一段时间。该时间是数据包最大生存时间值的两倍。在此期间到达的任何数据包都会被 TCP 本身丢弃。

    因此,当连接可以重新使用时,所有数据包都已被销毁(网络上的任何地方):

    • 由于 TIME_WAIT2 状态,在目的地被接收并被丢弃;或
    • 由于有效期已过而被网络上的数据包转发器销毁。

    【讨论】:

      【解决方案3】:

      当您将数据包发送到网络时,永远不会有受让人,它会安全地到达另一端。 TCP 的可靠性完全按照您使用确认包的建议实现。

      【讨论】:

        猜你喜欢
        • 2013-05-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-25
        • 2011-08-24
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        相关资源
        最近更新 更多