24

在 TCP 3 次握手中,将发送 3 个段(SYN、SYN ACK、ACK)。如果第三段(ACK)丢失怎么办?发送方是要重新发送段还是放弃建立连接?两台主机如何知道该段丢失了?

4

2 回答 2

31

TCP 在所有数据包中都有一个序列号。因此很容易知道数据包是否丢失。如果主机在数据包上没有收到 ACK,他只会重新发送它。

但在大多数情况下,即使该 ACK 丢失,也不会重新发送,原因很简单。直接在 ACK 之后,打开 TCP 协议的主机很可能开始发送数据。与所有 TCP 数据包一样,该数据将具有一个 ACK​​ 号,因此接收者将以这种方式获得一个 ACK​​。因此,SYN-ACK 的发送者应该合理地不在乎它没有收到 ACK,因为它在以下包中获得了“隐式”ACK。

只有在根本没有接收到数据时才需要重新发送 SYN-ACK。

更新:我在 RFC 中找到了确切指定的位置:

如果我们的 SYN 已被确认(可能在此传入段中),则传入段的优先级必须与本地优先级完全匹配,否则必须发送重置。

换句话说,如果 ACK 被丢弃但下一个数据包没有被丢弃,那么一切都很好。否则,必须重置连接。这很有意义。

于 2013-04-28T05:06:38.417 回答
1

我不是这种特殊情况的专家,但我怀疑客户端会认为它已连接但服务器不会。如果客户端尝试向服务器发送数据,服务器将拒绝它并向客户端发送一个 RST 数据包,以便它可以重置其“连接”。

于 2013-04-28T05:11:21.793 回答