最后更新:2022-05-30 19:56:27 手机定位技术交流文章
报纸作者张英飞对“讨论耗时的TCP连接”这个标题做了几处修改。
使用基于互联网的通信方案(例如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上查阅。 )
本文件是一系列出版物的第十二期,概述如下:
为了理解TCP连接的耗时方面,我们必须首先理解建立连接的过程。
在前文《 深入操作系统,了解从 Linux 内核获取网络软件包的程序 我们描述了交货是如何到达接收端的:交货来自发货人。RingBuffer的数据包DMA至RingBuffer在通过网络到达后,可在接收卡上查到。使用硬中断、温和中断和其他技术管理内核。 (如果用户发送数据,内核由用户处理。 )最后,它将发送到Socket的接收队列。并唤醒用户进程)。

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

TCP 包页眉中有一个基本的外旗。
如下图:

TCP包件使用不同的标签分为SYNC、FIN、ACK或RST类:
让我们看看整个链接:

在这方面,让我们简要审查每一步骤的时间承诺:
这些阶段分为两类:
由于1米相当于100 00次,网络传输需要1 00次(如果不是10万次),比两端的CPU长1 00次(如果不是10万次)。
因此,在形成标准的TCP连接过程中,人们常常认为网络被推迟。
PS: 一个 RRT 指的是一个软件包从一个服务器返回另一个服务器所需的时间 。
总体而言,TCP连接的网络大约需要3个传输器,加上两侧的几个处理器,总共大约需要1个。
不过,从客户的角度来看,只要ACK软件包发出,它就不会起作用。内核认为连接成功因此,如果在客户端建立TCP连接需要时间,那么我们需要很长时间才能做到这一点。它只需要两个传输,这比一个遥控飞行器要长一点。(从服务器的侧面,自收到SYN软件包以来,到收到ACK,单一次难民审查法庭也需要时间)。
如前一节所示,TCP连接的总时间从客户的角度来说,一般是围绕网络的RTT的时期。如果每件事都如此直截了当,我不认为我的贡献是必需的。事故会发生。
这可能导致在TCP连接发生时网络传输增加耗费时间,CPU处理成本较高,甚至在某些情况下连通失灵。 本节将分析在极端情况下TCP连接的耗时性质,分析我在网上观察到的沟渠。
常规系统需要我们几个人(微秒)打电话。但是在我的《 找到那个用过服务器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有可能保留更多的港口数量和较长的连接。
如果在创建连接过程中任何队列已满, 客户端的同步或 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 现在将接收错误“ 由对等方重新设定对等反应 ” 。博客在一篇题为「生命权」的文章中写道:总比炸掉整个车站好
我制作了一些简单易懂的代码 来计算在客户端的基础上 建立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
注意:客户端和服务器都不应选择在线计算机;否则,你的实验可能会干扰正常用户访问。
首先,我的客户位于怀北的国际数据中心机房,服务器从该公司的广东飞机室取来一台机器,执行定购单的延迟时间约为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 连接的网络包将更快运行 。应尽可能避免在整个区域长途移动机舱。
跨区域、 行星间房间和跨机器的测试已经完成 。 当您这次直接接通计算机时会怎样?
平的目前或延迟 很可能是零点零二米 大大低于其他机器,RRT。 我相信连接会非常迅速,嗯,测试。
连续5WTCP连接:总时间使用27154毫秒,每次平均为0次,54毫秒。
那么,它比机器要长那么久是怎么回事?
以理论为根据我们应该考虑这一点,因为现有的难民审查法庭是不够的。因此,有若干要求要求迅速建立连接。因此,将填满全连接队列或半连接队列。一旦发生队列满,当时收到的连接请求需要三秒钟的延迟。根据上述实验的结果,平均而言,它似乎远远大于难民工作队。
在实验期间,我用tcpdump袋观察了下一个场景。握手的一小部分用了3+,因为半连接队列满,客户不得不等待更长时间才能重新传送SYN。

我们每500个连接在一秒内改变路线。 最后,没有卡片(或者我们可以延长连接队列) 。
结论是,这架飞机上的50 00 TCP连接总共需要102399毫秒的客户统计数据,睡眠为100秒,平均为每TCP连接0 048毫秒。
这是因为当遥控飞行器变得足够小时,内核CPU需要时间才能出现,而TCP连接比Ping的 icmp 协议要多一点,因此比 ping 延迟略大于零。 通常看到大约 02 ms 。
TCP连接可能需要几秒钟才能产生反常现象,因为反常现象会影响用户的经验,甚至允许现有用户在一段时间内访问它。 另一个不利因素是雪崩的可能性。
由于您的服务器使用短连接来获取数据, 学习如何检测服务器连接中的异常, 至关重要 。如果有,学会优化掉它。当然,你也可以使用自己的记忆缓存。相反,使用连接池来维持连接。两种方法都可直接避免TCP握手的不同开支。
此外,TCP通常在两台机器之间有大约1个RRT的延迟时间,从而浪费时间。这是避免不了的。尽管如此,您仍可以通过调整两个装置之间的实际距离来缩短该 RRT 。例如,您想要访问的复选程序尽可能贴近后端界面计算机。这样,RTR可以从几十毫秒减少到零毫秒。
最后,考虑一下:如果服务器设在北京,是否可以向纽约的用户提供访问机会?
我们会在同一间前厅跨机房也好,由于实际距离较近,电信传输量基本上微乎其微。网络延迟的主要原因是传输设备耗时运行。但是,如果它是 半个世界,电信传输需要时间,我们可以以此为基础。北京和纽约相距约15 00公里。因此,让我们推倒设备时间表。只有光速才能发送和接收数据(RTT代表往返旅行时间)。要跑两次),时间=15 00 00 * 2/光速=100毫秒实际拖延可能更大。200米以上是典型现象。建立在这个延迟上,很难向用户提供二流服务。所以对于海外用户,最好设立一个当地办事处或从外部购买服务器。
[1] 基本网络方案编制信息:
[2] 高级别网络方案编制信息:
(本内容也可在http://ww.un.org/.52im.Net/thread-3265-1-1.html上查阅。 )
本文由 在线网速测试 整理编辑,转载请注明出处。