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

3
我知道TCP非常可靠,无论发送什么都能保证到达目的地。但是如果在数据包被发送后,在到达服务器之前,服务器宕机了怎么办?当数据包最初被发送时,成功发送的确认是否会因为服务器存在而触发,还是只有当数据包成功到达服务器时才会触发?
换句话说,如果服务器在发送和接收数据包之间宕机,客户端会知道吗?
3个回答

13

其实这并不重要,但以下是一些细节:

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

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

然而,如果服务器机器仍在运行,但由于编程错误导致服务器进程崩溃,则接收TCP堆栈(它是操作系统而不是进程的函数)可能会对数据包进行ACK,以及任何其他到达的数据包。这将持续到操作系统通知TCP堆栈该进程不再活动为止。TCP堆栈可能会向客户端发送RST(复位)通知,或者删除连接(如上所述)。


1
只是为了澄清一下:TCP并不提供可靠的传递,它只提供可靠的传输。ACK来自接收方的TCP堆栈,因此如果服务器机器崩溃,就不会有响应,正如abelenky所说。 - Don Branson
1
此外:如果客户端在发送数据后读取套接字(除非客户端的发送缓冲区在发送所有数据之前已满),则只有在连接断开(或重置)时才能通知客户端。 - Miles
如果客户端需要知道数据是否成功发送,最佳实践是应用协议在传输完成时由服务器发送确认(而不是依赖于网络协议的打开/关闭握手,这违反了OSI层分离)。 - Miles
我认为需要强调的是:发送客户端不知道最终数据包是否到达目的地,因为它从未收到确认信息。因此,它必须假设该数据包未到达目的地。 - abelenky

2
这基本上是发生的事情。完整的实际情况很难描述,因为会卷入不必要的细节。
TCP 管理连接,这些连接被定义为 4 元组 (源 IP、源端口、目标 IP、目标端口)。
当服务器关闭连接时,连接被放置在 TIME_WAIT2 状态中,在一定时间内无法重新使用。这个时间是数据包的最大生存时间值的两倍。在此期间到达的任何数据包都将被 TCP 本身丢弃。
因此,当连接变为可重用时,所有数据包都已被销毁(在网络上的任何地方),或者由于以下原因被销毁:
  • 由于处于 TIME_WAIT2 状态而在目标位置接收并丢弃;或者
  • 由于寿命过期而被数据包转发器销毁。

0
当你发送一个数据包到网络时,永远不能保证它能安全地到达另一端。TCP的可靠性正是通过使用确认数据包来实现的,就像你所建议的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接