网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

什么是TCP快速打开机制?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

TCP握手过程需要整整一个往返时间。 RTT指的是数据包从发送方到达接收方,然后再返回发送方的整个过程所花费的时间。 对于那些“持续时间较短且对时间敏感”的流量来说,比如网页浏览之类的流量,一个RTT就相当于很长的时间。也就是说,浏览器在访问某个网站时,所花费的时间就相当于一个RTT。 如果传播延迟非常高(例如,地面站与卫星之间的连接),或者移动网络的速度非常慢,那么性能会进一步下降。 一次RTT并不会显著降低“弹性流量”的传输性能,比如文件传输之类的。因为,与整个连接的时间相比,一次RTT所带来的开销其实相当小。

假设1个RTT等于86毫秒。这意味着,当用户访问某个资源时,需要等待的时间就是86毫秒。www.xyz.com而86毫秒则用于建立与对方的连接。XYZ的每次用户想要访问同一台服务器时,都会浪费 86 毫秒的时间。这种情况一直持续下去。RTT当存在文件传输或应用程序更新时,这并不算什么大问题。因为这些过程通常只需要几分钟或几小时的时间而已。几毫秒根本不算什么,与几分钟相比,几毫秒根本微不足道。

TFO到底是什么?

TFO代表……TCP快速打开机制这是一种传输层解决方案,用于避免客户端与服务器之间出现整整一个RTT的时间差。它能够避免这种情况的发生。TCP三路握手机制适用于重复连接的情况。TFO是由谷歌的一个团队提出的,其相关规范在RFC 7413中有详细说明。

在正常的TCP连接中,从建立连接开始,会浪费一部分RTT时间。而从第三个数据包开始,真正的通信过程才会开始。TFO认为,客户端可以在第一个数据包中直接发送GET请求,而不会浪费任何RTT时间。不过,这样做有一些条件限制:

1.这绝不能是“新的”连接关系。

由于需要使用加密型Cookie,TFO仅适用于重复连接的情况。 这是客户与服务器进行交互时的第一次握手过程。在这个过程中,需要执行三次握手操作。 在握手过程中,服务器会与客户端共享一个加密的Cookie。 在后续的连接中,客户端只需将 GET 请求以及相关的 Cookie 直接包含在 SYN 数据包中即可。 然后,服务器通过 Cookie 来验证客户端身份。确认了连接请求之后,服务器会发送包含数据的 ACK 数据包。

2. 与SYN数据包一起传输的数据总量必须控制在规定的范围内。

那么,规定的限制是多少呢?对于IPv4协议来说,每个数据包最多可以携带1460字节的数据。因此,一个段的大小就是1460字节。

3. 只有特定类型的HTTP请求才能通过TFO方式发送。

GET请求不支持。TFO并不支持这种操作。POST请求因为,如果允许在服务器上进行写入操作的话,那么黑客就可以执行恶意活动,从而给服务器带来严重的损害。

TFO的工作原理:

无论是TCP客户端还是服务器,都必须支持TFO功能才能使用它。那么,问题来了:客户端和服务器如何相互通知对方自己支持TFO功能呢?答案就藏在TCP头部中。

TCP头部中的“Options”字段用于TFO功能。

  • TCP客户端使用它来请求TFO Cookie。
  • TCP服务器使用它来发送TFO Cookie。

在“选项”字段中,善良/可爱该变量存储了值为34的值。Cookie的长度共有16字节。当客户端向服务器发送SYN数据包时,就会设置这个数值。Kind = 34在“选项”字段中,当服务器检测到该值为34时,它就会知道客户端支持TFO功能,于是会请求获取cookies。服务器会生成一个唯一的cookie,并使用客户的IP地址来对其进行加密处理,这样每个客户都会拥有一个独特的cookie。最后,服务器会将生成的cookie发送给客户端。

因此,通过“客户端”和“服务器”这两个选项,双方可以互相了解对方是否支持 TFO,并共享 Cookie 信息。
请仔细查看该图表,观察在有无TFO的情况下,连接建立的情况。

TFO是否支持条件性GET请求呢?

它应该支持条件性GET请求。因为GET请求本质上属于只读操作,所以应该被TFO所支持。不过,从时间延迟的角度来看,这种请求并不适用。当本地服务器中的数据已经过时,无法再提供给客户端时,条件性GET请求就会从本地服务器发送到中央服务器。这样,中央服务器会获取最新的数据,并将其缓存到本地服务器中,以便为本地客户端提供服务。

Linux命令行:

在TFO中进行一些尝试/实验Linux内核通过使用一些命令:

检查 Linux 内核中 TFO 的默认设置

$ sysctl net.ipv4.tcp_fastopen

预期输出结果(即:客户端上启用了TFO的情况):

$ net.ipv4.tcp_fastopen = 1

如果您的机器是服务器,那么请启用TFO功能。

$ sudo sysctl -w net.ipv4.tcp_fastopen=2

预期输出:

$ net.ipv4.tcp_fastopen = 2

如果您的设备同时具备客户端和服务器功能,那么请启用TFO功能。

$ sudo sysctl -w net.ipv4.tcp_fastopen=3

预期输出结果

$ net.ipv4.tcp_fastopen = 3

禁用TFO功能

$ sudo sysctl -w net.ipv4.tcp_fastopen=0

预期输出结果

$ net.ipv4.tcp_fastopen = 0
              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料