公众号旧文

Ping 丢包超过 5%,线路就一定垃圾吗?

作者:胖子阅读 —

最近看到有人分享自己的买机标准:

图片

乍一看,这个标准似乎很合理。

毕竟,谁都不希望自己买到一台经常丢包的 VPS。

但是,如果丢包指的是 Ping丢包,那么这个判断并不严谨。

甚至有时候,会误杀一台本来网络质量不错的机器。

很多人都会这样测试 VPS:

ping 目标IP

然后看到:

100 packets transmitted
95 received
5% packet loss

于是得出结论:这线路垃圾,不买。

问题就在这里。

Ping 使用的是 ICMP 协议,而绝大多数业务使用的是 TCP。

例如:

  • SSH
  • HTTP
  • HTTPS
  • 下载
  • Git
  • Docker
  • 数据库

它们全部都是 TCP。

但 ICMP 和 TCP 并不是同一个协议。

一、ICMP 丢包,不等于 TCP 丢包

很多运营商、云厂商都会对 ICMP 做限速(Rate Limit)。

因为 Ping 对业务没有实际价值,却可能被用于扫描、探测或者攻击。

因此很多设备都会这样处理:

TCP 包
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
全部正常转发
ICMP 包
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
超过一定数量开始丢弃

于是你看到:

Ping
5% Loss

但是与此同时:

SSH 正常
HTTP 正常
下载 正常

甚至:

iperf3
Retrans = 0

TCP 根本没有发生重传。

二、真正影响体验的是 TCP 重传

TCP 有一个特点:

如果数据包真的丢了,它一定会重传。

例如:

客户端
    │
DATA│─────────────X
    │
服务器

数据包丢失以后,服务器收不到。

客户端一直等不到 ACK。

于是:

TCP Retransmission

开始重发数据。

真正影响下载速度、网页打开速度、SSH 卡顿的,不是 Ping,而是:

TCP 重传。

三、举两个例子

第一种情况

Ping
5% Loss
↓
iperf3
Retrans = 0
↓
SSH 正常
↓
下载满速

这种机器能买吗?

我认为完全可以买。

因为 Ping 丢的是 ICMP。

真正的 TCP 根本没问题。

第二种情况

Ping
5% Loss
↓
iperf3
Retrans 很多
↓
SSH 卡顿
↓
下载掉速

这种机器能买吗?

我认为最好不要。

因为这说明真正的 TCP 数据包已经开始丢失。

四、还有一种情况

Ping
0% Loss

但是:

iperf3
Retrans
200+

为什么?

因为 Ping 只是 ICMP。

TCP 数据包和 ACK 包仍然可能发生丢失。

所以 Ping 不丢,也不代表 TCP 没问题。

五、买 VPS,到底应该看什么?

如果让我评价一台机器,我不会只看 Ping。

我更愿意看下面几项:

  1. Ping(ICMP)
  2. MTR(看丢包发生在哪一跳)
  3. iperf3(实际吞吐)
  4. TCP Retrans(是否大量重传)
  5. 下载速度是否稳定
  6. SSH 是否流畅

只有这些指标结合起来,才能真正反映线路质量。

六、一个更合理的标准

很多人把 Ping 丢包 > 5%

直接等同于线路垃圾。

中间少了一步。

真正应该问的是:这个 Ping 丢包,有没有导致 TCP 重传?

如果没有。

那它很可能只是:

  • ICMP 被限速
  • ICMP 优先级较低
  • 路由器主动丢弃 Echo Request 或 Echo Reply

这种情况下,对实际业务几乎没有影响。

如果导致了大量 TCP 重传。

那这条线路才真正值得警惕。

最后

Ping 是一个很好的网络探测工具,但它不是线路质量的最终裁判。

对于一台 VPS 来说:

  • Ping 丢包,只能说明 ICMP 没有全部收到。
  • TCP 重传,才能说明真正的数据传输受到了影响。

所以,与其问 Ping 丢了几个包?

不如再多问一句 TCP 有没有重传?

很多时候,这个问题比前一个更能说明一条线路到底好不好。