摘要

  • 同时打开发生在双方都主动打开、发送 SYN,并在 SYN-SENT 状态收到不带确认号的 SYN 时。
  • 双方进入 SYN-RECEIVED,确认对方的序列空间,随后进入 ESTABLISHED;结果是一条连接,而不是两条。
  • RFC 9293 要求实现支持这一过程,并记住 SYN-RECEIVED 源于主动打开还是被动打开。

角色之前的握手

TCP 常被讲成客户端向监听中的服务器发起请求。但 RFC 793 首先把三次握手描述为连接同步过程。一个发起者和一个响应者是通常情形,却不是传输层的硬性角色。客户端和服务器更多是应用及部署上的约定。

SYN 如何交叉

两个端点都执行主动 OPEN,各自选择初始序列号并发送 SYN。报文在网络中交叉时,双方都处于 SYN-SENT。每一方收到不带确认的 SYN,记录对方的初始序列号,进入 SYN-RECEIVED,并发送 SYN+ACK。收到对自己 SYN 的有效确认后,双方进入 ESTABLISHED。交叉的发起最终合并为一条连接。

SYN 会占用一个序列号,因此确认号向前推进一位。

对称仍然需要记忆

RFC 9293 要求支持同时打开,并要求记录 SYN-RECEIVED 是由主动还是被动 OPEN 导致的。这个来源会影响之后的复位和错误处理。状态机可以对称,但本地历史不能被抹去。

看似敲门的旧 SYN

旧的重复 SYN 可能看起来像同时发起。序列号验证和复位处理仍然必要;在 SYN-SENT 收到 SYN,并不自动意味着它是合法的同时打开。

标准没有承诺什么

规范说明的是:当报文抵达两个 TCP 端点时,状态机如何运行。它并不证明路由、防火墙、NAT 映射、套接字 API 或应用一定允许这种交换。

来源