题干与适用场景
这道 HTTP、网关和性能题适合后端、平台与基础设施岗位。源站在生成最终 HTML 前有一段可预测的等待时间,你需要决定是否发送 103,以及如何避免错误预加载、旧客户端误处理和缓存重复下载。
面试官考察点
- 能否区分 103 的提示语义与最终响应语义。
- 是否会用服务器思考时间、资源稳定性和缓存命中判断收益。
- 能否设计 HTTP/2 或 HTTP/3 下的渐进回退,而不是把 103 当成必需链路。
- 是否能验证预加载没有造成重复请求、错误资源或更高带宽。
回答前需要澄清的问题
先确认等待来自动态 HTML 生成还是网络传输,目标请求是否为顶层导航,客户端和代理是否可靠处理 1xx,资源 URL、版本和 as 是否稳定,以及资源是否可缓存。若最终响应能立即发送,普通 Link 头或 HTML 中的 link 元素更简单;若资源经常因鉴权、重定向或变体改变,提前提示的错误成本会超过收益。
30 秒回答框架
103 是最终响应前的提示,不是页面结果。源站可以在生成 HTML 时发送包含 Link: rel=preload 或 preconnect 的 103,让客户端并行准备资源;最终 200 仍必须提供权威头部。只对有明显服务器等待、资源预测稳定且 HTTP/2 或 HTTP/3 链路可靠的导航启用。通过缓存、重复下载、LCP、错误率和带宽指标验证,旧客户端则退回普通最终响应。
分步骤深入解答
- 定位可优化的空档。 先量出请求到最终 HTML 可用之间的服务器等待。如果源站很快返回 200,103 没有可利用的时间,应继续使用最终响应中的普通预加载。
- 定义 103 语义。 103 表示服务器预计最终响应会包含这些头字段,客户端可以投机准备,但提示不能替代最终响应,也不能改变最终响应的语义处理。
- 选择提示内容。 优先发送稳定、关键且可缓存的 CSS、脚本或连接来源。资源版本、媒体类型和跨源凭据要与最终响应一致;不确定的个性化资源不要提前提示。
- 约束协议和客户端。 优先在 HTTP/2 或 HTTP/3 上启用,并确认代理、浏览器和监控链路能正确处理 1xx。对可能把 103 当最终响应的旧 HTTP/1.1 客户端关闭或降级。
- 处理最终响应。 最终 200/3xx/4xx 才决定页面结果。若 103 中的提示后来不正确,客户端仍以最终响应为准;中间层不能把提示当作最终缓存对象。
- 验证收益与代价。 对照启用前后首屏 LCP、资源命中、重复下载、带宽和错误率。若重定向、缓存禁用或资源变体导致预加载浪费,缩小页面范围或移除 103。
高质量示范回答
我不会因为 103 看起来更快就全站开启。先确认动态 HTML 生成有可观的服务器等待,并且目标是顶层导航。若 CSS 和关键脚本的 URL、版本、as 与缓存属性稳定,我会在 HTTP/2 或 HTTP/3 上发送提示:
HTTP/2 103 Early Hints
Link: </style.abc.css>; rel=preload; as=style
Link: </app.abc.js>; rel=preload; as=script
HTTP/2 200 OK
Content-Type: text/html; charset=utf-8
Link: </style.abc.css>; rel=preload; as=style最终响应仍是权威结果,103 不能承诺资源一定会被使用。对旧客户端、错误率高的代理或资源经常因重定向和个性化而变化的页面,我回退到最终响应里的普通 Link。上线用实验比较服务器等待、LCP、缓存命中、重复下载、带宽和 4xx/5xx;如果预加载不能覆盖空档,删掉 103。
常见错误
- 把 103 当作最终状态 → 客户端会误以为页面已成功 → 说明最终响应才决定结果。
- 复制所有 HTML 资源到 103 → 个性化或非缓存资源会重复下载 → 只提示稳定关键资源。
- 忽略协议和代理兼容性 → 旧客户端可能错误解析 1xx → 优先 HTTP/2/3 并设置回退。
- 只看 LCP 不看带宽 → 预加载浪费可能掩盖局部收益 → 同时监控重复请求、缓存和错误。
- 最终响应没有重复权威头部 → 提示不是最终元数据 → 在最终响应重新给出需要的
Link。
追问及应对
103 与 HTTP/2 Server Push 有何区别?
103 让客户端决定是否预取资源,服务器只给提示;Server Push 由服务器主动发送,可能推送客户端已有缓存的资源。资源缓存不稳定时,103 通常更容易避免无谓传输。
如果最终响应发生跨源重定向怎么办?
提前建立的连接或资源可能被丢弃,收益变成额外带宽和连接成本。只对重定向稳定的入口启用,并把重定向率纳入实验指标。
如何处理动态资源版本?
使用已经确定的内容哈希 URL,或只提示能在最终响应中保持一致的版本。无法提前确定时,宁可等待最终 HTML,不要发送猜测性预加载。
为什么不用所有页面都发 103?
没有服务器等待就没有可并行化的空档;深层导航还可能已经命中缓存。按入口页面、协议、缓存和实测收益分层开启。