TCP 快速打开(TCP Fast Open,TFO), 尽可能降低握手对网络延迟的影响

TFO 与 shadowsocks

TFO 简介

TFO 是在原来 TCP 协议上的扩展协议,它的主要原理就在发送第一个 SYN 包的时候就开始传数据了,不过它要求当前客户端之前已经完成过「正常」的三次握手。

快速打开分两个阶段:

  • 请求 Fast Open Cookie
  • 真正开始 TCP Fast Open

Fast Open Cookie:

  1. 客户端发送一个 SYN 包,头部包含 Fast Open 选项,且该选项的Cookie 为空,这表明客户端请求 Fast Open Cookie
  2. 服务端收取 SYN 包以后,生成一个 cookie 值(一串字符串)
  3. 服务端发送 SYN + ACK 包,在 Options 的 Fast Open 选项中设置 cookie 的值
  4. 客户端缓存服务端的 IP 和收到的 cookie 值 (key-value)

image.png

TCP Fast Open:

  1. 客户端发送 SYN 数据包,里面包含数据和之前缓存在本地的 Fast Open Cookie。(注意我们此前介绍的所有 SYN 包都不能包含数据)
  2. 服务端检验收到的 TFO Cookie 和传输的数据是否合法。如果合法就会返回 SYN + ACK 包进行确认并将数据包传递给应用层,如果不合法就会丢弃数据包,走正常三次握手流程(只会确认 SYN)
  3. 服务端程序收到数据以后可以握手完成之前发送响应数据给客户端了
  4. 客户端发送 ACK 包,确认第二步的 SYN 包和数据(如果有的话)
  5. 后面的过程就跟非 TFO 连接过程一样了

image.png

抓包演示

开启 TFO:

  1. $ echo 3 > /proc/sys/net/ipv4/tcp_fastopen
  1. 第一次:请求 Fast Open Cookie

image.png

  1. 第二次:真正的快速打开

image.png

TCP Fast Open 的优势

一个最显著的优点是可以利用握手去除一个往返 RTT,如下图所示

image.png

代码中是怎么使用的 Fast Open