TCP协议是大多数应用程序层协议(例如HTTP,SSH,FTP,NFS等)的基础。事实上,TCP位于IP层(IP地址路由)和应用程序层(用户数据)之间,并负责保证和有序字节流传递。TCP也是指示源端口和目标端口的层。

应用程序对发送方和接收方之间的距离如此敏感的原因之一是,TCP 在发送任何用户数据之前需要进行3次握手。

  1. 发送方向接收方发送一个TCP同步(SYN)数据包,指示其进行传输的愿望;
  2. 接收方以TCP-SYN / ACK数据包作为响应,同时确认发送方并打开自己的TX管道(TCP是双向的)。
  3. 最后,发送方发送一个TCP-ACK数据包以确认接收方的传输意图。

仅在  步骤3之后,发送方才可以真正开始发送数据。实际上,如果查看Wireshark跟踪,通常会看到发送方的TCP-ACK数据包紧跟着一堆数据包。

因此,发送方和接收方之间的距离问题在于,它在步骤1步骤2之间产生了有意义的延迟。此延迟称为往返时间(RTT,也称为ping时间),因为发送方必须等待其数据包一直传输到接收方,然后等待答复返回。

这就是TCP快速打开(TFO)的地方。TFO是TCP协议的扩展,它允许  握手期间启动连接,方法是允许TCP-SYN数据包的有效负载中的数据,从而触发服务器的即时响应。 。

但是,只有在执行了正常的初始握手之后,才能进行TFO。换句话说,TFO扩展提供了一种方法,发送方和接收方可以通过该方法保存彼此之间的一些数据,并基于TFO cookie在历史上相互识别。

TFO非常有用,因为:

  1. TFO是一个内核设置,因此可用于所有希望从TFO中受益的应用程序。
  2. TFO可以 在应用程序的生命周期内有意义地加速打开,使用-关闭连接的应用程序。

加速度有多有意义?首先,有意义的是考虑减少响应时间。如果发送方和接收方彼此分开,则尤其如此。例如,您可能希望您的电子商务站点更快地加载单个目录项,因为每次延误都是客户三思而后行或走开的机会。作为另一个示例,减少用户点击播放按钮与视频实际开始时间之间的时间可以显着改善用户体验。就响应时间而言,它是RTT的函数。

其次,就周转时间而言,这可能非常有意义。如果考虑花费在传输较小文件上的时间,则初始延迟通常比实际数据传输时间大一个或多个数量级。例如,如果应用程序正在同步许多小文件或中文件,则消除握手延迟可以显着改善总传输时间。

为NGINX启用TFO

好的,让我们开始工作,有3个任务需要完成:

  1. 更新内核设置以支持TFO;
  2. 具有TFO支持的源代码编译NGINX;
  3. 修改NGINX配置以接受TFO连接。

TFO的内核支持

