我知道TCP非常可靠,所发送的内容保证可以到达目的地。但是如果发送数据包之后发生了什么,但是之前它到达服务器,服务器会发生故障?在数据包最初发送时,或者当数据包成功到达服务器时,是否确认在服务器存在时触发了数据包成功发送?
基本上我要问的是 - 如果服务器在发送和接收数据包之间发生故障,客户端会知道吗?
答案 0 :(得分:10)
这没关系,但这里有一些更精细的细节:
您需要区分Server-Machine关闭和Server-Process关闭。
如果服务器机器崩溃了,那么显然没有什么可以接收数据包。发送客户端将不会获得重试请求,也不会确认成功或失败。在没有收到任何反馈后,客户端最终会收到超时,并认为连接已断开。这与意外切断电缆非常相似。
但是,如果服务器机器仍在运行,但是由于编程错误导致服务器进程崩溃,那么接收TCP堆栈(可能是操作系统的功能,而不是进程的功能)可能会确认数据包和其他任何人到达。这将继续,直到操作系统通知TCP堆栈该进程不再处于活动状态。 TCP堆栈可能会向客户端发送RST(重置)通知,或者可能断开连接(如上所述)
答案 1 :(得分:2)
这基本上就是这样。如果没有被不必要的细节束缚,很难描述完整的现实。
TCP管理定义为4元组的连接(source-ip,source-port,dest-ip,dest-port)。
当服务器关闭连接时,连接将进入TIME_WAIT2状态,在该状态下,连接无法在特定时间内重复使用。该时间是数据包的最大生存时间值的两倍。在此期间到达的任何数据包都将被TCP本身丢弃。
因此,当连接可用于重用时,所有数据包都已被破坏(网络上的任何地方):
答案 2 :(得分:0)
当您向网络发送数据包时,从来没有受让人可以安全地到达另一方。 TCP的可靠性完全按照您建议使用确认数据包的方式实现。