如果其中一台机器死机,TCP连接如何终止?

时间:2012-02-25 23:50:42

标签: networking tcp

如果在两个主机(A& B)之间建立了TCP连接,并且让主机A向主机B发送了5个八位字节,然后主机B崩溃(由于未知原因)。 主机A将等待确认,但是在没有获得确认时,将重新发送八位字节并减少发送方窗口大小。 由于数据包丢失,这将重复几次,直到窗口大小缩小到零。我的问题是,接下来会发生什么?

5 个答案:

答案 0 :(得分:5)

在这种情况下,TCP最终会超时等待ack并向应用程序返回错误。应用程序必须从TCP套接字读取/ recv以了解该错误,后续的写入/发送调用也将失败。直到TCP确定连接已经消失为止,写入/发送调用不会失败,如果套接字缓冲区已满,它们将从应用程序或块中看到成功。

如果您的主机B在发送其ACK后消失,主机A将不会了解它,直到它向B发送内容,最终也会超时,或导致ICMP错误。 (通常,第一次写入/发送调用不会失败,因为TCP不会立即使连接失败,请记住,写入/发送调用在完成之前不会等待ACK。)

另请注意,重新传输不会减小窗口大小。

答案 1 :(得分:1)

请按照link

进行操作

现在,在我看来,对您的问题的一个非常简单的答案是,连接将超时并将被关闭。存在的另一种可能性是由于适当的无响应机器可能会产生一些ICMP错误。

此外,如果崩溃的机器再次在线,则会观察上面刚刚粘贴的链接中描述的程序。

答案 2 :(得分:1)

取决于操作系统的实施。简而言之,它将等待ACK并重新发送数据包,直到它超时。然后你的连接将被拆除。要确切了解Linux中发生的情况,请查看here其他操作系统遵循类似的算法。

答案 3 :(得分:1)

在您的情况下,将生成一个FIN(由幸存的节点),并且连接最终将迁移到CLOSED状态。如果在目标IP地址上继续grep-netstat输出,您将观察从ESTABLISHED状态到TIMED_WAIT的迁移,然后最终消失。

在您的情况下,这将发生,因为TCP保留一个计时器来获取它已发送的数据包的ACK。这个计时器不够长,所以检测很快就会发生。

但是,如果机器B在A获得ACK之后死亡并且在A之后没有发送任何内容,则上述定时器无法检测到相同的事件,但是另一个定时器(调用空闲超时)将检测到该条件和连接将关闭然后。默认情况下,此超时时间很长。但通常情况并非如此,机器A会尝试在两者之间发送内容,并会检测发送路径中的错误情况。

简而言之,TCP非常智能,可以自行关闭连接(让应用程序知道它),除了一种情况(空闲超时:默认情况下非常高)。

cforfun

答案 4 :(得分:0)

在正常情况下,每一方通过发送带有FIN(完成)位集的特殊消息来终止其连接的结束。 接收该FIN的设备响应FIN的确认以指示它已被接收。 在两个设备都通过发送FIN并接收确认来完成关闭过程之前,整个连接不会被视为终止。