在TCP 3次握手中,将发送3个段(SYN,SYN ACK,ACK)。如果第三段(ACK)丢失怎么办?发件人是要重新发送段还是放弃建立连接?那两个主机如何知道该段丢失了?
答案 0 :(得分:25)
TCP在所有数据包中都有一个序列号。因此,很容易知道数据包是否丢失。如果主机没有在数据包上获得ACK,则只需重新发送它。
在大多数情况下,即使丢失了ACK,也不会因为一个非常简单的原因而重新发送。在ACK之后,打开TCP协议的主机可能开始发送数据。与所有TCP数据包一样,该数据将具有ACK编号,因此接收方将以这种方式获得ACK。因此,SYN-ACK的发送方应合理地不关心它没有得到ACK,因为它在以下包中得到“隐式”ACK。
仅在没有接收到数据的情况下才需要重新发送SYN-ACK。
更新:我在RFC中找到了指定的地方:
如果我们的SYN已被确认(也许在此 传入段)传入段的优先级必须 如果没有重置,则完全匹配本地优先级 必须发送。
换句话说,如果ACK被丢弃但下一个数据包没有丢弃,那么一切都很好。否则,必须重置连接。这很有道理。
答案 1 :(得分:1)
我不是这种特殊情况的专家,但我怀疑会发生什么,客户会认为它已连接但服务器不会。如果客户端尝试向服务器发送数据,服务器将拒绝它并向客户端发送RST数据包,以便重置其“连接”。