qinghuan
← 回到知识探索

计算机趣闻 / 趣味知识

网速写着 100 Mbps,为什么不是每秒下载 100 MB?

先看清小写 b 与大写 B,再把文件大小换成字节,算一份理想时间与实际等待的分账。

展开本文目录
  1. 一个字母的大小写,差了八倍
  2. 换成字节之后,还要确认“兆”是哪一种
  3. 只算传完这些字节,理想情况下要多久?
  4. 实际下载,还要看谁在一起用、哪里在等待
  5. 记住这三点
  6. 别把例子用过头
  7. 自己试一小步
  8. 查原始资料
  9. 找一份资料继续练
开始前,会这些就够了
  • 会做乘除法;可选代码使用 Python 3.10 或更新版本
遇到不熟悉的词,先看这 1 个解释
位、字节与传输单位
位可以取 0 或 1;这里一个字节等于八位。Mbps 以每秒兆位计数,MB/s 以每秒兆字节计数,比较前先统一单位。
打开完整术语小抄 ↗

下载窗口写着每秒十几 MB,网络说明却写着 100 Mbps,数字看起来像少了大半。先别急着判断网络出了故障:两个数字可能用的根本不是同一种单位。

这就像“每分钟搬多少箱”和“每分钟搬多少本书”不能直接比较。要先知道一箱装多少本,再检查这些箱子里有多少是真正要下载的文件内容。

一个字母的大小写,差了八倍

bit 是“位”,可以取 0 或 1;byte 是“字节”,这里一个字节等于八位。常见网速写法 Mbps 表示每秒多少兆位,MB/s 则是每秒多少兆字节。小写 b 和大写 B 不应互换。

按十进制单位,100 Mbps 是每秒 100,000,000 位。除以八,得到每秒 12,500,000 字节,也就是 12.5 MB/s。这是单位换算;能否把这个速率全部用于某个文件,还得另外看。

换成字节之后,还要确认“兆”是哪一种

本文明确使用 1 MB = 1,000,000 字节,1 MiB = 1,048,576 字节。MiB 中间多出的 i,提醒你它按二的幂计数。两者不是同一大小,只是日常界面有时把标签写得含糊。

所以同一份文件显示的数字可能不同,文件本身并没有缩水。遇到“100 MB”,最好确认软件的定义或直接查看字节数,再代入计算;不能看见字母 M 就一律乘 1024。

只算传完这些字节,理想情况下要多久?

下面不联网,也不下载文件。先假设文件字节原样传输、速率恒定、没有其他流量或额外等待。理想传输时间就是“文件字节数 × 8 ÷ 每秒位数”。程序比较 100 MB 和 100 MiB 两份虚构文件。

最后另设一个情境:文件有效字节只按标称速率的 80% 到达,传输之外再等 0.2 秒。80% 和 0.2 都是我们选的演示参数,不是网络协议的固定损耗,也不是你家宽带的实测结果。

小实验 · python
from fractions import Fraction

MB = 10**6
MiB = 2**20
nominal_bps = 100 * 10**6

def transfer_seconds(size_bytes, bits_per_second):
    if size_bytes < 0 or bits_per_second <= 0:
        raise ValueError("size must be nonnegative; rate must be positive")
    return Fraction(size_bytes * 8) / bits_per_second

bytes_per_second = Fraction(nominal_bps, 8)
print(f"100 Mbps = {float(bytes_per_second / MB):.3f} MB/s")
print(f"100 Mbps = {float(bytes_per_second / MiB):.3f} MiB/s")
for label, size in [("100 MB", 100 * MB), ("100 MiB", 100 * MiB)]:
    seconds = transfer_seconds(size, nominal_bps)
    print(f"ideal {label}: {float(seconds):.3f} s")

useful_rate = nominal_bps * Fraction(4, 5)
extra_wait = Fraction(1, 5)
scenario = transfer_seconds(100 * MB, useful_rate) + extra_wait
print(f"assumed 80% rate + 0.2 s wait: {float(scenario):.3f} s")

怎样运行:保存为 bandwidth_units.py,运行 python bandwidth_units.py。使用 Python 3.10 或更新版本,仅用标准库;不联网、不创建下载任务。

运行后对照结果
100 Mbps = 12.500 MB/s
100 Mbps = 11.921 MiB/s
ideal 100 MB: 8.000 s
ideal 100 MiB: 8.389 s
assumed 80% rate + 0.2 s wait: 10.200 s

实际下载,还要看谁在一起用、哪里在等待

网络不只搬文件正文,还要带协议头,处理确认、丢失后的重传等事情。同一连接或网络里的其他流量也会占用资源。服务端发送、家中 Wi-Fi、设备处理和写盘,都可能影响这次下载;不能统一扣掉某个百分比就当作预测。

等待也不等同于每秒能搬多少字节。连接准备、服务端响应和传输中的往返可能增加时间,带宽高并不保证第一段内容马上出现。测速是特定时刻、设备与目标服务器之间的观察,不保证所有下载都一样。先统一单位,再记录测量范围,才能解释差异。

记住这三点

  • Mbps 与 MB/s 差一个位到字节的换算;一个字节是八位。
  • MB 与 MiB 采用不同倍数,计算前最好落实到字节数。
  • 文件大小除以速率只给出设定条件下的传输时间,实际等待与有效吞吐还需观察。

别把例子用过头

  • 演示中的 80% 有效速率是人为假设,不能当作所有网络的固定折扣。
  • 标称接入速率、测速读数和下载软件的文件速率可能采用不同测量范围;压缩或缓存还可能改变真正传输的字节数。

自己试一小步

做一张不会把单位混在一起的下载估算表。

  1. 自选两个文件大小,分别明确写成 MB 和 MiB,并先换算成字节。
  2. 自选两档 Mbps 速率,先手算理想时间,再改程序对照。
  3. 另写一组有效速率与额外等待的假设,注明它们覆盖哪些开销,避免重复计算。

做到这些,就算完成

  • 表中是否同时写清文件单位、速率单位和秒数?
  • 换单位时是否保持同一份文件的字节数不变?
  • 是否把假设算例与实际下载测量分开标记?

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

  • NIST:Prefixes for binary multiples (新标签页)↗NIST · 英文

    明确给出一个字节等于八位、MB 的十进制倍数与 MiB 的二进制倍数。

    已打开并阅读倍数表及 Examples and comparisons with SI prefixes;未把页面历史用法当作当前软件的统一行为。

  • AWS:What is Network Bandwidth? (新标签页)↗Amazon Web Services · 英文

    支持带宽、实际吞吐与延迟的区分,以及协议头、拥塞、共享资源和设备限制的影响。

    已阅读 Throughput、Latency、Network congestion、Protocol overhead 与基础设施限制部分;未使用页面中的示意速率作为实测。

  • Google:网络测速结果意味着什么 (新标签页)↗Google Home 与 Nest 帮助 · 英文

    支持 Mbps 表示兆位每秒,以及测速依赖时间、设备、目标服务器和网络使用情况的边界。

    已阅读 What do the results mean、下载速率计算与测速变化说明;未采用页面的套餐、设备或使用场景推荐。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。