公众号旧文

为什么ping的延迟低,网速却不一定快?

作者:胖子阅读 —

几年前,我判断服务器网速快慢的方法很简单。

打开终端,敲一行:

ping
 服务器IP

延迟低,就是网速好。 延迟高,就是网速差。

直到最近,我才意识到没那么简单。

一、70ms,反而比 120ms 更慢

我有两台日本服务器。

一台直连延迟 70ms 一台绕路延迟 120ms

按常识判断,70ms 应该网速更快。

结果却是:

我连 70ms 那台的下载速度更慢,120ms 那台反而能跑满带宽。

这我才意识到:延迟,根本不是网速的全部。

二、ping 到底在测什么?

ping 默认使用的是 ICMP 互联网控制消息协议。

它做的事情很简单:

  • 发一个很小的数据包(通常 64 字节)
  • 等对方回一个应答
  • 计算往返时间(RTT)

它测的是网络反应快不快。

但它根本没有测:

  • 带宽有多大
  • 能持续传输多少数据
  • 丢包后如何重传
  • 拥塞时如何控制速率

换句话说,ping 测的是响应能力,不是运输能力。

三、第一次升级:我开始自己造测速环境

当我开始怀疑 ping 时,我做了一件很原始的事。

我在服务器上放了一个文件,然后直接用 Python 起了一个 HTTP 服务:

python
 -m http.server
8000

没有 nginx,没有优化。

就这么简单。

然后我在 Windows 里用 curl 下载:

curl -o
NUL

http
:
//服务器IP:8000/testfile

那是我第一次看到我连接的服务器的真实下载速度。

HTTP 基于 TCP 传输控制协议。

而 TCP 是一个复杂的系统:

  • 慢启动
  • 拥塞控制
  • 窗口大小
  • 丢包重传

下载测速测的是在持续传输下,这条链路能运多少数据。

这和 ping 完全是两个世界。

四、第二次震荡:多线程的真相

后来我发现单线程跑不满带宽。

于是我开始做 HTTP 多线程下载。

结果又出现问题。

同一台服务器,同一条线路,不同版本的终端跑出来的结果差异很大。

原来测速不仅取决于服务器,也取决于客户端。

CPU 性能、线程调度、Socket 数量、TCP 栈实现,都会影响结果。

甚至测速工具本身,也可能成为瓶颈。

五、最后,我换成了 iPerf3

当我意识到 HTTP 本身也会带来变量时,我最终改用了 iPerf3。

那时候我才真正开始理解链路能力。

我开始看到网络的多个维度:

  • 延迟
  • 带宽
  • 丢包
  • 抖动

原来网速不只是一个数字,而是一个系统。

六、回归正题:延迟低,为什么网速却不一定快?

答案其实很简单:

  • 延迟决定响应速度
  • 带宽决定运输能力

就像:

  • 摩托车启动很快
  • 但货车才能拉更多货

启动速度和运载能力,从来不是一回事。

我真正升级的,不是测速方法,而是认知模型。

从用延迟判断网速,到理解协议、拥塞控制、客户端能力、链路结构。

如果你之前也是 ping 一下就下结论。

现在,或许你可以试一下 iPerf 。