一直以来对内核没有太多研究,最近国外业务扩展较快,国外没有节点。所以         国外用户访问国内服务器时,延时比较大。为了解决这个问题,在香港上了一个proxy,通过proxy回国内节点获取数据,最后返回客户端。为提高回源性能,有人提出TFO解决方案,以前没有听说过。所以来学习一下。


1. TFO(tcp fast open)简介

      为了改善web应用相应时延方面的一个工作,google通过修改TCP协议利用三次握手时进行数据交换的TFO。和TCP相比TFO在3次握手期间也会传输数据。TFO是GOOGLE发布的。目前chrome已经支持TFO,但默认是关闭的,因为它有一些特定的使用场景。


TFO:

1.首先HTTP请求需要TCP三次握手,尽管开启keepalive(长连接),可以依然有35%的请求是重新发起一条连接。而三次握手会造成一个RTT(Round Trip Time)的延时,因此TFO的目标就是去除这个延时,在三次握手期间也能交换数据。RTT在比较低时,客户端页面加载时间优化大约在4%~5%;RTT越长,好处越大,平均大约在25%。

wKiom1Oadh-z8BLNAAGXqOc6Rfg837.jpg

     除了页面加载变快改善了用户体验之外,TFO给服务器也带来了一些好处。由于每个请求都节省了一个RRT,相应地也减少了服务器端Cpu消耗。经过测试TFO每秒食物数有2876.5提升到3548.7.


2. TFO工作原理

    > 客户端发送SYN包,包尾加一个FOC请求,只有4个字节。

    > 服务端受到FOC请求,验证后根据来源ip地址声称cookie(8个字节),将这个COOKIE加载SYN+ACK包的末尾发送回去。

    > 客户端缓存住获取到的Cookie 可以给下一次使用。

    > 下一次请求开始,客户端发送SYN包,这时候后面带上缓存的COOKIE,然后就是正式发送的数据。

   > 服务器端验证COOKIE正确,将数据交给上层应用处理得到相应结果,然后在发送SYN+ACK时,不再等待客户端的ACK确认,即开始发送相应数据。

   wKiom1Oae1HjiM3AAAPL4Ibe0aM878.jpg


3.环境搭建

     

                                       TFO环境搭建
 1内核升级到2.6.32-916.358.23.2包括服务端和客户端
 2确认开启FTO,tcp_fastopen服务端建议=3, 客户端建议=1
 3

安装lighttpd,lighttpd.conf配置文件加入最后server.tcp-fastopen="ensable",

如果启动失败可以配置server.use-ipv6="disable"

 4用opfen.c 进行测试
 5

测试环境Server Ip:10.58.241.155 client IP:10.58.241.154(局域网),65.255.32.123

(北美服务器)


                                  测试结果
编号测试项测试结果操作命令
1kernel开启,关闭TFO是否生效验证通过sysctl -w net.ipv4.tcp_fastopen=3
2服务端lighttpd开启,关闭TFO是否生效验证通过server.tcp-fastopen = "enable"
3client端开启,关闭TFO是否生效验证通过sysctl -w net.ipv4.tcp_fastopen=1
4数据包是否可以接收验证通过(HTTP/1.1 200 ok)./fopen_new -h 10.58.241.155 -p 80 -c 1024 -d
5数据包内容是否正确验证通过(两种模式下均匀 Content-Length:844)./fopen -h 10.58.241.155 -p 80 -c 1024 -d
6TCP与TFO局域网对比测试

wKioL1ObE5WiZZ5CAAGHOeRpg6I228.jpg

----------------------------------------------------

普通模式下1024次请求耗时:272微秒

TFO模式下1024次请求耗时:198微秒

1024次请求性能: (272/198-1)*100 ~=37%

./fopen -h 10.58.241.155 -p 80 -c 1024 -f


./fopen -h 10.58.241.155 -p 80 -c 1024 -d

7TCP与TFO北美与大陆对比测试wKioL1ObFGqCnT1zAAGIdzOTEmo126.jpg

-------------------------------------------

普通模式下1024次请求耗时:588584微秒

TFO模式下1024次请求耗时:288504微秒

1024次请求性能:(588584/288504-1)*100~=104%

./fopen -h 10.58.241.155 -p 80 -c 1024 -f


./fopen -h 10.58.241.155 -p 80 -c 1024 -n

   更多关于TFO资料,请查看附件RFC文档。