40 GB 要下多久:为什么「大小 ÷ 带宽」算出来的时间总比实际快

· 约 4 分钟 📶 带宽与下载时间

「40 GB 的素材,千兆宽带,多久下完?」

40 GB ÷ 125 MB/s = 328 秒,五分半。这个数字几乎从来不会实现,而原因不是宽带被限速了。

除法只回答了「你家门口那根线最多能过多少」。真正决定耗时的是另外几个量,它们每一个都能把结果拉长一个数量级。

第 0 层:单位(8 倍)

先把最常见的那个误会清掉:运营商卖的是比特,下载软件显示的是字节,差 8 倍。100 M 宽带的理论满速是 12.5 MB/s。这一层 带宽与下载时间 的页面上有完整对照,下面不再重复。

后面讲的都是换算之后仍然对不上的部分。

第 1 层:单条连接的天花板是「窗口 ÷ RTT」

TCP 不是把数据一股脑推出去,而是发出一批、等确认、再发下一批。同一时刻允许「在途」而未被确认的数据量就是窗口。于是单条连接的吞吐有一个硬上限:

吞吐 ≤ 窗口大小 ÷ RTT

这个式子的杀伤力在于带宽根本不在里面

窗口RTT单条上限
64 KB30 ms(同城)2.13 MB/s(约 17 Mbps)
64 KB200 ms(跨境)320 KB/s(约 2.6 Mbps)
4 MB30 ms133 MB/s
4 MB200 ms20 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 MB8约 0.24 s
跨境千兆25 MB11约 2.2 s

对 40 GB 的文件,两秒钟可以忽略。但对一个 5 MB 的文件,跨境场景下整个传输可能全程都在慢启动里——它从来没有到过你的带宽上限。

这解释了一个反直觉的现象:下载小文件的快慢基本由 RTT 决定,和宽带档位无关。网页加载慢、npm install 慢、拉一堆小依赖慢,升级带宽都不会改善,换个近的源才会。

第 4 层:丢包率进的是平方根

真实链路会丢包,而 TCP 把丢包当作拥塞信号,一丢就降窗口。有一条经典的经验公式(Mathis 公式)把这层关系写了出来:

吞吐 ≈ MSS ÷ (RTT × √丢包率)

代入 MSS = 1460 字节:

RTT丢包率单条吞吐
30 ms0.01%约 4.9 MB/s
30 ms0.1%约 1.5 MB/s
200 ms0.01%约 730 KB/s
200 ms0.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,再看丢包,最后才看带宽档位

❓ 常见问题

为什么下载刚开始很慢,过几秒才冲上去?

这是 TCP 慢启动,不是网络在「预热」机制:连接建立后拥塞窗口从 10 个报文段(约 14.6 KB)起步,每经过一个 RTT 翻一倍,直到探测到瓶颈为止。代价有多大:(1) 同城 RTT 30 ms,涨到能跑满千兆所需的 3.75 MB 在途数据要 8 个 RTT,约 0.24 秒;(2) 跨境 RTT 200 ms,涨到 25 MB 要 11 个 RTT,约 2.2 秒什么时候致命:下载一个 5 MB 的文件,跨境场景下整个传输可能全程都在慢启动阶段,从没到过你的带宽上限——这也是「小文件下载感觉特别慢」的真正原因,和带宽无关。

多线程下载为什么能变快?是在抢别人的带宽吗?

它绕开的是单条连接的上限,不是抢占单条 TCP 的吞吐天花板是「窗口 ÷ RTT」,还要被自己那条连接的丢包率压制。开 8 条连接,等于有 8 套独立的窗口和拥塞控制,总吞吐接近 8 倍,直到撞上真正的瓶颈(你的带宽、对端限速、磁盘)。所以:(1) 本地局域网传文件,多线程几乎没有提升——RTT 低到窗口根本不是瓶颈;(2) 跨境、跨运营商下载,多线程的提升可以是数量级的;(3) 很多下载站按连接数限速,多线程是在规避单连接限速。副作用:线程数过多会增加对端负担,多数工具默认 4 – 16 条是有道理的。

同样的带宽,为什么下国内的镜像很快、下 GitHub 很慢?

差别在 RTT 和丢包率,不在带宽一条经验公式(Mathis 公式)说明了这件事:单条连接的吞吐大致等于 MSS ÷ (RTT × √丢包率)代入:(1) 国内同城,RTT 30 ms、丢包 0.01%,算出约 4.9 MB/s;(2) 跨境,RTT 200 ms、丢包 0.1%,算出约 231 KB/s两个变量的影响:RTT 进入分母是一次方,丢包率进的是平方根——丢包率从 0.01% 涨到 0.1%,吞吐直接掉到三分之一实用结论:跨境慢的时候升级宽带档位几乎没有效果,换线路(镜像站、国内源)才有。国内常用镜像的配置见 国内镜像源配置

估算时的「利用率折扣」该填多少?

按线路类型分三档。(1) 同城 / 本地 CDN 命中:90% – 95%,除法基本就是答案;(2) 跨省、跨运营商:60% – 80%,绕路和对端限速开始起作用;(3) 跨境单线程:10% – 30%,此时决定速度的是 RTT 和丢包,不是你的带宽档位。另外两个常被忽略的上限:机械硬盘持续写入约 100 – 150 MB/s(千兆宽带下不是瓶颈,但海量小文件会是),以及家里其他设备正在占用的带宽。方向是固定的——实际耗时只会比算出来的长,把结果当下限用。

📶 打开 带宽与下载时间 Mbps↔MB/s·文件多久下完·宽带档位真实速度·码率需求

🔗 相关阅读

全部教程 →