浏览器、网络与安全 · KNOWLEDGE CHAPTER
K13

HTTP 语义、缓存与传输

一次 HTTP 交互有三个独立问题:这个操作允许产生什么效果,已有表示能否复用,字节何时能交付。方法、缓存与传输协议分别回答它们,不能互相代替。

浏览器、网络与安全2 道章节练习5 道主练关联

核心模型

一次 HTTP 交互有三个独立问题:这个操作允许产生什么效果,已有表示能否复用,字节何时能交付。方法、缓存与传输协议分别回答它们,不能互相代替。

原理与机制

方法语义决定重试风险

安全方法表达客户端不要求改变资源状态;幂等表达重复执行与执行一次的预期最终效果相同,不要求响应正文或状态码相同。DELETE 首次成功、再次不存在仍可幂等。网络断开只说明客户端没拿到可靠回执,服务器可能已经提交。因此订单创建要围绕同一次业务操作复用幂等键,服务端把键、请求摘要、结果与实际写入原子关联;禁用按钮或把 POST 换个名字都不能提供这个保证。

缓存分为新鲜复用与条件验证

已有响应先按缓存键找到候选,再按新鲜度判断能否直接复用。过期不等于删除,ETag 可配 If-None-Match 发起验证;GET 或 HEAD 选中的表示未变时,304 让缓存复用原响应体并更新元数据。no-cache 允许存储但复用前必须成功验证,no-store 要求不存储,private 限制共享缓存。入口 HTML 需要及时发现新版本,内容哈希资源可长缓存,用户专属接口不能为了命中率随意设成 public。

验证器必须属于正确变体

同一 URL 的语言与压缩表示可能不同,Vary 让缓存将相应请求头纳入匹配,ETag 则描述已选中的表示。Vary 不会替服务器选择语言,强 ETag 也不能在字节不同的压缩版本间随便共用。源站正确不代表 CDN 正确:边缘压缩、重写头或缓存键配置都可能串变体。测试应交替请求语言与编码组合,再强制验证,检查正文归属而非只盯 304。维度过多会稀释命中,应让可分享语言优先有明确 URL。

传输升级与资源提示只优化关键路径

HTTP/2 把多个流复用在 TCP 连接上,丢包仍可能阻塞其有序字节交付;HTTP/3 的 QUIC 独立流减少流间这类阻塞,但仍共享带宽、拥塞与服务端资源。preconnect 提前建立连接,preload 提前获取具体资源,modulepreload 面向模块,fetchpriority 是相对优先级提示。预加载 URL、用途与凭据模式不匹配可能重复下载,把所有资源标高优先级反而争抢关键资源。结论必须来自冷缓存、弱网瀑布与真实协议测量。

协议结果仍需映射业务结果

拿到 JSON 不是成功判据。201 表示创建,204 表示无正文,401 与认证相关,403 表达拒绝,404 表达未找到;应用在解析前就应按状态决定流程。验证器也必须结合方法语义:GET 或 HEAD 未变化可用 304,不能把其他条件写请求的结果套成相同规则。排查缓存时记录请求实际有没有发送、由哪一层回应、命中了哪个用户和表示,让状态码成为可解释的证据而不是成功率装饰。

最小示例

http
http · 纯文本
GET /guide HTTP/1.1
Accept-Language: zh-CN
Accept-Encoding: gzip

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Vary: Accept-Language, Accept-Encoding
ETag: "guide-zh-gzip-v7"

# 过期后的同一变体请求
If-None-Match: "guide-zh-gzip-v7"
# 服务端若确认所选表示未变:304,无新响应体

这是匿名公共文档的协议示意。60 秒内可按策略复用;过期后条件验证成功可继续使用中文 gzip 变体。换英文或不同编码时,缓存应选另一表示,不能因 URL 相同而拿错正文。304 的元数据仍须符合原表示的缓存约定。

环境:HTTP 报文教学示意,适用于支持条件请求及变体缓存的客户端、源站与 CDN;不是可直接运行的完整服务器。

核验:已按 HTTP 语义静态核对报文示意;未搭建源站或 CDN,未执行实际缓存、变体及 304 集成测试。

边界与取舍

边界

  • 幂等讨论服务端预期效果,不是“每次返回相同”;客户端超时也不等于服务端回滚。
  • no-store 不是清除所有旧副本的指令;HTTP 缓存策略也不能替代账号授权或 bfcache 恢复验证。
  • HTTP/3 不消除所有排队,QUIC 使用 UDP 并不代表应用放弃可靠交付。

取舍

  • 长缓存节约网络与延迟,但要求资源 URL 与失效策略可靠;频繁验证更及时,却支付往返成本。
  • 拆分与预加载可缩短关键依赖发现,但增加请求、调度和带宽竞争;先测用户可见关键路径。

口述示范

我先用方法语义判断能否安全重试,再区分缓存的新鲜度、验证器和变体匹配,最后讨论 HTTP/2、HTTP/3 与加载提示。缓存命中、协议更新都不是单独的性能结论,要用正确内容和用户耗时一起验收。

章节练习

练习 1

匿名多语言站点经 CDN 压缩后偶尔显示错误语言,怎样定位?

展开检查点
  • 构造两语言乘两编码的请求矩阵。
  • 核对边缘 Vary、缓存键、Content-Encoding 与强 ETag。
  • 验证过期 304 复用正确变体,不能只检查源站。
练习 2

创建操作服务端成功但响应丢失;同时首屏图片下载慢。分别提出修复。

展开检查点
  • 同一业务重试复用幂等键,服务端原子去重并校验内容。
  • 从瀑布区分晚发现、连接、传输和服务端等待。
  • 只对确定关键资源使用匹配的提示,比较冷缓存指标。

参考来源与核验边界

方法与验证器按 RFC 9110,HTTP/3 按 RFC 9114;优先级提示、缓存实现和 CDN 行为以目标部署实测为准。

内容版本:2026-10-04.2 · 题目和来源 ID 保持原样,本站不将面经标签解释为企业官方出题或高频保证。