简介
TCP 快速打开(TCP Fast Open,简称TFO)是对计算机网络中传输控制协议(TCP)连接的一种简化握手手续的拓展,用于提高两端点间连接的打开速度。
它通过握手开始时的 SYN 包中的 TFO cookie(一个 TCP 选项)来验证一个之前连接过的客户端。如果验证成功,它可以在三次握手最终的 ACK 包收到之前就开始发送数据,这样便跳过了一个绕路的行为,更在传输开始时就降低了延迟。这个加密的 Cookie 被存储在客户端,在一开始的连接时被设定好。然后每当客户端连接时,这个 Cookie 被重复返回。
最显著的优点是可以利用握手去除一个往返 RTT
开启 TFO
net.ipv4.tcp_fastopen 是 Linux 内核中的一个配置参数,它用于控制 TCP Fast Open 功能。
具体地,net.ipv4.tcp_fastopen 的值可以是以下几种:
0:禁用TCP Fast Open功能。1:在客户端启用TCP Fast Open功能。2:在服务器端启用TCP Fast Open功能。3:在客户端和服务器端都启用TCP Fast Open功能。
通过设置这个参数,可以根据实际需求选择是否启用和在哪一端启用 TCP Fast Open,从而优化网络性能。
请求 Fast Open Cookie 的过程如下:
- 客户端发送一个 
SYN包,头部包含Fast Open选项,且该选项的Cookie为空,这表明客户端请求Fast Open Cookie - 服务端收取 
SYN包以后,生成一个cookie值(一串字符串) - 服务端发送 
SYN+ACK包,在Options的Fast Open选项中设置cookie的值 - 客户端缓存服务端的 
IP和收到的cookie值 
第一次过后,客户端就有了缓存在本地的 cookie 值,后面的握手和数据传输过程如下:
- 客户端发送 
SYN数据包,里面包含数据和之前缓存在本地的Fast Open Cookie。 - 服务端检验收到的 
TFO Cookie和传输的数据是否合法。- 如果合法就会返回 
SYN+ACK包进行确认并将数据包传递给应用层 - 如果不合法就会丢弃数据包,走正常三次握手流程(只会确认 
SYN) 
 - 如果合法就会返回 
 - 服务端程序收到数据以后可以握手完成之前发送响应数据给客户端了
 - 客户端发送 
ACK包,确认第二步的SYN包和数据(如果有的话)
后面的过程就跟非TFO连接过程一样了 
我们看看 curl 如何支持 fast open, 通过 strace 抓下:
1  | strace curl --tcp-fastopen http://192.168.14.168  | 

我们看下在服务器的抓包信息:
第一次请求
fast open cookie 为空
第二次请求
第一个 SYN 包被识别成了 HTTP 请求

