如果在两台主机(A & B)之间建立了TCP连接,并假设主机A向主机B发送了5个八比特组,然后主机B发生了故障(由于原因不明)。 主机A将等待确认,但没有得到它们,将重新发送八位组,并且还会减小发送方窗口大小。 这会重复几次,直到窗口大小由于数据包丢失而缩小为零。我的问题是,接下来会发生什么?如果一台机器死机,TCP连接如何终止?
回答
在这种情况下,TCP最终超时等待确认并向应用程序返回错误。应用程序必须从TCP套接字读取/ recv以了解该错误,随后的写入/发送调用也将失败。直到TCP确定连接已经结束,写/发送调用不会失败,如果套接字缓冲区已满,它们将从应用程序或块中看到成功。
如果主机B在发送ACK后消失,主机A将不会了解该情况,直到它向B发送某些内容为止,否则最终会超时或导致ICMP错误。 (通常,第一次写入/发送呼叫不会失败,因为TCP不会立即使连接失败,并且请记住,写入/发送呼叫在完成之前不会等待ACK)。
还要注意,重传不会减小窗口大小。
现在请点击此link
一个很简单的回答你的问题在我的看法是,该连接将超时,将被关闭。存在的另一种可能性是,由于未响应的机器可能会生成一些ICMP错误。另外,如果坠毁的机器再次联机,则会观察到我上面粘贴的链接中描述的过程。
取决于操作系统的实施。简而言之,它将等待ACK并重新发送数据包,直到超时。那么你的连接将被拆除。准确地查看Linux中发生的情况here其他操作系统遵循类似的算法。
在你的情况下,将生成一个FIN(由幸存的节点)并且连接最终会迁移到CLOSED状态。如果你持续在目标IP地址上输入netstat输出,你会看到从ESTABLISHED状态迁移到TIMED_WAIT,然后最终消失。
在你的情况,这将发生,因为TCP保持一个计时器来获得它发送的数据包的ACK。这个计时器不够长,所以检测会很快发生。然而,如果机器B在A获得ACK之后死亡,并且之后A不发送任何东西,那么上述定时器不能检测到相同的事件,然而另一个定时器(呼叫空闲超时)将检测到该条件并且连接将关闭。这个超时时间默认为高。但通常情况并非如此,机器A会尝试发送内容并检测发送路径中的错误状态。
简而言之,除了一种情况(空闲超时:默认情况下非常高),TCP本身足以智能地关闭连接(并让应用程序知道它)。
cforfun
在正常情况下,每一侧通过发送特殊消息具有FIN(光洁度)终止其连通的端位设置。接收到该FIN的设备回应FIN的确认以表明它已被接收。 连接作为一个整体不会被视为终止,直到两个设备通过发送FIN并接收确认完成关闭过程。
- 1. 如何确认几台TCP连接来自一台计算机?
- 2. 终止连接TCP
- 3. 在tcp连接终止
- 4. 如何连接2台运行在同一台机器上的虚拟主机?
- 5. 连接两台virtualbox机器
- 6. 连接到另一台机器
- 7. 如何从另一台机器连接到Oracle数据库?
- 8. 如何从另一台机器连接到我的elasticsearch集群?
- 9. 终止现有的tcp连接
- 10. 如何使用CLOSE_WAIT状态终止tcp连接
- 11. 如何将我的python机器人连接到微软机器人连接器
- 12. 如何将Docker容器从一台机器迁移到另一台机器?
- 13. 如何将SQL服务器从一台机器复制到另一台机器
- 14. 如何中止“关闭”TCP连接?
- 15. 如何通过tcp电缆连接两台或多台机器以形成网络网格?
- 16. 如何从另一台计算机连接到SQL Server?
- 17. 如何连接到Cloud9上的机器?
- 18. 如何连接到MySQL主机上的另一台计算机上的网络
- 19. 如何从一台机器的git存储库克隆到另一台机器?
- 20. 如何将文件从一台机器传输到另一台机器
- 21. 在一台机器上编译gcc4.4.6,如何让另一台机器使用它?
- 22. 如何从ESXi主机控制台连接ESXi虚拟机控制台
- 23. 连接到另一台计算机
- 24. 如何从另一台机器'git clone'?
- 25. 如何在同一台机器
- 26. 如何从另一台机器'hg clone'?
- 27. 如何知道TCP连接是否在同一台机器上的两个进程之间?
- 28. 在主机之间建立TCP连接
- 29. 自动重新连接到TCP主机
- 30. 阻止到给定主机或IP的传出TCP连接?
是不是这是syn flooding? – 2012-06-16 00:44:30