面试题-你听过TCP Fast Open (TFO/TCP快速打开)吗?能解释一下吗?
Posted passzhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题-你听过TCP Fast Open (TFO/TCP快速打开)吗?能解释一下吗?相关的知识,希望对你有一定的参考价值。
TCP Fast Open (TFO/TCP快速打开)
TCP快速打开(TCP Fast Open,TFO)是什么?
TCP快速打开(TCP Fast Open,TFO)是对TCP的一种简化握手手续的拓展,用于提高两端点间连接的打开速度。简而言之,就是在TCP的三次握手过程中传输实际有用的数据。这个扩展最初在Linux系统实现,Linux服务器,Linux系统上的Chrome浏览器,或运行在Linux上的其他支持的软件。
它通过握手开始时的SYN包中的TFO cookie来验证一个之前连接过的客户端。如果验证成功,它可以在三次握手最终的ACK包收到之前就开始发送数据,这样便跳过了一个绕路的行为,更在传输开始时就降低了延迟。这个加密的Cookie被存储在客户端,在一开始的连接时被设定好。然后每当客户端连接时,这个Cookie被重复返回。(参考:维基百科)
增加Fast Open后请求过程
请求Fast Open Cookie
- 客户端发送SYN数据包,该数据包包含Fast Open选项,且该选项的Cookie为空,这表明客户端请求Fast Open Cookie;
- 支持TCP Fast Open的服务器生成Cookie,并将其置于SYN-ACK数据包中的Fast Open选项以发回客户端;
- 客户端收到SYN-ACK后,缓存Fast Open选项中的Cookie。
实施TCP Fast Open
以下描述假定客户端在此前的TCP连接中已完成请求Fast Open Cookie的过程并存有有效的Fast Open Cookie。
- 客户端发送SYN数据包,该数据包包含数据(对于非TFO的普通TCP握手过程,SYN数据包中不包含数据)以及此前记录的Cookie;
- 支持TCP Fast Open的服务器会对收到Cookie进行校验:如果Cookie有效,服务器将在SYN-ACK数据包中对SYN和数据进行确认(Acknowledgement),服务器随后将数据递送至相应的应用程序;否则,服务器将丢弃SYN数据包中包含的数据,且其随后发出的SYN-ACK数据包将仅确认(Acknowledgement)SYN的对应序列号;
- 如果服务器接受了SYN数据包中的数据,服务器可在握手完成之前发送数据;
- 客户端将发送ACK确认服务器发回的SYN以及数据,但如果客户端在初始的SYN数据包中发送的数据未被确认,则客户端将重新发送数据;
- 此后的TCP连接和非TFO的正常情况一致。
注:客户端在请求并存储了Fast Open Cookie之后,可以不断重复TCP Fast Open直至服务器认为Cookie无效(通常为过期)。[4]
为Linux系统开启 TCP Fast Open (TFO)
How
为Linux系统开启TFO实际上非常简单,这里参考了wiki上对此的说明。
TFO要求
Linux内核版本在Linux 3.7以上
Linux开启TFO方法
以root权限执行一下命令
# echo 3 > /proc/sys/net/ipv4/tcp_fastopen
并在开机自启动脚本(/etc/rc.local)添加。
在/etc/sysctl.conf中添加
net.ipv4.tcp_fastopen = 3
shadowsxcks开启支持
在shadowsxcks的config.json中设置fast_open
为true
或 在启动命令后面添加:--fast-open
。
为nginx 开启 TCP Fast Open (TFO)
我在我的一台服务器上配置了Nginx和Apache. nginx服务器在端口81上侦听端口80和Apache.Nginx用作反向代理.在nginx中,我配置了TCP Fast Open:
server {
listen 192.168.25.223 fastopen=50;
server_name servtest.com www.servtest.com;
服务器本身也启用了TCP Fast Open:
root@server:~/projects/nginx# cat /proc/sys/net/ipv4/tcp_fastopen
3
为了测试这是否有效,我在运行Ubuntu的PC上配置Chrome以使用TCP Fast Open(chrome:// flags页面).客户端上的tcp_fastopen设置设置为1.
在服务器上,我使用以下grep来查明是否使用了TCP Fast Open:
grep '^TcpExt:' /proc/net/netstat | cut -d ' ' -f 87-92 | column -t
TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenPassive TCPFastOpenPassiveFail
0 2 2 0 0 0
我相信TCPFastOpenActive和/或TCPFastOpenPassive计数器不应该是“0”如果这工作.任何想法如何实际找出是否使用TCP Fast Open并按预期工作?如果我需要提供更多信息,请告诉我.
使用TCP快速开放测试代码完成了一些测试
使用测试代码时,我的计数TCPFastOpenPassive会上升.
$grep '^TcpExt:' /proc/net/netstat | cut -d ' ' -f 87-92 | column -t
TCPOFOMerge TCPChallengeACK TCPSYNChallenge TCPFastOpenActive TCPFastOpenActiveFail TCPFastOpenPassive
1000 56217 1316 0 0 2041
所以我认为分析方法是正确的.
以上是关于面试题-你听过TCP Fast Open (TFO/TCP快速打开)吗?能解释一下吗?的主要内容,如果未能解决你的问题,请参考以下文章