页面加载是一条串行的接力赛:DNS → TCP → TLS → 等待首字节 → 下载资源。任何一棒慢,后面全部顺延。拆开看每一段花了多少,才知道该优化哪里。
-
首字节耗时(ms)
-
单资源下载(ms)
-
资源总下载(ms)
-
总加载(ms)
| 阶段 | 本段耗时 | 累计 | 占比 |
|---|
首字节耗时 = DNS + TCP + TLS + TTFB;单资源下载 = 资源大小(KB) × 8 ÷ 带宽(Mbps);资源总下载 ≈ ⌈资源数 ÷ 并发数⌉ × 单资源下载;总加载 = 首字节耗时 + 资源总下载。这是稳态近似模型,未计入连接复用、缓存命中与优先级调度带来的优化。
首字节之前发生了什么
用户输入网址到看到第一个字节,中间有四段完全串行的过程。任何一段都可以成为瓶颈,而且它们的成因与优化手段完全不同:
| 阶段 | 典型耗时 | 快了靠什么 |
|---|---|---|
| DNS 解析 | 10–50 ms | 换更近的权威 DNS、开 DNS 预解析 |
| TCP 建连 | 10–100 ms | CDN 就近接入、开 HTTP/2 或 3 |
| TLS 握手 | 50–200 ms | TLS 1.3(一次往返)、会话复用、OCSP Stapling |
| 等待首字节 | 100–1000 ms | 服务端渲染提速、数据库优化、加缓存 |
注意第三段几乎全部是「往返次数 × 网络延迟」的函数。跨洋链路的单次往返约 150–250 ms,而 TLS 1.2 需要两次往返、TLS 1.3 只要一次——一个协议版本升级,首屏就能省下几百毫秒。这也是 CDN 的价值所在:把服务器搬到离用户几十毫秒的地方,所有往返都变短。
为什么并发数不是越多越好
浏览器对同一域名的并发连接数有上限(HTTP/1.1 通常为 6)。把 30 个资源塞给 6 条连接,就要分 5 批下载。理论上把并发提到 30 会快 5 倍——但实际上会带来三个问题:
- 队头阻塞:连接数过多时 TCP 拥塞控制互相干扰,单条连接的有效吞吐反而下降。
- 带宽争抢:所有连接分食同一条物理带宽,总量不变,只是分得更碎。
- 服务端压力:高并发握手会显著增加服务器 CPU 与内存开销。
真正的解法不是加并发,而是减少请求:合并资源、用雪碧图、开启 HTTP/2(多路复用彻底绕开并发限制)、把首屏非关键资源延迟加载。
三个高杠杆优化
- 开 HTTP/2 或 HTTP/3:一个连接承载所有请求,天然消除「6 并发」瓶颈,是性价比最高的一步。
- 给资源加缓存头:二次访问时静态资源完全不下载,这一步能把总加载时间砍掉一大半。
- 用 preconnect 预热:对关键的第三方域名(字体、CDN、统计)提前握手,把 DNS/TCP/TLS 三段从关键路径上移走。
你可能还想问
首屏时间主要卡在哪?
通常是关键样式表与首屏图片、以及阻塞渲染的同步脚本;把关键样式前置或内联、其余资源异步加载,首屏改善最明显。
串行加载和并行有什么区别?
新协议下多路复用可并行拉取,但连接数与依赖顺序仍会造成等待;把无依赖的资源尽早并行发出,是缩短时间线的关键动作。
优化后怎么验证效果?
用同一网络条件与设备多次测量取中位数,对比优化前后的时间线;只测一次容易被抖动误导,并注意区分冷缓存与热缓存结果。
速查在线工具箱