【问题标题】:TCP 3-way handshake - multiple SYNsTCP 3 次握手 - 多个 SYN
【发布时间】:2016-02-22 07:55:08
【问题描述】:

假设主机 H1 正在寻找与 H2 建立 TCP 连接并为 3 次握手的第一步发送一个 SYN。然后 H1 在超时时没有收到回音,并且正在向 H2 发送第二个 SYN。

然后,H1 会收到这两个 SYN 的回复。在这种情况下,H1 做了什么——这两个中的哪一个作为握手的第三步确认,来自 H2 的第一个 SYN+ACK 还是第二个?两个 SYN+ACK 有 2 个不同的 H2 初始序列号 (ISN)。它们也有不同的 ACK——H1 在其两个 SYN 中发送了 2 个不同的 ISN。

从另一个角度来看——在这种情况下,H2 会做什么?所以 - H2 收到一个 SYN 并发送 SYN+ACK 作为响应。过了一会儿,H2 又收到了来自 H1 的 SYN+ACK。在这种情况下 H2 做了什么:

  • 是否也向第二个 SYN 发送 SYN+ACK?在这种情况下,H2 怎么知道哪个 SYN(H1 的 ISN)是这个连接的?

  • 忽略第二个 SYN。但是,H2 也超时了——它没有收到任何回音,因为它发送了之前的 SYN+ACK。

这在 TCP 中是如何处理的?

TIA

注意:我见过What if a TCP handshake segment is lost?TCP: SYN request receives SYN response instead of SYN-ACKtcpip 3-way handshakeTCP handshake reliability 以及其他一些有用的讨论。

//--------------------------------------------- ---

编辑:

答案似乎在于RST 标志——只要对序列#s 有疑问,就会重置。请参阅RFC793 的图 9。

但是,Q 仍然存在于下面的评论中:H1 何时出现(图 9 中的“TCP A”) 使用新的 ISN 重试连接 - 多长时间后以及在什么情况下?

【问题讨论】:

  • 我投票结束这个问题,因为它与编程无关
  • 重新提交的 SYN 的序列号与原始 SYN 中的序列号相同。是什么让您认为情况并非如此?
  • @SteffenUllrich - 如果我没记错的话,ISN 是从每“4 毫秒”一次的计数器中读取的。我假设在第二次尝试中按那个时钟走。你有这方面的参考吗?
  • @Roam:丢失的数据包(包括 SYN)被重新传输,这意味着再次发送完全相同的数据包。相关标准是 RFC 793。
  • @SteffenUllrich - 那么 RFC793 图 9 中的情况如何呢?在行注释下方的 Q-- 部分中查看我的编辑。

标签: networking tcp


【解决方案1】:

图 9 中的情况发生在发送方已经放弃该连接之后,来自先前连接尝试的 SYN 到达。主机 B 为这个额外的 SYN 发送一个 ACK​​,主机 A 看到 ACK 的序列号是错误的。然后主机 A 通过发送 RST 中止连接。

【讨论】:

    【解决方案2】:

    你的问题毫无意义。从序列号的角度来看,两个 SYN 是相同的,并且都以相同的方式得到确认。

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-04
      • 2014-12-16
      • 2020-09-18
      • 1970-01-01
      相关资源
      最近更新 更多