TCP Fast Open

传统的tcp三次握手

传统的 TCP 握手是一个三步过程,执行如下:

  1. 发送方向接收方发送SYN数据包以发起连接
  2. 接收方向发送方发送一个 SYN-ACK 数据包,让其知道它已准备好开始传输数据
  3. 发送方向接收方发送一个ACK包

一旦这个过程完成,发送方和接收方都可以开始交换数据。 但是,依次执行这三个步骤会增加网络延迟时间,从而降低整体页面加载速度。 TCP Fast Open 通过让客户端在初始 SYN 期间发送数据来帮助减少此握手产生的额外网络延迟时间,从而允许在握手期间进行连接。

TCP Fast Open定义

TCP Fast Open(TFO)是传输控制协议 (TCP) 的扩展,它通过在发送方的初始 TCP SYN 期间交换数据来帮助减少网络延迟。是用来加速连续TCP连接的数据交互的TCP协议扩展,原理如下:在TCP三次握手的过程中,当用户首次访问Server时,发送SYN包,Server根据用户IP生成Cookie(已加密),并与SYN-ACK一同发回Client;当Client随后重连时,在SYN包携带TCP Cookie;如果Server校验合法,则在用户回复ACK前就可以直接发送数据;否则按照正常三次握手进行。

TCP Fast Open 是一种简化 TCP 三次握手的方案,如图:可看出传统tcp三次握手与开启tcp fast open 握手的区别:

它是如何工作的?

TCP Fast Open 扩展的工作原理是根据来自发送方的初始 SYN 向接收方发送数据。 这允许立即开始数据传输,而不是等待整个握手过程发生。 但是,TFO 仅在正常 TCP 握手发生后才起作用,因为发送方不仅向接收方发送 SYN 数据包,还发送 cookie 请求。

因此,在发送方和接收方之间的第一个 TCP Fast Open 请求期间发生的过程如下:

  1. 发送方发送一个 SYN 数据包和一个 cookie 请求
  2. 接收方生成请求的cookie
  3. 接收方将 SYN-ACK 和 cookie 一起发送回发送方
  4. 客户端将 ACK 发送回接收者

此过程完成后,TCP 将继续正常运行。 通过使用 TFO 扩展,客户端能够立即开始发送数据并且可以更早地开始通信。

TCP Fast Open Nginx 配置

为了在 Nginx 中使用 TCP Fast Open 扩展,您的内核设置必须配置为支持 TFO。 从 Linux 3.7 版开始,客户端和服务器包含 TFO 支持,从 3.13 版开始,它应该默认启用(使用 uname -r 检查您的版本)。 使用以下命令查看您的服务器上是否正在运行 TCP Fast Open。

1
cat /proc/sys/net/ipv4/tcp_fastopen

如果它返回值 0,则它被禁用。 此外,如果它返回值 1,这意味着 TFO 仅在传出连接(客户端)上启用,值 2 表示它仅在侦听套接字(服务器)上可用。 但是,您需要将 tcp_fastopen 设置为 3,从而启用两者。

如果 tcp_fastopen 值不等于 3,您可以通过运行以下命令来修改它。

1
echo "3" > /proc/sys/net/ipv4/tcp_fastopen

这将修改 tcp_fastopen 值,如果系统重新启动,该配置会失效。 但是,如果您想避免每次系统重新启动时都必须更改该值,您可以在 /etc/sysctl.d 目录中创建一个 tcp_fastopen.conf 文件,如下所示:

1
echo "net.ipv4.tcp_fastopen=3" > /etc/sysctl.d/30-tcp_fastopen.conf

我们现在有一个 tcp_fastopen 配置文件,它指定存储在 sysctl.d 目录中的值为 3。 我们可以通过运行 cat /etc/sysctl.d/30-tcp_fastopen.conf 来验证这个文件的内容。

至于 Nginx TFO 支持,大多数 Nginx 包默认不包含此功能。 但是,如果您通过在 NGINX 的配置脚本中添加 -DTCP_FASTOPEN=23 编译器标志从源代码构建 Nginx,则可以指定它。 一旦您的 Nginx 服务器正确配置并支持 TFO,添加 TCP Fast Open 选项就像打开您的 nginx.conf 文件并将其添加到 listen 指令一样简单。

1
listen 80 fastopen=256

总结

如前所述,使用 TCP Fast Open 扩展可以通过允许更早地发送数据来帮助进一步减少网络延迟。 这对于距离源服务器很远的网站访问者尤其有用。 尽管在服务器级别可能需要一些配置,但如果您遇到网络延迟问题或需要其他方法来帮助改善返回用户的页面加载时间,这可能会很有益。

参考

Search by:GoogleBingBaidu