题干与适用场景
页面请求需要等待数据库或模板渲染,但服务器较早知道关键资源。HTTP 103 允许最终响应前发送信息性响应,客户端可以依据 Link 头提前预连接或预加载。题目要求说明它如何改善等待期间的工作,以及为什么 103 不能替代最终的 2xx、3xx 或 4xx 响应。
面试官考察点
强回答会区分临时响应与最终响应,选择高置信度且关键的资源,说明 HTTP/2、HTTP/3、代理和 CDN 链路的兼容性,并设置不支持 103 时的透明降级。还应讨论错误资源提示、缓存和跨源连接风险,以及用真实页面指标证明收益。
回答前需要澄清的问题
- 服务器能在多早、以多高置信度确定资源清单?
- 客户端、TLS 终止层、反向代理和 CDN 是否保留 1xx 响应?
- 资源是否带版本哈希,是否需要跨源
preconnect? - 目标是降低 LCP、TTFB 后的空窗,还是改善首屏字体和 CSS 到达时间?
- 失败、缓存命中和不支持 103 的客户端如何观察与回退?
30 秒回答框架
我会在后端确认最终响应前,针对少量高置信度关键资源发送 103 与 Link 头;随后仍发送正常最终响应。资源使用版本化 URL,跨源连接只指向受信任域名。代理或客户端忽略 103 时页面照常工作,不把它当作成功或缓存结果。先用 trace 和 RUM 对照支持与不支持路径的 LCP、资源发现时间、重复下载和错误率,再逐步扩大覆盖。
分步深入解答
第一步:理解消息时序
103 是信息性临时响应,后面必须有最终响应。它可以在服务器思考期间传递 Link: </app.css>; rel=preload; as=style 等提示;客户端是否执行由协议栈、浏览器和策略决定,应用不能依赖提示完成业务。
第二步:选择资源
只提示最终页面几乎必需、体积合理且 URL 稳定的 CSS、字体或预连接。不要把低概率图片、个性化脚本或用户权限相关资源全部塞进提示,否则会浪费带宽、造成错误预取和缓存污染。
HTTP/1.1 103 Early Hints
Link: </app.css>; rel=preload; as=style
Link: <https://cdn.example.com>; rel=preconnect
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8第三步:处理代理与降级
在真实入口验证负载均衡器、TLS 终止、CDN 和浏览器是否转发或消费 103。不能把中间层测试结果当成端到端能力;忽略 103 时,最终响应仍应包含普通资源引用,页面不应失败。
第四步:控制缓存和安全边界
Early Hints 只应提示与当前请求上下文一致的资源。使用内容哈希和正确的 Cache-Control,不要从用户输入生成任意 Link。跨源 preconnect 会暴露连接意图并消耗资源,只允许可信来源和必要协议参数。
第五步:避免错误预加载
如果鉴权、实验分组或地区逻辑会改变资源,等待更高置信度或不发送提示。资源版本变化时更新 URL;如果最终响应不再引用已提示资源,浏览器可能已经浪费下载,必须用指标评估这种代价。
第六步:建立观测与回滚
记录 103 是否发送、最终状态、资源发现时间、缓存命中、重复字节和跨代理差异。用 feature flag 按域名、路径或流量比例启用;若错误率、带宽或首屏指标恶化,停止发送而不影响最终 HTML。
设计取舍与边界
103 与 preload 链接
103 提前发送资源提示,HTML 中的普通 link 仍是最终权威引用。两处必须保持一致,否则可能重复下载或产生优先级冲突。提示不能替代 CSP、完整性和资源权限策略。
HTTP 版本与中间层
RFC 定义了 103 语义,但不同代理链路可能丢弃 1xx。不要声称所有部署都能获得收益;应按实际 HTTP/2、HTTP/3、CDN 与客户端组合测量,并保留无 103 的基线。
落地计划与证据
分阶段发布
先在单一路径发送静态 CSS 提示,核对最终响应和资源引用;再扩大到字体或安全的预连接。每阶段保留关闭开关,并比较首次访问、缓存访问和慢网用户。
指标与验收
关注 LCP、关键资源发现时间、首字节到首个字节节奏、重复下载字节、缓存命中率、4xx/5xx 与带宽。用浏览器开发者工具、边缘日志和 RUM 三方核对,避免只看服务器发送日志。
常见误区与追问
误区:把 103 当成最终成功
业务状态、缓存和错误处理都以最终响应为准;103 丢失或被忽略不应导致失败。
误区:提示所有资源
低置信度资源会浪费带宽和连接,优先提示少量关键且稳定的资源。
误区:只在本地直连测试
生产中的 CDN、代理和 TLS 终止可能改变 1xx 行为,必须做端到端验证。
追问:不支持 103 怎么办?
依赖最终 HTML 的普通引用和原有缓存策略,保持功能正确,只损失潜在性能收益。
追问:如何证明值得保留?
以分流实验比较 LCP、资源发现、重复字节、错误率和带宽成本,并按缓存与网络条件分层。