← 返回笔记列表
● 测速

怎样测出可信的网速

"测速"看起来只是点一下按钮,但同一个网络在不同工具里能差出三倍。差别通常来自三个地方:缓存、 握手、以及并发。

一、缓存会让下载速度虚高

任何一层缓存(浏览器、CDN、ISP 透明缓存)命中时,数据根本没走完链路,数字自然漂亮。 本站在测速路径上做了三重防护:

二、别把 TCP/TLS 握手算进带宽

第一次请求包含 DNS、TCP 三次握手、TLS 协商,几毫秒到几百毫秒不等。把它算进下载时间, 短文件测出的速率会明显偏低。本站的做法:

三、时间窗口很重要

家用宽带通常有前几秒的突发额度(burst),测 5 秒的结果会明显高于持续速率。 想看长期稳定值,用 100 MB 文件跑到 9 秒以上;想看瞬时能力,短文件即可。 两种数字都对,问题只在于你拿它跟什么比。

指标曾经的测法(端点已下线)参考意义
延迟12 次 RTT 均值,去掉首包网页打开手感、游戏 ping
抖动相邻 RTT 差值均值实时音视频是否卡顿
下载100 MB 流式,取后半段中位数持续下载、流媒体
上传PUT 5 MB,快链路追加 20 MB备份、网盘、直播推流

表中"曾经的测法"对应的 /st/ 端点已于 2026-11 全部移除,现在访问返回 410 Gone;方法本身仍适用于自建压测环境。

四、命令行对照(历史示例)

浏览器的上限是单连接 + 浏览器调度,用 curl 能更干净地看服务端实力:

# 下载 100 MB,输出平均速率(字节/秒)
curl -o /dev/null \
     -w 'download %{speed_download} B/s  total %{time_total}s\n' \
     'https://speedtest.heodiy.com/st/100mb.bin?r=1'

# 只测延迟(HEAD 请求 10 次)
for i in 1 2 3 4 5 6 7 8 9 10; do
  curl -s -o /dev/null -w '%{time_total}\n' 'https://speedtest.heodiy.com/st/ping.txt?r='$i
done

# 上传 10 MB 随机数据
head -c 10M /dev/urandom > /tmp/up.bin
curl -X PUT --data-binary @/tmp/up.bin \
     -w 'upload %{speed_upload} B/s\n' \
     'https://speedtest.heodiy.com/st/upload/cli-$(date +%s).bin'

注意:上面三例指向的 /st/ 端点已于 2026-11 下线(现返回 410),仅作"用 curl 控制变量"的思路演示。要在自有机群之间做真实压测,请用 iperf3:

# 服务端(一台你有权限的机器)
iperf3 -s -p 5201

# 客户端:TCP 单向 10 秒,-O 2 跳过前 2 秒预热,-P 4 四并发
iperf3 -c 服务端IP -p 5201 -t 10 -O 2 -P 4

# UDP 看抖动与丢包,-b 限制带宽
iperf3 -c 服务端IP -p 5201 -u -b 100M -t 10

五、几个常见误区

先把变量控制住,再谈数字。测速的价值不在于"跑分更高",而在于能解释差异。