【发布时间】:2010-10-07 09:00:11
【问题描述】:
我知道 TCP 非常可靠,发送的任何内容都可以保证到达目的地。但是如果在一个数据包被发送,但是在它到达服务器之前,服务器宕机了会发生什么?报文发送成功的确认是在数据包最初发送时服务器存在,还是在数据包成功到达服务器时触发?
基本上我要问的是 - 如果服务器在发送和接收数据包之间发生故障,客户端会知道吗?
【问题讨论】:
标签: tcp
我知道 TCP 非常可靠,发送的任何内容都可以保证到达目的地。但是如果在一个数据包被发送,但是在它到达服务器之前,服务器宕机了会发生什么?报文发送成功的确认是在数据包最初发送时服务器存在,还是在数据包成功到达服务器时触发?
基本上我要问的是 - 如果服务器在发送和接收数据包之间发生故障,客户端会知道吗?
【问题讨论】:
标签: tcp
这真的没关系,但这里有一些更详细的细节:
您需要区分服务器机器宕机和服务器进程宕机。
如果服务器机器崩溃了,那么很明显,没有任何东西可以接收到数据包。发送客户端将不会收到重试请求,也不会确认成功或失败。在完全没有收到任何反馈后,客户端最终会收到超时,并认为连接已断开。这与意外物理切割的电缆几乎相同。
但是,如果服务器机器仍然运行,但服务器进程由于编程错误而崩溃,那么接收 TCP 堆栈(它是操作系统的函数,而不是进程的函数)可能会确认数据包,以及到达的任何其他人。这将一直持续到操作系统通知 TCP 堆栈该进程不再处于活动状态。 TCP 堆栈可能会向客户端发送 RST(重置)通知,或者可能会断开连接(如上所述)
【讨论】:
基本上就是这样。如果不纠缠于不必要的细节,就很难描述完整的现实。
TCP 管理定义为 4 元组(source-ip、source-port、dest-ip、dest-port)的连接。
当服务器关闭连接时,连接会进入 TIME_WAIT2 状态,在该状态下不能再使用一段时间。该时间是数据包最大生存时间值的两倍。在此期间到达的任何数据包都会被 TCP 本身丢弃。
因此,当连接可以重新使用时,所有数据包都已被销毁(网络上的任何地方):
【讨论】:
当您将数据包发送到网络时,永远不会有受让人,它会安全地到达另一端。 TCP 的可靠性完全按照您使用确认包的建议实现。
【讨论】: