HTTP 103 Early Hints:网页还没返回,服务器为什么先说一声

TL;DR

HTTP 103 Early Hints 允许服务器在最终响应之前先发送 Link 预加载和预连接提示。本文解释它与 HTTP/2 Push 的差异、适合的资源、错误提示的代价,以及如何用真实指标判断它是否有效。

HTTP 103 Early Hints 允许服务器在最终响应之前先发送 Link 预加载和预连接提示。本文解释它与 HTTP/2 Push 的差异、适合的资源、错误提示的代价,以及如何用真实指标判断它是否有效。

HTTP 103 Early Hints:网页还没返回,服务器为什么先说一声

网页打开时,用户感受到的第一件事往往不是最终内容,而是“等了多久才开始动”。服务器可能需要查询数据库、渲染模板或等待后端服务,但浏览器其实已经知道某些资源很重要:CSS、字体、主脚本。HTTP 103 Early Hints 允许服务器在最终响应准备好之前,先发一条提示,让客户端提前准备这些资源。RFC 8297

浏览器请求与服务器响应示意图

它的关键不是“提前返回半个 HTML”,而是发送一个临时的信息响应。后面仍然要有真正的最终响应,例如 200 OK304 Not Modified。如果把 103 当成最终结果,缓存、权限和内容完整性都会变得混乱。

普通请求为什么会浪费等待时间

一次页面请求可以粗略分成几段:建立连接、发送请求、等待服务器开始响应、下载 HTML、解析 HTML、发现 CSS 和脚本、再下载这些资源。即使服务器能在 200 毫秒后返回 HTML,浏览器也可能要等解析到 <link><script> 才知道下一批资源在哪里。

如果服务器在生成页面之前就知道关键资源,可以把等待阶段利用起来:

HTTP/1.1 103 Early Hints
Link: </styles/main.css>; rel=preload; as=style
Link: </app.js>; rel=preload; as=script

HTTP/1.1 200 OK
Content-Type: text/html

<!doctype html>
...

第一段不是页面正文,而是给客户端的“可能即将用到这些资源”的提示。最终响应通常仍会带上相应的 Link 信息或在 HTML 中引用资源。客户端应该把它当作预加载建议,而不是不可撤销的承诺。

103 到底提前了什么

最常见的是 Link 响应头,配合 preloadpreconnect 等关系使用:

  • preload:尽早下载一个当前页面很可能需要的资源。
  • preconnect:提前建立到另一个源的连接,减少后续握手等待。
  • dns-prefetch:提前进行域名解析,但节省的时间通常小于完整连接准备。

Early Hints 的价值取决于“提示是否正确”和“等待是否足够长”。如果 HTML 很快就返回,提前提示可能几乎没有收益;如果服务端渲染要等较久,提前建立连接和下载关键 CSS 才可能改善首屏。

它和 HTTP/2 Server Push 有什么不同

Server Push 是服务器主动把资源推给客户端;Early Hints 主要是在最终响应前告诉客户端“你可以自己开始准备”。后者让浏览器保留更多控制权,浏览器可以根据缓存、优先级和当前网络决定是否真的加载。

这也意味着 Early Hints 不会神奇地消除网络成本。预加载了错误资源,可能抢占真正重要资源的带宽;预加载了用户最终不会看到的页面资源,反而增加浪费。性能优化不是把所有文件都提前下载,而是把关键路径上确定性高、等待成本大的资源往前移动。

为什么不能随便发一个 103

1. 资源提示必须接近事实

如果页面根据用户身份、实验分组或地区加载不同脚本,边缘缓存层可能并不知道最终会使用哪一份资源。此时过于具体的 Early Hints 可能造成错误预加载,甚至引入缓存键设计问题。

2. 提示不能当作最终安全边界

103 只表示服务器预计最终响应会包含相关字段。客户端不能把它当成权限授予,也不能因为收到了一个预加载 URL 就认为资源一定属于最终页面。最终响应仍然要经过正常的缓存、CSP、完整性和权限处理。

3. 中间设备可能改变体验

浏览器、CDN、反向代理和 HTTP/2/HTTP/3 链路的支持情况都可能不同。部署时不能只看源站日志,需要确认真实用户是否收到 103、资源是否真的提前开始,以及带宽是否被错误预加载占用。

怎样判断它真的有效

不要只比较服务器的 TTFB。应同时观察:

  • 关键 CSS 和字体的请求开始时间是否提前。
  • First Contentful Paint、Largest Contentful Paint 是否改善。
  • 首屏资源的缓存命中率和取消下载比例。
  • 移动网络下的额外流量与并发连接数。
  • 页面分支变化时,错误提示的比例。

一个稳妥的落地方式是先只提示确定性最高的 CSS,再做小流量实验。对动态页面,宁愿少预加载一两个资源,也不要把整个资源清单都塞进 103。

一句话带走

Early Hints 做的是“把浏览器已经迟早要做的准备提前一点”,不是提前发送页面答案。它最适合解决服务器生成内容时的空档,但收益建立在资源判断准确、链路支持良好和测量完整的基础上。

延伸阅读

KEEP READING