如果服务器终止,TCP数据包会发生什么?

时间:2009-02-13 03:47:34

标签: tcp

我知道TCP非常可靠,所发送的内容保证可以到达目的地。但是如果发送数据包之后发生了什么,但是之前它到达服务器,服务器会发生故障?在数据包最初发送时,或者当数据包成功到达服务器时,是否确认在服务器存在时触发了数据包成功发送?

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

3 个答案:

答案 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本身丢弃。

因此,当连接可用于重用时,所有数据包都已被破坏(网络上的任何地方):

  • 由于TIME_WAIT2状态而在目的地被接收并被丢弃;或
  • 由于过期的生命周期而被网络上的包裹转发器销毁。

答案 2 :(得分:0)

当您向网络发送数据包时,从来没有受让人可以安全地到达另一方。 TCP的可靠性完全按照您建议使用确认数据包的方式实现。