2009-02-13 122 views
3

我知道TCP非常可靠,并且发送的内容都能保证到达目的地。但是如果发送一个数据包后会发生什么情况,但之前会到达服务器,服务器出现故障?当数据包最初发送时,或者数据包成功到达服务器时,确认数据包发送成功时触发服务器的存在?如果服务器终止,TCP数据包会发生什么?

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

回答

10

这其实并不重要,但这里的一些更精细的细节:

您需要的服务器机下降和服务器进程下降区别开来。

如果服务器计算机崩溃了,那么很明显,没有什么可以接收数据包。发送客户端将不会收到重试请求,也不会收到成功或失败的确认信息。在没有收到任何反馈意见之后,客户端最终会收到超时,并且认为连接已经中断。这与实际上意外切割的电缆非常相似。

但是,如果Server-Machine保持正常运行,但由于编程错误导致服务器进程崩溃,则接收TCP堆栈是OS的一个函数,而不是进程的函数,数据包和任何其他到达的数据包。这将继续,直到OS通知TCP堆栈该进程不再处于活动状态。 TCP堆栈可能会向客户端发送RST(重置)通知,或者可能会断开连接(如上所述)

+0

+1。只是为了澄清,但:tcp不提供保证的交付,它只提供可靠的交付。 ACK来自接收方的TCP堆栈,因此如果服务器机器停机,将不会有任何响应,正如abelenky所说。 – 2009-02-13 04:00:41

2

这基本上是发生了什么情况。完整的现实很难描述,没有被束缚在不必要的细节中。

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

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

所以,当重新使用的连接变得可用时,所有的数据包都被破坏(在网络上的任何地方)或者通过:

  • 在目的地被接收并扔掉由于TIME_WAIT2状态;或
  • 由于终止使用期限而被网络上的数据包转发器破坏。
0

当你向网络发送一个数据包时,永远不会有被授予者,它会安全地到达另一侧。 TCP的可靠性完全按照您建议使用确认数据包的方式实现。

相关问题