• 面试题-你听过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后请求过程

    1. 客户端发送SYN数据包,该数据包包含Fast Open选项,且该选项的Cookie为空,这表明客户端请求Fast Open Cookie;
    2. 支持TCP Fast Open的服务器生成Cookie,并将其置于SYN-ACK数据包中的Fast Open选项以发回客户端;
    3. 客户端收到SYN-ACK后,缓存Fast Open选项中的Cookie。

    实施TCP Fast Open

    以下描述假定客户端在此前的TCP连接中已完成请求Fast Open Cookie的过程并存有有效的Fast Open Cookie。

    1. 客户端发送SYN数据包,该数据包包含数据(对于非TFO的普通TCP握手过程,SYN数据包中不包含数据)以及此前记录的Cookie;
    2. 支持TCP Fast Open的服务器会对收到Cookie进行校验:如果Cookie有效,服务器将在SYN-ACK数据包中对SYN和数据进行确认(Acknowledgement),服务器随后将数据递送至相应的应用程序;否则,服务器将丢弃SYN数据包中包含的数据,且其随后发出的SYN-ACK数据包将仅确认(Acknowledgement)SYN的对应序列号;
    3. 如果服务器接受了SYN数据包中的数据,服务器可在握手完成之前发送数据;
    4. 客户端将发送ACK确认服务器发回的SYN以及数据,但如果客户端在初始的SYN数据包中发送的数据未被确认,则客户端将重新发送数据;
    5. 此后的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_opentrue 或 在启动命令后面添加:--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
    

    所以我认为分析方法是正确的.

  • 相关阅读:
    問題集リンク(DEV I)
    認定Platformデベロッパー 試験範囲
    React 学习资源
    IIS
    小学校
    リストに項番をつける
    七、JavaScript函数
    六、JavaScript数组
    五、JavaScript流程控制
    四、JavaScript操作符
  • 原文地址:https://www.cnblogs.com/Serverlessops/p/12249539.html
Copyright © 2020-2023  润新知