网络性能与时延:常见缓慢与卡顿的分析处置

上一篇内容《TCP异常快速诊断:端口复用的成因、特征与处理》中讲了探讨TCP端口复用相关知识点,本文将继续围绕时序图和大家探讨TCP时延分析相关话题。


什么是时延?


“时延”指数据包从客户端到服务器的单程耗时,本文中探讨的时延(Delay)、延迟(Latency)是近似概念,后文将统称为时延。


客户端与服务器的往返耗时,通常被称为RTT(Round Trip Time),RTT和时延均是观测网络性能的重要指标,该指标被用于评估网络性能的健康程度,例如时延平均值是否较高,时延是否稳定。


当网络时延增加时,数据传输性能将显著下降。在网络性能管理(NPMD)领域,在业务出现缓慢或卡顿类型的故障时,主观感受通常是网络慢了,这时通常负责网络运维的部门会首先被质疑:“网络先看看是不是线路出现问题?”实际上,造成缓慢或卡顿也有可能是业务应用自身问题,或是安全设备问题。本文将展开讨论通过流量分析计算网络时延,科学进行故障责任界定。


通过三次握手能否计算出时延?


当拿到一条TCP会话的流量数据包时,可以测算网络时延,测算过程涉及到了三个位置:


1.  客户端(主动发起三次握手请求的一方)

2.  服务器(接受三次握手请求的一方)

3.  抓包点(可能是客户端、可能是服务器、也可能是从客户端到服务器中间的某个位置那么,三次握手数据包,能为我们提供哪些信息?


抓包点看到三次握手SYN包的捕获时间戳

2.  抓包点看到三次握手SYN/ACK包的捕获时间戳

3.  抓包点看到三次握手ACK包的捕获时间戳


根据这些信息,我们可以尝试计算这几段流量的RTT:


1.  抓包点与客户端之间的RTT数据包经过抓包点后,到达客户端,客户端返回数据包,再经过抓包点时所花费的时间。即从抓包点看到服务器SYN/ACK包的时间与看到ACK包的时间差。

2.  抓包点与服务器之间的RTT数据包经过抓包点后,到达服务器,服务器返回数据包,再经过抓包点时所花费的时间。即从抓包点看到客户端SYN包的时间与看到SYN/ACK包的时间差。

3.  客户端与服务器之间的RTT上述两项时间差之和(抓包点到客户端RTT、抓包点到服务器RTT)由于数据包在捕获时记录了时间戳,因此可以通过这些时间戳去计算这些数据包的时间间隔,根据下图来一次简单的分析吧(数学不好的小伙伴,可以跳过这段,直接看下一张图):

图1:TCP三次握手时序图


如上图所示:抓包点看到SYN包的相对时间为0.000000秒,记作Time1,看到SYN/ACK包的时间为0.115283秒,记作Time2,看到ACK包的时间为0.115444秒,记作Time3。


计算Time3-Time2的结果,0.115444-0.115283=0.000161秒,抓包点与客户端之间的RTT为0.161ms


计算Time2-Time1的结果,0.115283-0.000000=0.115283秒,抓包点与服务器之间的RTT为115.283ms


将上述两项结果相加,得到0.000161+0.115444=0.115444秒,客户端与服务器之间的RTT为115.444ms


实际上,将两项结果相加,为Time3-Time2与Time2-Time1之和,即Time3-Time1的结果,因此在进行客户端与服务器间RTT计算时,可以省略相加过程,直接计算Time3-Time1的结果。


上面几个公式是否让读者头晕脑胀了?其实,CSNA系统已经将上述几个结果展示在时序图中,读者无需计算即可了解网络时延情况:

图2:TCP三次握手中的时延


如上图所示,使用时序图功能,无需计算,即可通过三次握手观察网络RTT情况。 


TCP长连接,没抓到三次握手,还能计算时延吗?


p>在TCP短连接的业务场景中,完整TCP会话所需时间仅几秒至几十秒不等,通过三次握手评估RTT,即可得到会话当时或临近时段的网络时延情况。


在TCP长连接的业务场景中,完整TCP会话所需时间可能在数分钟至数小时不等。长连接场景可能无法找到三次握手流量,即使找到了三次握手流量,也可能因为三次握手时间距离要分析的时间点较远,无法分析故障当时的网络时延情况,使分析结果不具参考价值。此时,可以通过计算ACK数据包的时间间隔来测算ACK时延,同样具备参考价值。如下图所示:

图3:ACK时延


如图所示,当会话进行到4000+个数据包,会话此时已经进行了23秒,三次握手的时延不能完全代表此时的时延情况。序号为4064的数据包是对4063号数据包的ACK确认,根据Seq和Ack也可以验证这一点。两个数据包的时间差,即客户端ACK时延为0.124959秒,即124ms。


同样,序号为4069的数据包与4068数据包的时间差为0.123097秒,即123ms通过ACK时延计算方法,可以了解会话在进行到某一时刻的时延,此种情况适用于会话时间较长,未捕获三次握手数据包的情况。 


一条会话的完整RTT波动趋势?


会话在进行的过程中,时延可能出现波动,如何进行整体观测?在TCP会话视图中,右击想要分析的会话,选择TCP流图形-往返时间,在新弹出的窗口中查看RTT的波动情况,如下图所示:

图4:TCP会话时延趋势


通过流图形分析,即可观察RTT是否平稳,如图所示,RTT在多数是可都处于120左右,某几个时刻发生了抖动,峰值高达360左右。  通过RTT进行分析判断的典型故障实例  由于网络时延本身导致的网络故障实例较少,本篇文章中推荐的典型故障实例为通过RTT判断网络时延无故障的案例。关于此故障的详细描述和讲解,可参考以下视频:

https://www.bilibili.com/video/BV1Mt4y1f7eF


本文深入探讨了TCP的RTT在CSNAS时序图中如何分析,通过深入理解RTT和ACK时延,了解时序图和流图形的分析方法,能够提升流量分析工程师在工作中快速分析解决故障的能力。