节点延迟怎么测才准?ping 为什么不算数

选节点时最常见的动作是「ping 一下」,然后挑数字最小的那个。这个做法在很多时候是错的——ping 测的是 ICMP 往返,而你实际用的网页、视频、游戏走的是 TCP 或 UDP,两条路的优先级、丢包策略、甚至出口节点都可能不一样。

ping 测的到底是什么

ping 发的是 ICMP Echo 请求,由系统内核直接回应,不经过应用层。它只能说明「网络层通不通、往返多久」,不能说明:

  • TCP 握手要多久(三次握手,比 ICMP 多一次往返);
  • 建连后首字节要多久(TTFB,受服务端和线路共同影响);
  • 带宽够不够(ping 不传数据,测不出吞吐);
  • 抖动大不大(单次 ping 说明不了稳定性)。

所以经常出现:ping 20ms 的节点,打开网页反而比 ping 60ms 的慢。

测法一:TCP 握手时间

这是最接近「点开网页那一瞬间」的指标。

# 用 curl 打印各阶段耗时(秒)
curl -o /dev/null -s -w "dns:%{time_namelookup} connect:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer} total:%{time_total}\n" https://www.example.com

关注 connect(TCP 建连)和 ttfb(首字节)。同一条线路测 5 次取中位数,比单次 ping 可靠得多。

测法二:真实吞吐

# 下载一个固定大小的文件,看实际速度
curl -o /dev/null -w "speed: %{speed_download} B/s\n" https://speed.cloudflare.com/__down?bytes=10000000

注意两点:一是别用测速网站的「峰值」当结论,峰值只持续几秒;二是要在你实际使用的时段测,晚高峰和凌晨的结果能差一倍。

测法三:抖动和丢包

# 连续 20 次,看最大值和最小值差多少
ping -c 20 目标IP | tail -3

# 或看 mtr,能同时看到每一跳的丢包
mtr -c 20 -r 目标IP

延迟稳定但抖动大,表现为「平时很快,偶尔卡一下」;平均延迟低但丢包 5%,表现为「视频一直缓冲、语音断续」。这两种体验都比「稳定 80ms」差。

该不该换节点,看三个数

  1. TCP 建连时间超过 300ms → 该换,交互会明显迟钝
  2. 抖动(最大-最小)超过平均值的 2 倍 → 该换,体验不稳定
  3. 丢包率高于 2% → 该换,视频和语音会受影响

三项里有两项不达标就该换,不用纠结单项数字。

💡 一个反直觉的结论:对网页浏览,建立连接的开销比带宽重要得多;对视频,稳定性比峰值速度重要。所以「测速跑得很高但用起来卡」完全可能同时成立。

测的时候别犯这几个错

  • 只测一次就下结论——网络波动很大,至少 5 次取中位数
  • 用 ping 挑节点——见上文,它测的和体验不是一回事
  • 在凌晨测速——那是全天最好的时段,没有参考价值
  • 忽略 DNS 耗时——time_namelookup 高说明解析慢,和线路无关

延伸阅读:节点怎么选最快、速度上不去怎么排查、DNS 泄露怎么自测。