「40 GB 的素材,千兆宽带,多久下完?」
40 GB ÷ 125 MB/s = 328 秒,五分半。这个数字几乎从来不会实现,而原因不是宽带被限速了。
除法只回答了「你家门口那根线最多能过多少」。真正决定耗时的是另外几个量,它们每一个都能把结果拉长一个数量级。
第 0 层:单位(8 倍)
先把最常见的那个误会清掉:运营商卖的是比特,下载软件显示的是字节,差 8 倍。100 M 宽带的理论满速是 12.5 MB/s。这一层 带宽与下载时间 的页面上有完整对照,下面不再重复。
后面讲的都是换算之后仍然对不上的部分。
第 1 层:单条连接的天花板是「窗口 ÷ RTT」
TCP 不是把数据一股脑推出去,而是发出一批、等确认、再发下一批。同一时刻允许「在途」而未被确认的数据量就是窗口。于是单条连接的吞吐有一个硬上限:
吞吐 ≤ 窗口大小 ÷ RTT
这个式子的杀伤力在于带宽根本不在里面。
| 窗口 | RTT | 单条上限 |
|---|---|---|
| 64 KB | 30 ms(同城) | 2.13 MB/s(约 17 Mbps) |
| 64 KB | 200 ms(跨境) | 320 KB/s(约 2.6 Mbps) |
| 4 MB | 30 ms | 133 MB/s |
| 4 MB | 200 ms | 20 MB/s |
64 KB 是没有窗口缩放时的上限(TCP 头里的窗口字段只有 16 位)。现代系统默认都开了窗口缩放,能把窗口放大到几 MB,所以你不太会撞到 64 KB 那一行——但方向没变:RTT 越大,同样的窗口能撑起的速度越低。
第 2 层:带宽时延积决定了「要多大的窗口」
把上式反过来问:要跑满 1 Gbps,窗口得多大?
带宽时延积(BDP) = 带宽 × RTT
- 1 Gbps × 30 ms = 3.75 MB
- 1 Gbps × 200 ms = 25 MB
也就是说,跨境跑满千兆,需要始终有 25 MB 的数据在路上还没被确认。接收端的缓冲区得有这么大,发送端的拥塞窗口也得涨到这么大,中间任何一跳的缓冲不够都会先丢包。
这就是为什么「买了千兆,下国外的东西还是几百 KB」——不是带宽不够,是一条连接撑不起那么大的在途量。
第 3 层:慢启动吃掉的时间
连接刚建立时拥塞窗口不是直接给满,而是从 10 个报文段(约 14.6 KB)起步,每个 RTT 翻一倍。
涨到 BDP 需要的 RTT 数是 log₂(BDP ÷ 14.6 KB):
| 场景 | BDP | 所需 RTT 数 | 耗时 |
|---|---|---|---|
| 同城千兆 | 3.75 MB | 8 | 约 0.24 s |
| 跨境千兆 | 25 MB | 11 | 约 2.2 s |
对 40 GB 的文件,两秒钟可以忽略。但对一个 5 MB 的文件,跨境场景下整个传输可能全程都在慢启动里——它从来没有到过你的带宽上限。
这解释了一个反直觉的现象:下载小文件的快慢基本由 RTT 决定,和宽带档位无关。网页加载慢、npm install 慢、拉一堆小依赖慢,升级带宽都不会改善,换个近的源才会。
第 4 层:丢包率进的是平方根
真实链路会丢包,而 TCP 把丢包当作拥塞信号,一丢就降窗口。有一条经典的经验公式(Mathis 公式)把这层关系写了出来:
吞吐 ≈ MSS ÷ (RTT × √丢包率)
代入 MSS = 1460 字节:
| RTT | 丢包率 | 单条吞吐 |
|---|---|---|
| 30 ms | 0.01% | 约 4.9 MB/s |
| 30 ms | 0.1% | 约 1.5 MB/s |
| 200 ms | 0.01% | 约 730 KB/s |
| 200 ms | 0.1% | 约 231 KB/s |
注意两个变量进入公式的方式不同:RTT 是一次方,丢包率是平方根。丢包率从 0.01% 涨到 0.1%——听起来都是「几乎不丢」——吞吐直接掉到三分之一。
这也是为什么「晚高峰变慢」的体感这么明显:拥塞带来的丢包率变化不大,但落在吞吐上是成倍的。
第 5 层:所以多线程下载在解决什么
到这里就清楚了:上面三层的限制全都是「每条连接」的。
开 8 条连接,就有 8 套独立的窗口、8 套独立的拥塞控制,总吞吐接近 8 倍,直到撞上真正的共享瓶颈——你的接入带宽、对端的总限速、磁盘写入。
推论也跟着出来:
- 局域网内传文件,多线程几乎无效 —— RTT 低到窗口从来就不是瓶颈
- 跨境下载,多线程的提升可以是数量级的
- 很多下载站按单连接限速,多线程是在规避这个限制
- 线程数不是越多越好,多数工具默认 4 – 16 条是权衡过的
回到那个估算
现在可以给出一个能用的算法了。在 带宽与下载时间 里填上折扣系数,按线路类型取:
| 线路类型 | 折扣 | 说明 |
|---|---|---|
| 同城 / CDN 命中 | 0.9 – 0.95 | 除法基本就是答案 |
| 跨省、跨运营商 | 0.6 – 0.8 | 绕路 + 对端限速 |
| 跨境单线程 | 0.1 – 0.3 | 此时决定速度的是 RTT 和丢包 |
| 跨境多线程 | 0.4 – 0.7 | 看对端是否限速 |
40 GB 在千兆宽带上:同城按 0.9 折算是 112.5 MB/s,约 6 分钟;跨境单线程按 0.1 折算只剩 12.5 MB/s,要 55 分钟。同一根线,同一个文件,差了九倍。
最后两个容易漏掉的上限:机械硬盘的持续写入约 100 – 150 MB/s(千兆下不是瓶颈,但解压海量小文件时会是),以及家里其他设备正在占用的带宽。
方向是固定的:算出来的是下限,实际只会更久。
什么时候除法就够用了
- 文件够大(≥ 1 GB),慢启动可以忽略
- 源在国内,RTT 在 50 ms 以内
- 用的是多线程下载工具
- 你只需要知道「是十分钟还是两小时」这个量级
这四条同时成立时,「大小 ÷ 带宽 × 0.9」的误差通常在两成以内。不成立的时候,先看 RTT,再看丢包,最后才看带宽档位。