FunTester 延迟、丢包和抖动——故障测试必知必会

FunTester · April 25, 2025 · 440 hits

网络性能的三大关键指标是延迟、丢包和抖动。今天我们就来聊聊这三者,尤其聚焦在 “延迟” 和 “丢包” 这两个对应用性能影响最大的 “罪魁祸首”。

绝大多数应用都依赖 TCP(传输控制协议)将数据从 A 点传输到 B 点,换句话说,85% 的互联网流量都跑在 TCP 上。TCP 有个有趣的特性:它完全屏蔽了底层网络的分包机制,让上层应用几乎感知不到网络传输中可能出现的 “风吹雨打”。不管是像 Telnet 或 SSH 这种 “一封一收” 的小打小闹,还是像 FTP 这类大文件传输的 “洪水猛兽”,TCP 都能把数据打包、排队,然后按部就班地发出去。即使途中丢了包、顺序乱了,TCP 也会兢兢业业地重传、排序,最后把 “整整齐齐” 的数据交给应用层,妥妥的 “保姆级服务”。

延迟

早期的网络协议多是在局域网或校园网环境下设计的,数据往返只需几毫秒,快得让人 “眼睛都不眨”。可一旦放到全球互联网这个大江湖,哪怕数据包只绕地球一圈,至少也得十来毫秒;再来个返回包,往返就飙到 200 毫秒。别忘了,光纤里的光速虽然不如真空快,但也有每秒 20 万公里,粗略一算,每 100 公里 RTT 就要 1 毫秒。

排队理论告诉我们,链路越繁忙,等候时间就越长。想象你在邮局排队,前面的人越多,你越是干着急。假如一条 10 Gbps 的链路跑到了 80% 的利用率,等你这个数据包一到,前面已经排了四个包。要是到了 99%,队伍直接拉长到 99 个包。虽然在高带宽下这些排队时间不算啥,传 99 个 500 字节的包只要 0.248 毫秒,但一旦链路被过度使用,比如 99.9% 的利用率,那排队延迟就有可能 “节节攀升”。

TCP 为了在高延迟网络下也能稳定 “打工”,引入了多种机制,最核心的是:确保传输中始终有足够多的数据包流动。如果每发一个包都要等对方说 “我收到了” 再发下一个,那传输效率低得连蜗牛都嫌慢。200 毫秒 RTT 的链路上每秒只能发出 5 个包,这谁受得了?于是 TCP 会尽量让链路 “吃饱”,但不至于 “撑死”,这对大流量的长连接下载效果拔群。

可一旦遇上短连接,比如加载网页小图标、接口响应这些 “小碎步”,慢启动机制就成了拖后腿的 “绊脚石”。每次都要 “从头跑起”,还没加速就跑完了。现在的浏览器为了提速,会复用已经 “加速完成” 的 TCP 会话,避免一再慢启动。然而,有些开发经验不足的软件常常 “一开一关”,频繁新建 TCP 连接,这种 “断断续续” 的策略在远距离传输或带宽吃紧的场景下性能会直线下滑。

而且别忘了,几乎所有 TCP 连接都要先查 DNS,如果 DNS 服务器响应慢,那整个流程都会像 “老牛拉破车” 一样拖沓。所以,优先选择靠近的 DNS 服务器,绝对是事半功倍。

丢包

理想状态下,网络应该是 “滴水不漏” 的,可现实总爱开玩笑。数据包会因为比特翻转或干扰丢失,尤其是在无线网络中,即便有纠错码也无法 “百发百中”。

丢了包怎么办?TCP 自然是 “反复确认、重新传”,但这就要耗时间了。比如一个 RTT 为 200 毫秒的连接,每秒发送 1000 个数据包,当包号 500 丢失时,发送方其实正在发 700 号,确认包也只是刚到 400。那就得等确认到 499、501,才能发现 500 丢了,此时 TCP 已传了一大段数据,而接收方为了保持顺序,只能 “死守” 501 到 700 这些数据,等那 “姗姗来迟” 的 500 包归队。

如果这种丢包情况频繁发生,而 RTT 又高,TCP 的缓冲区就会不堪重负,结果就是 “全线暂停” 直到丢失的包重传成功。简单说,高延迟能忍、高丢包也能熬,可 “两害齐发”,那就是 TCP 的 “灾难现场”。

还有一种更常见的丢包场景:TCP 发送太快,网络设备缓冲区来不及处理,只能 “忍痛割爱”,直接丢掉多余的数据包。TCP 也不知道是哪儿的问题,只能默认为 “网络太挤”,于是自动减速。幸运的话可以触发 “快速重传” 机制,问题不大。但如果最后几个包掉了,重传不及时,TCP 就得等到超时再来一次 “慢启动”,整个连接性能会严重受挫。

这个 “慢启动循环” 对于短时 Web 请求尤为致命,用户可能看到页面加载只差最后一张图,可那张图 “卡壳” 一秒才来,这种体验可不太妙。此时,断开重来往往比苦等超时要高效得多。

抖动

抖动说白了就是数据包传输时间的 “不稳定”。虽然光速不变、光纤不动,但链路拥堵时,数据包在路由器里排队时间不一,有时候 “秒进秒出”,有时候 “等到花儿都谢了”。

对 TCP 来说,抖动问题还算可控——只不过得用保守的 RTT 估计和更长的超时。可对实时音视频就 “伤筋动骨” 了,因为音视频播放讲究 “稳准快”,延迟波动大,就会出现卡顿、掉帧,甚至音画不同步。此时,应用只能选择 “等慢包” 或者 “丢慢包”,要么增加延迟,要么增加丢包率,真是 “左右为难”。

总结

在多条网络路径共存的环境中,选择一条低延迟、低丢包、低抖动的 “黄金通道” 至关重要。路径长、路况差的线路,就算 “绕远路也不能绕远心”。Noction 在路径选择方面拥有领先的智能算法,能根据实时丢包率和延迟指标,动态选择表现最优的线路,帮助应用如虎添翼。欢迎了解我们的智能路由平台,看看它如何助力网络提速降本。

FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up