【问题标题】:What if a TCP handshake segment is lost?如果 TCP 握手段丢失怎么办?
【发布时间】:2013-04-22 00:07:35
【问题描述】:

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

【问题讨论】:

标签: tcp


【解决方案1】:

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

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

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

更新:我在 RFC 中找到了明确规定的地方:

如果我们的 SYN 已经被确认(也许在这个 传入段)传入段的优先级必须 完全匹配本地优先级,如果它没有重置 必须发送。

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

【讨论】:

  • 不过,握手的最终 ACK 本身并没有被 ACK。
  • ACK ACK 将使实际数据无法传输。
【解决方案2】:

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

【讨论】:

  • 服务器在发送 SYN-ACK 时认为连接已建立。但这可能是一个实现细节,我还没有找到在这种情况下要做什么的实际规范。也许没有。
  • @LennartRegebro:根据RFC 793 Section 3.4,服务器在收到最终的ACK之前不会进入ESTABLISHED状态。当它发送SYN+ACK 时,它仍然处于SYN-RECEIVED 状态。客户端收到SYN+ACK后进入ESTABLISHED状态。
  • 找到它:“如果我们的 SYN 已被确认(可能在此传入段中),传入段的优先级必须与本地优先级完全匹配,如果没有则必须发送重置。 "换句话说,如果 ACK 并且只有 ACK 被丢弃,则连接建立。如果更多的东西被丢弃,就会有一个重置。 "
猜你喜欢
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2012-04-04
  • 2023-02-11
  • 2015-04-30
  • 2020-04-09
  • 2016-12-19
相关资源
最近更新 更多