开始前,会这些就够了
- 会做乘除法;可选代码使用 Python 3.10 或更新版本
下载窗口写着每秒十几 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 都是我们选的演示参数,不是网络协议的固定损耗,也不是你家宽带的实测结果。
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% 有效速率是人为假设,不能当作所有网络的固定折扣。
- 标称接入速率、测速读数和下载软件的文件速率可能采用不同测量范围;压缩或缓存还可能改变真正传输的字节数。
自己试一小步
做一张不会把单位混在一起的下载估算表。
- 自选两个文件大小,分别明确写成 MB 和
MiB,并先换算成字节。 - 自选两档 Mbps 速率,先手算理想时间,再改程序对照。
- 另写一组有效速率与额外等待的假设,注明它们覆盖哪些开销,避免重复计算。
做到这些,就算完成
- 表中是否同时写清文件单位、速率单位和秒数?
- 换单位时是否保持同一份文件的字节数不变?
- 是否把假设算例与实际下载测量分开标记?
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- NIST:Prefixes for binary multiples (新标签页)↗
明确给出一个字节等于八位、MB 的十进制倍数与
MiB的二进制倍数。 - AWS:What is Network Bandwidth? (新标签页)↗
支持带宽、实际吞吐与延迟的区分,以及协议头、拥塞、共享资源和设备限制的影响。
- Google:网络测速结果意味着什么 (新标签页)↗
支持 Mbps 表示兆位每秒,以及测速依赖时间、设备、目标服务器和网络使用情况的边界。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
浏览器网络面板:查清哪个请求慢了或失败了 (新标签页)↗
只看 Timing 和传输大小,分别记录准备连接、等待响应和实际传输;先确认字节单位,再比较耗时。
查看学习准备与访问说明 →