一. TFO概述
为了改善网络APP的适当延迟,谷歌发表了通过变更TCP协议进行利用了3次握手的数据交换的TFO(TCPfastopen,RFC 7413 )。
TFO允许在TCP握手期间发送和接收第一个SYN包中的数据。 如果客户端和服务器都支持TFO功能,则可以减少到同一服务器的多个TCP连接的延迟。 这是通过在初始TCP握手后将TFO cookie保存到客户端来实现的。 当客户端稍后重新连接时,此TFO cookie将被发送到服务器,以便通过连续的TCP握手跳过往返延迟,从而减少延迟。
二. TFO原理图
一般的TCP连接步骤如下图所示
TFO的连接流程如下
客户端断开连接一段时间后,重新连接过程如下
使用TFO,您会发现连接时间减少了RTT的一个延迟。
三.开启TFO
RHEL7/CentOS7受支持,但缺省情况下未启用,因为TFO功能已开始与Linux 3.7内核集成。 按以下方式打开:
echo3/proc/sys/net/IP v4/TCP _ fast open
#3意味着打开TFO客户端和服务器端
#1表示打开客户端,2表示打开服务器端
除了内核支持外,还必须打开对APP应用程序的支持。 例如,nginx(1.5.8)的开启方法如下。
服务器{
listen 80 backlog=4096 fast open=256 default;
server_name _;
四. TFO客户支持情况
可以手动打开Linux 3.7或更高版本的内核。 3.13或更高版本的内核在缺省情况下处于打开状态。 默认值为1。
Windows10默认打开1607 (如果打开自动更新) ) )。
windows默认Edge浏览器14352或更高版本。
Linux、Android上的Chrome浏览器版本。 windows不支持版本。
Firefox浏览器默认关闭,可以手动打开。
虽然可以支持苹果的iOS 9和OS X 10.11,但是默认情况下可能没有启用。
linux上的curl 7.49或更高版本支持。
五. TFO测试
在服务器端打开了TFO,并配置为nginx支持TFO。
客户端打开TFO,将curl升级到7.61版。 然后使用curl访问HTTP页面进行测试。
客户端如下所示
# curl-s-o/dev/null-- TCP-fast open http://10.140.10.16 /
您可以使用ip tcp_metrics show查看cookie
# IP TCP _ metrics show|grep ' fo _ cookie '
10.140.10.16 age 41.955 sectw _ ts 282422045/42 secagortt 250 usrttvar 250 us cwnd 10 metric _ 52380 metric _ 61190 fo _ MSS 1460
服务器端捕获如下所示。 cookie,1640a20f99195995已经发行。
20336017:10.533466 IP 10.140.12.45.2872210.140.10.16.80: flags [ s ]、seq 1532602092、win 29200、option nn
20336017:10.533518 IP 10.140.10.8010.140.12.45.2872: flags [ s.],seq 108109466,ack 153260202093,ack nop,wscale 9,tfo cookie 1640a20f99195995,nop,nop],length 0
使用以下命令查看TFO连接的统计信息
# grep ' ^ TCP ext : '/proc/net/netstat|cut-d '-f87-92|column-t
tpofomergetcpchallengeacktcpsynchallengetcpfastopenactivetcpfastopenactivefailtcpfastopenpassive
9306 29958 2457 0 0 11
六.其他问题
下一个问题还没有解决。
客户端的TFOcookie将在多长时间后删除? 谁来维护和删除?
nginx的TFO队列具体是什么意思? 如果队伍排满了会怎么样? 数值设定多少比较合适?
队列是RFC7413中服务器的安全机制,超出队列的包将降级为普通的无cookie连接。 也就是说,TFO功能将被禁用。 但是,这个数值的具体设定不太好。
七.参考资料