不为人知的网络编程(十一):从底层入手,深度分析TCP连接耗时的秘密

      最后更新:2022-05-30 19:56:27 手机定位技术交流文章

      报纸作者张英飞对“讨论耗时的TCP连接”这个标题做了几处修改。

      1、引言

      使用基于互联网的通信方案(例如IM对话、传输系统)与互联网互动是不可行的。数据传输通常使用TCP规程。这是因为,根据TCP/IP集束传输层协议,TCP具有可靠的连接、错误的再传输、抽搐控制等等的优点。因此,申请场面已扩大到了UDP以外。

      我肯定你听说过TCP的缺陷,这些缺陷往往价格过高。但是,技术博客都谈论支出,或者少花钱,而不是提供详细的量化分析。没有营养学的胡说八道。

      在进行日常审议之后,我更想弄明白的是,TCP的价格是多少?能否进行量化。建立TCP连接需要很长时间。是多少毫秒,还是多少微秒?能否作出大致的定量估计?当然,各种因素影响TCP的耗时性质。比如网络丢包等等。我只是揭示我今天在专业业务中经历的相对高调的问题。

      如前所述,本条中介绍的底层和特定内核级方案的例子利用Linux系统作为实例,因为Linux内核的开放源码。

      学习交流:

      - 移动式终端IMM开发介绍:从零到移动式终端IMM

      - 开放源码即时通信框架资料来源:https://github.com/com/ JackJiang2011/MovedIMSDK(备份 URL在此)

      (本内容也可在http://ww.un.org/.52im.Net/thread-3265-1-1.html上查阅。 )

      2、系列文章

      本文件是一系列出版物的第十二期,概述如下:

      1. 未知网络编程(I): TCP 透析(前)
      2. 未知网络编程(II): TCP 透析(下一个)
      3. “未知的网络编程(II):为什么TCP连接断开?”
      4. 未知网络编程(四):深入调查并分析TCP的奇特关闭。
      5. 未知网络编程( V): UDP 连接和加载平衡
      6. 未知网络编程(VI):了解并很好地使用《UDP议定书》。
      7. 未知网络编程(七):如何使不可靠的民进联可靠?
      8. 未知网络编程(八):从数据传输层深处解密 HTTP
      9. 未知网络编程(IX):理论意义,在所有领域全面掌握DNS
      10. 未知网络编程(X):深入掌握操作系统,包括从内核(Linux)获取网络包的方法。
      11. 神秘网络编程(xi):深入探究耗时的TCP连接(本文)的奥秘。
      12. 未知网络编程(十二):透彻理解TCP维持生计机制
      13. 未知网络方案拟订(XII):全面掌握操作系统和网络通信。
      14. 未知网络程序( XIV) : 拔出网络并重新连接它。 TCP 是否仍然有效?

      3. 希望进行耗时的TCP连接分析

      为了理解TCP连接的耗时方面,我们必须首先理解建立连接的过程。

      在前文《 深入操作系统,了解从 Linux 内核获取网络软件包的程序 我们描述了交货是如何到达接收端的:交货来自发货人。RingBuffer的数据包DMA至RingBuffer在通过网络到达后,可在接收卡上查到。使用硬中断、温和中断和其他技术管理内核。 (如果用户发送数据,内核由用户处理。 )最后,它将发送到Socket的接收队列。并唤醒用户进程)。

      在软中断中,当内核从RingBuffer删除一个包裹时它在内核中作为支架 sk_buff 结构(参见包括/linux/skbuff 内核代码)。 (h)收到的数据是数据成员之一。一旦协议在一个楼层完成,通过移动指针到不同的数据点,查找与各级协议有关的数据。

      TCP 包页眉中有一个基本的外旗。

      如下图:

      TCP包件使用不同的标签分为SYNC、FIN、ACK或RST类:

      • 1)客户通过SYNC、ACK等软件包的指令内核通过连接系统访问服务器 TCP 连接;
      • 2)服务器端可收到大量连接请求,内核也需要各种辅助数据结构的支持,即半连接队列和完整连接队列。

      让我们看看整个链接:

      在这方面,让我们简要审查每一步骤的时间承诺:

      • 1)客户传输SYNC软件包:经常要求客户通过连接系统提供SYN,这需要系统呼叫和软中断的CPU耗时成本。
      • 2)SYN被传送到服务器上:SYN是从客户的网页卡中传输的,开始“穿过山和海,穿过山和海..这是一个长途网络传输;
      • 3)SYN 软件包由服务器处理:内核以软断开方式收集,然后在发送 SYN/ACK 答案之前储存在半连接队列中。这也是CPU的耗时费用。
      • 4)SYC/ACK被发送到客户:SYC/ACK在从服务器传输后,经过几个山峰和可能许多大洋到达客户。
      • 5)当客户提供和处理SYN时, CPU是由我们几个人处理的, 然后是ACK。它也是处理开支的软性中断。
      • 6)对服务器的ACK: 和 SYN 包, 例如, 大致相同距离。 另一长的互联网访问 。
      • 7)客户获得 ACK : 在服务器端, 接收和处理 ACK, 相关连接从半连接队列中撤回, 并放在全连接队列中 。
      • 8)服务器终端用户程序被唤醒:验证系统已停止的用户程序被唤醒,已经形成的连接被从完整连接队列中删除。 CPU 成本会因上下文而一次更改 。

      这些阶段分为两类:

      • 第一类:内核使用CPU接收、传输或处理,包括系统呼叫、软中断和上下文转换。
      • 第二类是网络传输,如果从计算机传送一个包件,则通过各种网络线路和多开关路由器进行,因此,网络传输比CPU处理所需时间要长得多,根据互联网,一般从几毫秒到几百毫秒不等。

      由于1米相当于100 00次,网络传输需要1 00次(如果不是10万次),比两端的CPU长1 00次(如果不是10万次)。

      因此,在形成标准的TCP连接过程中,人们常常认为网络被推迟。

      PS: 一个 RRT 指的是一个软件包从一个服务器返回另一个服务器所需的时间 。

      总体而言,TCP连接的网络大约需要3个传输器,加上两侧的几个处理器,总共大约需要1个。

      不过,从客户的角度来看,只要ACK软件包发出,它就不会起作用。内核认为连接成功因此,如果在客户端建立TCP连接需要时间,那么我们需要很长时间才能做到这一点。它只需要两个传输,这比一个遥控飞行器要长一点。(从服务器的侧面,自收到SYN软件包以来,到收到ACK,单一次难民审查法庭也需要时间)。

      4. 在严重的情况下,进行耗费时间的TCP连接分析

      如前一节所示,TCP连接的总时间从客户的角度来说,一般是围绕网络的RTT的时期。如果每件事都如此直截了当,我不认为我的贡献是必需的。事故会发生。

      这可能导致在TCP连接发生时网络传输增加耗费时间,CPU处理成本较高,甚至在某些情况下连通失灵。 本节将分析在极端情况下TCP连接的耗时性质,分析我在网上观察到的沟渠。

      四.1 失控 客户连通时间

      常规系统需要我们几个人(微秒)打电话。但是在我的《 找到那个用过服务器CPU的刺客! 》一文中,我的一个服务器处于困境:我的一个同事运输公司告诉我,这种服务对CPU来说是不够的。需要扩容。

      在那一刻,服务器正在注意以下图表:

      该服务能够承受每秒2,00 qps, CPU的idel是70%或以上, 突然CPU就不够了。

      更有趣的是,当CPU被击中谷底时,负载并不高(服务器有四台核机器,而负载3-4更正常)。

      随着TCP客户时间-WAIT达到30,00人,政府显然可以这样做。现在不是使用港口的好时机, 但使用港口的时机也不是坏时机。连接系统使用的CPU成本增加了两倍多。每次需要2500欧元(微秒)。达到了毫秒级别。

      当出现这种困难时,尽管TCP连接只需要大约2毫秒才能确定,但总TCP连接似乎花费了太长的时间才能被接受。 尽管如此,问题在于这2毫秒中的大多数都在吃CPU周期,因此问题并非无关紧要。

      这是一个非常直截了当的问题 要解决。有几种方法可以实现这一点: 改变内核设置。net.ipv4.ip_local_port_range有可能保留更多的港口数量和较长的连接。

      TCP 半/全连队/全连队配满TCP的情况

      如果在创建连接过程中任何队列已满, 客户端的同步或 ack 将被忽略。 在等待很长一段时间后, 客户端将发送 TCP 重新传输 。

      拿半连接队列举例:

      你没有意识到的是 TCP握手的那一刻 是第二层换句话说,如果服务器端端的连接队列失败, 启动连接不可行 。因此,建立连接至少需要几秒钟。同一房间的典型情况 仅仅不到一毫秒比这大一千倍

      特别是向用户提供实时服务的过程将对用户的经验产生重大影响。 如果再传输未能成功握手,用户很可能将无法等待再尝试,用户的访问将超时。

      另一个问题是它有能力影响其他用户。

      如果您使用进程/线性资源库等模型提供服务,比如: php-fpm 。我们知道,Fpm程序已经停顿。当它回应用户的要求时,该程序无法答复更多的询问。如果您开始100个进程或线条,某个时候,50张流程/线卡与一个与 redis 或 Mysql 服务器握手的握手连接(记住,您的服务器现在位于 TCP 连接的客户端) 。日常工作只有50个流程/线可以在整个时间段使用。50名雇员可能根本无法处理。这就是你们可能负担过重的时候。如果能再长一点的话可能就产生雪崩了,整个服役期很可能因此受到影响。

      由于影响可能很严重,我们如何判断问题是否由完全/半连接队列造成?

      在客户端上, 您可以下载软件包, 看看是否有 SYN TCP 转播。 如果有 SYN TCP 转播, 相关的服务端连接队列可能会有麻烦 。

      检查服务结束日期似乎比较简单。netstat -s当前系统的半连接队列可访问丢失的软件包数据, 但此数字记录了丢失的软件包的总数。 您必须使用此数据来获取当前系统的半连接队列的丢失软件包 。 但此数字记录了丢失软件包的总数。 您必须再次使用它 。watch如果以下数字在整个监测过程中发生变化,则意味着当前服务器有一个半连接队列中的拖放软件包。您可能需要扩大半连接队列的长度。

      $ watch'netstat -s | grep LISTEN'

      8 SYNs to LISTEN sockets ignored

      完整连接队列的浏览技术相似 :

      $ watch'netstat -s  | grep overflowed'

      160 timesthe listen queue of a socket overflowed

      一种方法是提高半/完整连接队列的长度, 如果服务因完整队列而丢失。 Linux 内核的半连接队列长度通过 tcp_max_ syn_backlog 增加到合理数量 。

      # cat /proc/sys/net/ipv4/tcp_max_syn_backlog

      1024

      # echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog

      整个连接 Quue 长度是当应用程序联系 listen. net. com. 我不确定您在说什么, 核心。 Somaxconn 越小。 您可能需要同时修改您的应用程序和内核参数 。

      # cat /proc/sys/net/core/somaxconn

      128

      # echo "256" > /proc/sys/net/core/somaxconn

      修改后,我们可以验证 ss 命令的 Send-Q 输出的最终有效性长度 :

      $ ss -nlt

      Recv-Q Send-Q Local Address:Port Address:Port

      0      128    *:80               *:*

      recv- Q 告诉我们当前进程完整连接队列的长度。 如果 recv- Q 正在接近 Send- Q, 可能不必等待袋滴可以扩展您的整行 。

      如果在排队人数增多后仍然有极不常见的排队,我们现在就可以忍受这种情况。

      万一还能应付呢?

      另一种方式是明确传达错误,不允许客户再等待。

      Redis、 Mysql 和其他后端界面的内核设置是 tcp_abort_on_overflow 1 。如果队列满了,直接送去阴蒂通知后端进程/行,它们不能不敏感地等待 。Clit 现在将接收错误“ 由对等方重新设定对等反应 ” 。博客在一篇题为「生命权」的文章中写道:总比炸掉整个车站好

      5. TCP连接TCP连接物理分析需要时间

      5.1.1 试验准备工作

      我制作了一些简单易懂的代码 来计算在客户端的基础上 建立TCP连接需要多长时间

      <?php

      $ip = 服务期

      $port=服务器端口;

      $count= 50000;

      function buildConnect($ip,$port,$num){

      for($i=0;$i<$num;$i++){

      $socket= socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

      if($socket==false) {

      我不知道你在说什么,但我不知道你在说什么, 套接龙(socket_ last_error ($socket))"n";

      sleep(5);

      continue;

      }

      if(false == socket_connect($socket, $ip, $port)){

      我不知道你在说什么,但我不知道你在说什么, 套接龙(socket_ last_error ($socket))"n";

      sleep(5);

      continue;

      }

      socket_close($socket);

      }

      }

      $t1= microtime(true);

      buildConnect($ip, $port, $count);

      echo(($t2-$t1)*1000).'ms';

      在测试之前,我们需要一个合适的港口 来安装这台电脑, 如果没有足够的5万个,我们需要修改这些港口。

      # echo "5000   65000" /proc/sys/net/ipv4/ip_local_port_range

      5.2 在典型条件下试验

      注意:客户端和服务器都不应选择在线计算机;否则,你的实验可能会干扰正常用户访问。

      首先,我的客户位于怀北的国际数据中心机房,服务器从该公司的广东飞机室取来一台机器,执行定购单的延迟时间约为37毫秒,在使用上述脚本进行50 00次连接之后,收到的平均连接时间为37毫秒。

      我们以前也是这么说的对于客户端来看,需要的就是第三次握手。我认为那是握手所以,这只是一个RRT,两个传输, 和很多时间。虽然有客户和服务型系统需要开支、软削减和其他费用,但仍有许多工作要做。然而,他们的价格往往只是我们中的少数人(微秒),他们也只是我们中的少数人。因此,在建立总联系方面的拖延是微不足道的。

      然后我修改了目标服务器北京是服务器所在地离怀来有一些距离,然而,它比广东岛更近。这次从RRT跳出是1. 6 -1,大约在7点左右当客户统计数据形成50 00个连接时,每连接需要1.64米计算1个连接。

      另一个实验:这个所选实验的服务器和客户端都位于同一个机房。10时30分时超时跑了以上脚本以后,实验产生了50 00个TCP连接,耗资11605毫秒。平均每次需要0.23米。

      该架构显示,当在线浏览时,在同一空间仅延迟几分钟。然而,离发动机室不远。TCP单独握手需要四次。如果我们进入广东这是百倍的时间差线上部署时,最佳解决办法是在同一地区部署不同的Mysql、Redis和其他依赖这些服务的服务、机房(更变态一点)和房间。有可能是同一个架子因此所有包含 TCP 连接的网络包将更快运行 。应尽可能避免在整个区域长途移动机舱。

      五.3 TCP 连接队列排队外溢出的测试

      跨区域、 行星间房间和跨机器的测试已经完成 。 当您这次直接接通计算机时会怎样?

      平的目前或延迟 很可能是零点零二米 大大低于其他机器,RRT。 我相信连接会非常迅速,嗯,测试。

      连续5WTCP连接:总时间使用27154毫秒,每次平均为0次,54毫秒。

      那么,它比机器要长那么久是怎么回事?

      以理论为根据我们应该考虑这一点,因为现有的难民审查法庭是不够的。因此,有若干要求要求迅速建立连接。因此,将填满全连接队列或半连接队列。一旦发生队列满,当时收到的连接请求需要三秒钟的延迟。根据上述实验的结果,平均而言,它似乎远远大于难民工作队。

      在实验期间,我用tcpdump袋观察了下一个场景。握手的一小部分用了3+,因为半连接队列满,客户不得不等待更长时间才能重新传送SYN。

      我们每500个连接在一秒内改变路线。 最后,没有卡片(或者我们可以延长连接队列) 。

      结论是,这架飞机上的50 00 TCP连接总共需要102399毫秒的客户统计数据,睡眠为100秒,平均为每TCP连接0 048毫秒。

      这是因为当遥控飞行器变得足够小时,内核CPU需要时间才能出现,而TCP连接比Ping的 icmp 协议要多一点,因此比 ping 延迟略大于零。 通常看到大约 02 ms 。

      6、本文小结

      TCP连接可能需要几秒钟才能产生反常现象,因为反常现象会影响用户的经验,甚至允许现有用户在一段时间内访问它。 另一个不利因素是雪崩的可能性。

      由于您的服务器使用短连接来获取数据, 学习如何检测服务器连接中的异常, 至关重要 。如果有,学会优化掉它。当然,你也可以使用自己的记忆缓存。相反,使用连接池来维持连接。两种方法都可直接避免TCP握手的不同开支。

      此外,TCP通常在两台机器之间有大约1个RRT的延迟时间,从而浪费时间。这是避免不了的。尽管如此,您仍可以通过调整两个装置之间的实际距离来缩短该 RRT 。例如,您想要访问的复选程序尽可能贴近后端界面计算机。这样,RTR可以从几十毫秒减少到零毫秒。

      最后,考虑一下:如果服务器设在北京,是否可以向纽约的用户提供访问机会?

      我们会在同一间前厅跨机房也好,由于实际距离较近,电信传输量基本上微乎其微。网络延迟的主要原因是传输设备耗时运行。但是,如果它是 半个世界,电信传输需要时间,我们可以以此为基础。北京和纽约相距约15 00公里。因此,让我们推倒设备时间表。只有光速才能发送和接收数据(RTT代表往返旅行时间)。要跑两次),时间=15 00 00 * 2/光速=100毫秒实际拖延可能更大。200米以上是典型现象。建立在这个延迟上,很难向用户提供二流服务。所以对于海外用户,最好设立一个当地办事处或从外部购买服务器。

      附录:进一步基于网络的方案拟订准确性数据

      [1] 基本网络方案编制信息:

      1. TCP/IP 规格 - 第17章 TCP: 发射控制议定书
      2. 改变世界的TCP/IP协定(珍贵地图、移动电话警告)
      3. 对《TCP协定》的一般知识(更新):理论依据
      4. "三握手四波:理论经典"
      5. P2P 技术规格(一):NAT规格 -- -- 综合概念、P2P概况
      6. Lazy人民互联网编程输入(I):快速了解网络通信议定书(前)
      7. " 懒惰者因特网编程(II):网络通信协议快速知识(下一步) "
      8. “互联网编程懒惰者(II):快速理解TCP协议就足够了。”
      9. 介绍懒惰者网络编程(四):快速了解TCP和UDP之间的差别
      10. “Internet programming Lazy persons (V):简要解释为什么UDPs往往优于TCPs。
      11. “为懒惰者提供互联网编程入门(VI):世界最受欢迎的枢纽、开关和路由器功能。”
      12. 介绍懒惰者网络编程(七):深潜,完全了解《HTTP协定》
      13. “懒惰的人(八):手教你如何建造基于TCP的套接字长连网。”
      14. “向懒惰者介绍互联网编程”(九):“有IP地址时为何使用MAC地址?”
      15. “互联网编程懒惰者(10):时间到便,快速阅读QuIC协议”
      16. “为懒惰者介绍互联网编程”(十一):研究一本IPv6书。
      17. “为懒惰者(十二)介绍互联网编程(十二):一短读HTTP/3协议书!”
      18. 学习TCP与UDP之间的差别。
      19. “互联网编程懒惰者(xiv):什么是Socket?”
      20. “技术知识普及:QUIC制定新一代基于UDP的低时网络传输层协议”
      21. 加快互联网的速度:新一代QUIC电信技术做法分享
      22. "解释一下iOS程序长的链接"
      23. IPv6 技术细节:基本概念、目前适用情况、以往技术惯例
      24. IPv6 技术细节:基本概念、目前适用状况、技术实践(下一步)
      25. Java IPv6 支助:支助、必要的API、示范守则
      26. “从HTTP/0.9到HTTP/2:在单一条款中理解HTTP协定的历史演变和设计”
      27. 学习TCP握手三次, 并跟随动画四波。
      28. “大脑缺陷网络编程入门(二):阅读和写索克特时,我们读和写什么?”
      29. “引入脑缺陷网络编程(II):一些HTTP协议谅解”
      30. 脑疾病网络编程介绍(四):促进快速HTTP/2理解的服务器推动
      31. "对脑残疾网络(V)编程的介绍: 每天的平时指挥" "它到底是什么?"
      32. “大脑缺陷网络编程入门(VI):公共IP和内部IP是什么?”“NAT转换到底是什么?”
      33. “脑损伤网络编程入门”(七):视觉必要性,历史中最受欢迎的计算机网络。
      34. "引入脑有缺陷的网络编程: 你知道区别吗?"
      35. “介绍脑有缺陷的网络编程(IX):需要访谈,这是历史上最受欢迎和反播的。”
      36. "高层次:一个网络基础 使优秀的Android程序员了解"
      37. 机器人程序员必须使用网络通信层协议UDP和TCP。
      38. " 分享技术 " :从基层学习网络程序 " 。
      39. 可通过TPCP连接发送多少 HTTP 请求?
      40. “5G时代在这里,TCP/IP过时了,你能吃吗?”
      41. >> 更多同类文章 ……

      [2] 高级别网络方案编制信息:

      1. 在高性能网络编程(I)中,单一服务器和放行有多少TCP连接?
      2. 高绩效网络方案编制(二):在过去十年中,对众所周知的C10K连结问题进行了研究。
      3. 高绩效网络规划(II):现在是时候作为一个群体考虑未来十年的C10M。
      4. 高绩效网络方案编制(四):C10K至C10M高绩效网络应用理论研究
      5. 高绩效网络方案拟订(五):高绩效网络方案拟订改为一/一模式
      6. 高绩效网络方案拟订(六):阅读高绩效网络方案拟订线模式。
      7. 高绩效网络方案(七):高与高之间有什么区别?一个单词被理解了!
      8. 零基地,历史中前5G技术识字水平最高(10):向IMM开发者介绍零基本通信技术
      9. “IM开发商关于零基本通信技术的指南(XI):无线通信为何失败?”
      10. “IM开发商关于零基本通讯技术的指南(十二):互联网,卡顿?”互联网关闭了吗?
      11. “零基本通讯技术(XII)入门:为什么手机有弱信号?”
      12. “IM开发商对零基本通信技术的介绍(XIV):在高铁上连接无线上网有多困难?”
      13. " 零基本通信技术(XV):了解定位技术,一个就够了 "
      14. 例如,“理解实时通信在网络接入层结构服务端使用网络接入层结构的技术障碍。”
      15. 分享专门知识:对高性能长网关技术技术知识达数千度之多。
      16. “拯救和种子技术共享:10亿级移动接入网关的技术成长”
      17. >> 更多同类文章 ……

      (本内容也可在http://ww.un.org/.52im.Net/thread-3265-1-1.html上查阅。 )

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/26510.html

          热门文章

          文章分类