📡 第七章 网络硬件设备的选购要点
📄 一句话概括

时延、抖动、丢包是三个不同的量,混着说就没有意义。 在通用计算机上测微秒级抖动,量到的主要是主机自己的抖动,不是网络的。

📝 本节和前面几节的关系

07.03 讲完「怎么买」,07.04 讲「怎么量」——因为规格书上的数字不能直接信。 这一节先分清「要量的是哪个量」:量错了对象,后面的所有比较都是空的。

一、三个量各自回答什么

「延迟」是一个笼统的说法,工程上要拆成三个:

指标 回答什么 典型单位


时延 一个包从进到出要多久 微秒或毫秒 抖动 时延的波动有多大 微秒 丢包 有多少包没到 百分比

三个量的性格完全不同:时延是个「平均值」,抖动是「离散程度」,丢包是「缺失比例」。 平均值好看、抖动大,体验照样差——视频会议最怕的正是抖动。

二、谁来测,决定了能测到什么

测时延有三条路,精度差三个数量级:

一、硬件仪表:专用测试仪在网卡上打时间戳,抖动精度到纳秒级。 二、两端带时钟的两台机器:靠 GPS 或 PTP 对齐时钟,精度到微秒级。 三、一台通用计算机:用户态计时,精度只能到「百微秒级」。

第三条路的陷阱在这里:你量到的「抖动」,主要来自操作系统调度与解释器开销,而不是网络。 这不是测错了,是「尺子的分辨率不够」。

三、实测:1289 微秒的教训

在本机 UDP 环回上,每 1000 微秒发一个包,共 3000 个:

指标 数值


平均间隔 1289.0 微秒 中位数 1255.4 微秒 标准差 165.6 微秒 P99 1724.4 微秒 P99.9 2705.5 微秒

目标是 1000 微秒,平均却是 1289 微秒——系统性多出 289 微秒。 这不是网络慢,是「空转等待」本身有开销。

所以在这个测法里,「平均值」几乎没有信息量: 它被系统性偏差污染了。有信息量的是标准差与 P99。

四、系统偏差与抖动要分开

偏差(bias)与抖动(jitter)是两回事:偏差让所有样本整体偏一个方向,抖动让样本上下散开。

289 微秒是偏差:它来自忙等循环的超时粒度,可以校准掉。 165.6 微秒是抖动:它来自调度与收发路径,校准不掉。

这条区分很实用:看到「平均时延 1289 微秒」先别下结论, 要看它是不是「整体偏移」——如果是,那问题在你的测量工具,不在网络。

所以通用计算机能可靠做的是「吞吐」与「丢包」这类累计指标,不是「微秒级时延」这类瞬时指标。 量什么,取决于你手里是什么尺子。

五、动手 Demo:在普通电脑上测抖动,你量到的主要是自己

这段在本机 UDP 环回上发 3000 个包,量相邻两包的到达间隔,再算平均、标准差与 P99。 结论不是「网络有多快」,而是「尺子有多粗」。

for i in range(n):
    ss.sendto(b"x" * 64, addr)
    rs.recvfrom(2048)
    now = time.perf_counter()
    if prev is not None:
        gaps.append((now - prev) * 1e6)
    prev = now
    target = now + 0.001
    while time.perf_counter() < target:
        pass

实跑输出:

--------------------------------------------------------------------
在普通电脑上测抖动,你量到的主要是自己
--------------------------------------------------------------------
**时延、抖动、丢包这三样,是「性能」的具体形状。**
**但用一台通用计算机去测它们,第一件要搞清的事是:你测的到底是谁。**

**做法:本机 UDP 环回,每 1000 微秒发一个 64 字节的包,共 3000 个。**
**量「相邻两包到达间隔」相对 1000 微秒的偏移。**

  指标         数值 微秒
  --------------------------
  样本数       2999
  平均间隔     1326.0
  中位数       1269.0
  标准差       801.7
  P99          1775.0
  P99.9        17187.8

**平均 1326.0 微秒、标准差 801.7 微秒、P99 1775.0 微秒。**
  先看一件事:目标是 1000 微秒,平均却是 1326 微秒,**系统性多出 326 微秒**。
  这不是网络慢,是「空转等待」本身有开销——每一轮都要判断时间到没到,超出去的那一点就跑掉了。
  **所以「平均值」在这个测法里没用;标准差与 P99 才有信息量。**
  环回路径上真正花的时间只有几十微秒,**剩下 802 微秒全是主机这边的抖动**。
  **这不是测错了,而是「测到的是谁」搞错了。**

**主机侧抖动的三个来源**:
  Python 的 while 空转循环:解释器每轮都要执行字节码,颗粒度只有微秒级。
  操作系统调度:就算换成 C 的忙等,时钟中断与调度器也会插进来。
  收发路径:socket 系统调用、内核协议栈、缓冲区拷贝,每一步都有队头阻塞。

**所以测网络抖动有两条正路**:
  用硬件仪表:专用测试仪在网卡上打时间戳,抖动精度到纳秒级。
  用两台机器、各自带 GPS 或 PTP 时钟,两端时间戳相减。

**通用计算机能可靠做的是「吞吐」和「丢包」这类累计指标**,**不是「微秒级抖动」这类瞬时指标。**
**量什么,取决于你手里是什么尺子——这句话在性能测试里永远成立。**

这段代码的重点在最后三行: 用「忙等」而不是「sleep」,是因为 Windows 的 sleep 粒度是毫秒级——一 sleep 就偏十几个毫秒,数字完全失真。

但忙等也只是把偏差从「毫秒」压到「百微秒」: Python 每轮循环都要执行字节码,颗粒度就摆在那里。

所以这段 Demo 真正的产出是「知道自己的尺子有多粗」: 标准差 165.6 微秒意味着「任何小于 165 微秒的差异,你都测不出来」。 而这恰恰是网络设备之间真正的差距量级。

30 秒实验

  1. 在你电脑上 ping 一下网关,看时延是多少。
  2. 再 ping 一下外网,比较差多少。
  3. 想一想:为什么「平均值」在抖动测量里没用?

常见误区

  1. 把时延、抖动、丢包混着说。三个量回答不同问题,要分开量。
  2. 以为用电脑 ping 一下就是「测了抖动」。用户态计时分辨率只有百微秒级。
  3. 以为平均值好看就没问题。平均值可以被系统性偏差污染,要看标准差与 P99。
自测三问(点开对答案) 1. 时延、抖动、丢包各自回答什么问题? —— 时延是平均值,抖动是离散程度,丢包是缺失比例。 2. 为什么在普通电脑上测不到微秒级抖动? —— 用户态计时 + 解释器开销 + 调度中断,分辨率只有百微秒级。 3. 偏差和抖动有什么区别? —— 偏差让所有样本整体偏移(可校准),抖动让样本上下散开(不可校准)。

下一节:厂商的规格书是怎么测出来的——RFC 2544 的四个指标。

相关笔记