一直以来对内核没有太多研究,最近国外业务扩展较快,国外没有节点。所以 国外用户访问国内服务器时,延时比较大。为了解决这个问题,在香港上了一个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%。
除了页面加载变快改善了用户体验之外,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确认,即开始发送相应数据。
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 (北美服务器) |
测试结果 | |||
编号 | 测试项 | 测试结果 | 操作命令 |
1 | kernel开启,关闭TFO是否生效 | 验证通过 | sysctl -w net.ipv4.tcp_fastopen=3 |
2 | 服务端lighttpd开启,关闭TFO是否生效 | 验证通过 | server.tcp-fastopen = "enable" |
3 | client端开启,关闭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 |
6 | TCP与TFO局域网对比测试 | ---------------------------------------------------- 普通模式下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 |
7 | TCP与TFO北美与大陆对比测试 | ------------------------------------------- 普通模式下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文档。
转载于:https://blog.51cto.com/davidbj/1426220