摘要

  • RFC 7413 允许持有服务器 cookie 的客户端在 SYN 中携带应用数据;cookie 验证成功后,服务器可以在三次握手完成前把数据交给应用。
  • 这种安排最多可省下一个往返时延,但 SYN 数据可能被重复交付;不能安全处理重复首个请求的应用不得使用它。
  • Fast Open 因而不只是一项内核开关,还要求可控的 cookie 密钥轮换、未确认请求上限、按路径记录失败,以及经过验证的普通 TCP 回退。

普通 TCP 的第一个报文首先回答一个传输层问题:双方能否建立一条新的连接。TCP Fast Open 让同一个报文同时提出应用层请求。对于持有有效 cookie 的回访客户端,服务器无需等到第三个握手报文,就可以开始处理第一批字节。被消除的不是网络距离,而是等待顺序。

RFC 7413 于 2014 年 12 月以实验性规范发布,并非互联网标准轨规范。这个定位很重要。文档规定的是一种可实施、可检验的机制及其边界,并不证明今天任何具体服务已经部署,也不证明每条路径都能从中获益。它承诺的只是有条件的机会:在第一批应用数据足够小、客户端已有服务器 cookie、路径允许携带数据的 SYN 通过时,最多提前一个 RTT。

第一次连接通常仍按普通方式进行。客户端在 SYN 的 Fast Open 选项中请求 cookie;服务器在 SYN-ACK 中返回一个不透明的消息认证标签;客户端将它缓存。下一次建连时,客户端把 cookie 和应用数据一同放进 SYN。服务器验证通过后,可以同时确认 SYN 与数据,把数据交给应用,甚至在握手完成前发出响应。验证失败时,服务器丢弃早期数据,只确认 SYN,连接继续走普通流程。

cookie 证明的是此前从该源地址到服务器的可达性,不是用户身份,也不是业务授权。RFC 7413 规定 cookie 长度为 4 到 16 字节,通常由服务器用与客户端源 IP 相关的 MAC 生成。客户端不解释其内容。服务器控制生成、验证和过期,可以通过轮换密钥使旧 cookie 失效,也可以在过渡期接受多把密钥。密钥寿命和重叠窗口因此直接影响性能与故障范围。

协议最关键的语义代价是重放。三次握手的一项作用,是帮助 TCP 把新连接与旧的、重复到达的 SYN 区分开。Fast Open 在这个边界尚未完全建立时,就允许应用消费 SYN 数据。若接收端已经遗忘原连接状态,旧 SYN 再次出现,第一批应用数据可能被再次交付。RFC 因而要求 TFO 不得默认开启,只能由应用按服务端口明确请求。

这把幂等性从应用设计问题变成了传输优化的前提。读取类请求通常可以重复;创建资源、扣款或没有事务保护的 POST 不能假设“收到一次”等于“执行一次”。应用层唯一事务标识可以帮助去重,但 Fast Open cookie 不提供恰好一次执行保证。提前处理字节,不能提前获得确定性。

服务器还会提前承担资源成本。握手尚未完成时,一个有效 cookie 可能触发 CPU、内存和响应生成。RFC 7413 定义待处理 Fast Open 请求计数,并要求在超过系统上限时,对新请求关闭 Fast Open。此时服务器应丢弃 SYN 数据,退回普通连接建立,让常规 SYN 洪泛防护重新成为主要边界。cookie 与容量上限必须一起工作。

中间网络同样拥有事实上的否决权。一些防火墙或中间盒会丢弃带负载的 SYN,或者不认识 Fast Open 选项。RFC 要求客户端在 SYN 计时器到期后,改用不带数据和 Fast Open 选项的 SYN 重传。服务器不确认早期数据、ICMP 错误、或者完全没有 SYN-ACK,都属于需要缓存的负面响应;文档建议对对应的源地址、目的地址和端口路径暂时关闭 TFO。

负面缓存不是附属功能,而是快速路径的一部分。没有它,每次新连接都会先支付一次超时,再回到普通 TCP。缓存过久又会把短暂故障固化成长期禁用。运营系统必须决定何时记录失败、何时重新试探,以及怎样区分中间盒不兼容与普通丢包。

完整收益还受首个应用单元大小限制。TCP 选项会占用空间,缓存的 MSS 决定 SYN 最多能携带多少数据。如果一个请求必须等后续报文才能完整,服务器仍需等待,提前一个 RTT 的价值就会缩小。RFC 也提醒应用复用连接;大量短连接即使打开得更快,也可能在拥塞控制充分发挥前就结束,给网络稳定性带来成本。

TCP Fast Open 的历史意义,不是简单把握手“变快”,而是把延迟的账目公开了。少等一个 RTT,意味着多维护一组状态:哪些地址曾经可达、哪些 cookie 仍有效、哪些操作可以重放、多少工作可以在确认前开始、哪些路径必须退回。只有这些责任都可见、可测、可撤销时,提前抵达的请求才真正更快。

Sources