从3.7开始,对IPv4 TFO的客户端和服务器支持已合并到Linux内核主线中–您可以使用来检查您的内核版本uname -r。如果您运行的是3.13,则可能默认情况下已启用TFO。否则,请按照以下步骤将其打开。

 

  • 以root用户身份创建文件  /etc/sysctl.d/tcp-fast-open.conf,其内容如下
  • net.ipv4.tcp_fastopen = 3
    
      
    net.ipv4.tcp_fastopen = 3
    Restart sysctl:
    # systemctl restart systemd-sysctl
    
    # systemctl restart systemd-sysctl
    Check the current setting:
    # cat /proc/sys/net/ipv4/tcp_fastopen 3
      
    # cat /proc/sys/net/ipv4/tcp_fastopen

    使用TFO支持编译NGINX

    大多数NGINX软件包当前不包括TFO支持。TFO所需的最低NGINX版本为1.5.8。但这是一个相当旧的版本,因为NGINX现在为1.9.7。接下来的过程将使用1.9.7,但可能会在将来的NGINX版本中使用。检查NGINX新闻页面以获取最新版本。

    1. 以普通用户(不是root用户)的身份下载NGINX源  nginx-1.9.7.ta​​r.gz,将其压缩并移至nginx-1.9.7目录
    2. sudo yum install wget -y wget http://nginx.org/download/nginx-1.9.7.tar.gz tar -xvf nginx-1.9.7.tar.gz cd nginx-1.9.7
      
      sudo yum install wget -y
      wget http://nginx.org/download/nginx-1.9.7.tar.gz
      tar -xvf nginx-1.9.7.tar.gz
      cd nginx-1.9.7

      安装Fedora EPEL存储库(必须在下一个yum install命令之前完成)

    3. sudo yum install -y epel-release
    4. 安装必备软件包:

      sudo yum install -y gcc zlib-devel libatomic_ops-devel pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel gperftools-devel
      

      配置构建,并指定  -DTCP_FASTOPEN=23 编译器标志。还要注意,--prefix=/usr/share/nginx配置选项指定了安装根目录,并且还需要手动设置一些其他目录。如果您不担心粉碎现有的NGINX安装和/或想要构建更标准的安装,请将prefix选项更改为/ usr并从其余路径规范中删除  / usr / share / nginx前缀。

      $ ./configure  --prefix=/usr/share/nginx  --conf-path=/usr/share/nginx/etc/nginx/nginx.conf  --error-log-path=/usr/share/nginx/var/log/nginx/error.log  --http-log-path=/usr/share/nginx/var/log/nginx/access.log  --http-client-body-temp-path=/usr/share/nginx/var/lib/nginx/tmp/client_body  --http-proxy-temp-path=/usr/share/nginx/var/lib/nginx/tmp/proxy  --http-fastcgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/fastcgi  --http-uwsgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/uwsgi  --http-scgi-temp-path=/usr/share/nginx/var/lib/nginx/tmp/scgi  --user=nginx  --group=nginx  --build="TFO custom build"  --with-threads  --with-file-aio  --with-ipv6   --with-http_ssl_module  --with-http_v2_module   --with-http_realip_module  --with-http_addition_module  --with-http_xslt_module  --with-http_image_filter_module  --with-http_geoip_module  --with-http_sub_module  --with-http_dav_module  --with-http_flv_module  --with-http_mp4_module  --with-http_gunzip_module  --with-http_gzip_static_module  --with-http_auth_request_module  --with-http_random_index_module  --with-http_secure_link_module  --with-http_degradation_module  --with-http_stub_status_module   --with-mail  --with-mail_ssl_module  --with-stream  --with-stream_ssl_module  --with-google_perftools_module   --with-pcre  --with-pcre-jit  --with-google_perftools_module  --with-debug  --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -DTCP_FASTOPEN=23'  --with-ld-opt='-Wl,-z,relro -Wl,-E'

       

编译NGINX

make

make install

用于TFO的NGINX配置

使用TFO就像将fastopen选项添加到服务器的listen指令一样简单。从NGINX文档中:

fastopen = number为侦听套接字(1.5.8)启用“ TCP快速打开”,并限制尚未完成三向握手的连接队列的最大长度。
编辑/ usr / share / nginx / etc / nginx / nginx.conf文件,并按如下所示修改您的listen指令:
listen 80 fastopen=256
夜河资源网提供的所有内容仅供学习与交流。通过使用本站内容随之而来的风险以及法律责任与本站无关,所承担的法律责任由使用者承担。
一、如果您发现本站侵害了相关版权,请附上本站侵权链接和您的版权证明一并发送至邮箱:yehes#qq.com(#替换为@)我们将会在五天内处理并断开该文章下载地址。
二、本站所有资源来自互联网整理收集,全部内容采用撰写共用版权协议,要求署名、非商业用途和相同方式共享,如转载请也遵循撰写共用协议。
三、根据署名-非商业性使用-相同方式共享 (by-nc-sa) 许可协议规定,只要他人在以原作品为基础创作的新作品上适用同一类型的许可协议,并且在新作品发布的显著位置,注明原作者的姓名、来源及其采用的知识共享协议,与该作品在本网站的原发地址建立链接,他人就可基于非商业目的对原作品重新编排、修改、节选或者本人的作品为基础进行创作和发布。
四、基于原作品创作的所有新作品都要适用同一类型的许可协议,因此适用该项协议, 对任何以他人原作为基础创作的作品自然同样都不得商业性用途。
五、根据二〇〇二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可不经软件著作权人许可,无需向其支付报酬!
六、鉴此,也望大家按此说明转载和分享资源!本站提供的所有信息、教程、软件版权归原公司所有,仅供日常使用,不得用于任何商业用途,下载试用后请24小时内删除,因下载本站资源造成的损失,全部由使用者本人承担!