第17章 内容协商与转码
比较客户端驱动、服务器驱动、透明协商以及Vary与转码
第17章 内容协商与转码
“第17章 内容协商与转码”锁定David Gourley、Brian Totty、Marjorie Sayer、Sailu Reddy、Anshu Aggarwal著,陈涓、赵振平译《HTTP权威指南》,人民邮电出版社,2012年,ISBN 9787115281487;英文原版HTTP: The Definitive Guide,O'Reilly Media,2002年9月,656页,ISBN 1565925092。O'Reilly官方页面确认英文首版的5个正文部分、21章和8个附录;中文版完整印刷目录另含“第六部分 附录”和索引。忠实度分母共586个部分、章、编号节/小节、附录与索引节点。
“第17章 内容协商与转码”未取得未获授权的完整中文正文;课程以 O’Reilly 官方在线版 与 章级导览 界定首版范围,中文解释、报文、实验和练习均为独立教学重写。现代语义仅以 RFC 9110、RFC 9111 和 RFC 9112 核对差异。
学习目标
- 能解释“第17章 内容协商与转码”的全部正式节点及其HTTP事务位置。
- 能绘制请求、响应、TCP连接、中间实体和资源状态。
- 能设计单变量实验,验证“变体选择能由Accept类首部、质量值、Vary缓存键、服务端规则和转码步骤解释”。
- 能写出含首版边界、原始报文、故障、恢复和复核人的证据包。
从一条可证伪的HTTP事务开始
先预测:缓存若不按Vary区分变体会把错误语言或编码返回给其他客户端。把预测写成“URL/资源、连接、请求报文、中间实体、响应报文、身份与编码”六行,再运行客户端、代理或服务器。结果不同先定位首个字节或状态偏差。
本页主问题是:比较客户端驱动、服务器驱动、透明协商以及Vary与转码。每条消息要注明发送者、接收者、HTTP版本、连接复用、逐跳/端到端首部、主体边界与历史协议状态。
验收不变量是:变体选择能由Accept类首部、质量值、Vary缓存键、服务端规则和转码步骤解释。最终页面正常、状态码200或TLS通道建立都只是局部事实,不能单独证明资源身份、缓存变体、代理转发与证书身份全部正确。
核心词汇与首版边界
↡在多个资源变体中为请求选择合适表示的机制、↡Accept类首部中表示相对偏好的q参数、↡声明响应选择依赖哪些请求首部并影响缓存键的首部、↡由中间缓存参与选择服务器提供变体的协商方式、↡动态转换内容格式、合成信息或注入内容的处理
这些词汇固定在2002年英文首版和2012年中译本语境。在“第17章 内容协商与转码”中,HTTP/2、HTTP/3、OAuth、JWT、SameSite、HSTS和现代CDN行为只作独立比较,不得替换HTTP-NG、Digest、WebDAV、WPAD等首版节点。
核心机制深读
先从内容协商画出事务
比较客户端驱动、服务器驱动、透明协商以及Vary与转码。先固定资源身份和请求目标,再标出客户端、中间实体与源服务器,任何优化或安全结论都不能跳过原始报文。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
区分内容协商与质量值
内容协商和质量值可能在同一事务中协作,但责任、状态位置和失败语义不同。对比正常请求、单个首部变化和单个连接故障,定位首个偏差。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
让Vary经过真实中间实体
代理、缓存、网关或隧道会读取、添加、删除或转发不同首部。逐跳记录Via、Connection列出的字段、缓存决策和认证边界。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
验证透明协商的历史语境
原书写于2002年,以HTTP/1.0、HTTP/1.1、SSL/TLS早期版本和当时Web基础设施为背景。现代实现可做对照,但不能冒充原书节点。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
用转码关闭证据门
变体选择能由Accept类首部、质量值、Vary缓存键、服务端规则和转码步骤解释。证据至少包含原始请求/响应、TCP时间线、中间状态、失败注入、恢复动作和第三方复核。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
首版机制逐项深读
第17章 内容协商与转码
验证“第17章 内容协商与转码”固定资源,只改变一个 Accept 维度,比较响应元数据、Vary、缓存键和实体字节是否同步变化。
17.1 内容协商技术
分析“17.1 内容协商技术”要列出候选表示、客户端偏好和服务器能力,再解释最终选择;q 值只是偏好权重,不是强制命令。
17.2 客户端驱动的协商
验证“17.2 客户端驱动的协商”固定资源,只改变一个 Accept 维度,比较响应元数据、Vary、缓存键和实体字节是否同步变化。
17.3 服务器驱动的协商
定位“17.3 服务器驱动的协商”要用同一关联号串起连接、解析结果、资源映射、权限判定、响应元数据与访问日志,不能只观察浏览器页面。
17.3.1 内容协商首部集
验证“17.3.1 内容协商首部集”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
17.3.2 内容协商首部中的质量值
“17.3.2 内容协商首部中的质量值”用 q 值表达客户端对媒体类型、语言、字符集或编码的相对偏好;零表示不可接受,服务器还需结合自身能力选择。
17.3.3 随其他首部集而变化
验证“17.3.3 随其他首部集而变化”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
17.3.4 apache 中的内容协商
分析“17.3.4 apache 中的内容协商”要列出候选表示、客户端偏好和服务器能力,再解释最终选择;q 值只是偏好权重,不是强制命令。
17.3.5 服务器端扩展
“17.3.5 服务器端扩展”的失败应归到接收、解析、映射、授权、执行或发送中的首个异常阶段;后续 500 响应只是结果,不是根因。
17.4 透明协商
“17.4 透明协商”从多个可用表示中选择或生成响应;选择依据必须进入 Vary 或等价缓存维度,转码前后还要保留媒体类型、编码与语义差异。
17.4.1 进行缓存与备用候选
验证“17.4.1 进行缓存与备用候选”固定响应字节与缓存键,只改变 Age、寿命或验证器中的一个量,观察新鲜命中、304 再验证和完整回源。
17.4.2 vary 首部
“17.4.2 vary 首部”声明服务器选择表示时读取了哪些请求首部;共享缓存必须把这些维度纳入变体键,避免把一种语言或编码发给错误客户端。
17.5 转码
“17.5 转码”从多个可用表示中选择或生成响应;选择依据必须进入 Vary 或等价缓存维度,转码前后还要保留媒体类型、编码与语义差异。
17.5.1 格式转换
“17.5.1 格式转换”若生成新表示,必须记录转换链和信息损失;静态预生成与请求时转码的缓存、时延和错误边界不同。
17.5.2 信息综合
“17.5.2 信息综合”若生成新表示,必须记录转换链和信息损失;静态预生成与请求时转码的缓存、时延和错误边界不同。
17.5.3 内容注入
“17.5.3 内容注入”若生成新表示,必须记录转换链和信息损失;静态预生成与请求时转码的缓存、时延和错误边界不同。
17.5.4 转码与静态预生成的对比
验证“17.5.4 转码与静态预生成的对比”固定资源,只改变一个 Accept 维度,比较响应元数据、Vary、缓存键和实体字节是否同步变化。
17.6 下一步计划
“17.6 下一步计划”用于区分 2002 年首版观察与后续 HTTP 演进:先复原原书当时的限制,再把现代 RFC 结论作为单独对照,二者不能互相冒充。
17.7 更多信息
“17.7 更多信息”是原书的延伸资料入口,不增加新的协议结论;使用时必须记录资料版本、适用的 HTTP 年代和与本章结论的对应关系。
复原原始HTTP事务
固定URL、资源、连接与版本,写出请求行、首部、主体、响应和所有中间实体。
HTTP/1.1 message laboratory
第17章 内容协商与转码
比较客户端驱动、服务器驱动、透明协商以及Vary与转码
GET /resource?chapter=%E7%AC%AC17%E7%AB%A0%20%E5%86%85%E5%AE%B9%E5%8D%8F%E5%95%86%E4%B8%8E%E8%BD%AC%E7%A0%81 HTTP/1.1 Host: example.test Connection: keep-alive
章内坐标:第17章 内容协商与转码、17.1 内容协商技术、17.2 客户端驱动的协商、17.3 服务器驱动的协商、17.3.1 内容协商首部集、17.3.2 内容协商首部中的质量值、17.3.3 随其他首部集而变化、17.3.4 apache 中的内容协商
可复现实验记录
GET /resource HTTP/1.1
Host: example.test
Connection: keep-alive
Accept: */*HTTP/1.1 200 OK
Date: Tue, 01 Jan 2002 00:00:00 GMT
Content-Type: text/plain
Content-Length: 5
helloevidence = request_bytes + response_bytes + tcp_timeline + intermediary_state + recovery动手试:保存一次正常请求、一次缓存或连接边界和一次单变量故障。记录客户端、代理、缓存、网关与源服务器看到的原始报文,以及统一时间戳和恢复动作。
独立证据门
最小证据包包含:首版节点、URL、原始请求/响应、连接时间线、代理与缓存决策、身份和编码、单变量故障、恢复、偏差、责任人与复核人。
练习
练习
问题 1:为什么“第17章 内容协商与转码”必须固定2002年首版?
问题 2:怎样构造“缓存若不按Vary区分变体会把错误语言或编码返回给其他客户端”的最小反例?
问题 3:何时可以认为本页完成独立交接?
本章回顾
“第17章 内容协商与转码”的核心是比较客户端驱动、服务器驱动、透明协商以及Vary与转码。真正掌握不是记首部名,而是能用原始报文、连接和中间状态证明资源如何被定位、传输、缓存、保护与交付。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 内容协商
在多个资源变体中为请求选择合适表示的机制。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 质量值
Accept类首部中表示相对偏好的q参数。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- Vary
声明响应选择依赖哪些请求首部并影响缓存键的首部。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 透明协商
由中间缓存参与选择服务器提供变体的协商方式。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 转码
动态转换内容格式、合成信息或注入内容的处理。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。