第15章 实体和编码

掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码

第15章 实体和编码

“第15章 实体和编码”锁定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个部分、章、编号节/小节、附录与索引节点。

“第15章 实体和编码”未取得未获授权的完整中文正文;课程以 O’Reilly 官方在线版章级导览 界定首版范围,中文解释、报文、实验和练习均为独立教学重写。现代语义仅以 RFC 9110RFC 9111RFC 9112 核对差异。

学习目标

  • 能解释“第15章 实体和编码”的全部正式节点及其HTTP事务位置。
  • 能绘制请求、响应、TCP连接、中间实体和资源状态。
  • 能设计单变量实验,验证“接收方能无歧义确定主体边界、解码顺序、媒体解释、实例身份和部分响应范围”。
  • 能写出含首版边界、原始报文、故障、恢复和复核人的证据包。

从一条可证伪的HTTP事务开始

先预测:把Content-Encoding与Transfer-Encoding颠倒或信任错误Content-Length会截断、挂起或错误解析连接。把预测写成“URL/资源、连接、请求报文、中间实体、响应报文、身份与编码”六行,再运行客户端、代理或服务器。结果不同先定位首个字节或状态偏差。

本页主问题是:掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码。每条消息要注明发送者、接收者、HTTP版本、连接复用、逐跳/端到端首部、主体边界与历史协议状态。

验收不变量是:接收方能无歧义确定主体边界、解码顺序、媒体解释、实例身份和部分响应范围。最终页面正常、状态码200或TLS通道建立都只是局部事实,不能单独证明资源身份、缓存变体、代理转发与证书身份全部正确。

核心词汇与首版边界

这些词汇固定在2002年英文首版和2012年中译本语境。在“第15章 实体和编码”中,HTTP/2、HTTP/3、OAuth、JWT、SameSite、HSTS和现代CDN行为只作独立比较,不得替换HTTP-NG、Digest、WebDAV、WPAD等首版节点。

核心机制深读

先从实体画出事务

掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码。先固定资源身份和请求目标,再标出客户端、中间实体与源服务器,任何优化或安全结论都不能跳过原始报文。

动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。

区分实体与Content-Length

实体和Content-Length可能在同一事务中协作,但责任、状态位置和失败语义不同。对比正常请求、单个首部变化和单个连接故障,定位首个偏差。

动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。

让内容编码经过真实中间实体

代理、缓存、网关或隧道会读取、添加、删除或转发不同首部。逐跳记录Via、Connection列出的字段、缓存决策和认证边界。

动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。

验证传输编码的历史语境

原书写于2002年,以HTTP/1.0、HTTP/1.1、SSL/TLS早期版本和当时Web基础设施为背景。现代实现可做对照,但不能冒充原书节点。

动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。

用分块编码关闭证据门

接收方能无歧义确定主体边界、解码顺序、媒体解释、实例身份和部分响应范围。证据至少包含原始请求/响应、TCP时间线、中间状态、失败注入、恢复动作和第三方复核。

动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。

首版机制逐项深读

第15章 实体和编码

验证“第15章 实体和编码”用完整实体、截尾实体和局部范围三组字节,比较边界解析、摘要或验证器与最终表示是否一致。

15.1 报文是箱子,实体是货物

分析“15.1 报文是箱子,实体是货物”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。

15.2 content-length: 实体的大小

分析“15.2 content-length: 实体的大小”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。

15.2.1 检测截尾

“15.2.1 检测截尾”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。

15.2.2 错误的content-length

“15.2.2 错误的content-length”说明错误长度会让接收端把实体截短或吞入下一条消息;持久连接下必须以线路边界和完整性校验共同确认。

15.2.3 content-length 与持久连接

“15.2.3 content-length 与持久连接”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。

15.2.4 内容编码

核对“15.2.4 内容编码”要保存编码前后实体、Content-Type、Content-Encoding、线路长度与解码长度,避免把传输编码误当资源格式。

15.2.5 确定实体主体长度的规则

“15.2.5 确定实体主体长度的规则”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。

15.3 实体摘要

核对“15.3 实体摘要”要保存 401 或 407 挑战、保护域、nonce、请求目标和 Authorization,区分身份验证、通道保密与资源授权。

15.4 媒体类型和字符集

验证“15.4 媒体类型和字符集”用同一文本的两种编码或语言表示,改变一个 Accept 或 Content 元数据并检查协商、缓存变体与显示结果。

15.4.1 文本的字符编码

验证“15.4.1 文本的字符编码”用完整实体、截尾实体和局部范围三组字节,比较边界解析、摘要或验证器与最终表示是否一致。

15.4.2 多部分媒体类型

“15.4.2 多部分媒体类型”的失败会表现为消息串线、解码错误或错误变体;仅凭 200 状态无法证明实体完整且可解释。

15.4.3 多部分表格提交

核对“15.4.3 多部分表格提交”要保存编码前后实体、Content-Type、Content-Encoding、线路长度与解码长度,避免把传输编码误当资源格式。

15.4.4 多部分范围响应

验证“15.4.4 多部分范围响应”用完整实体、截尾实体和局部范围三组字节,比较边界解析、摘要或验证器与最终表示是否一致。

15.5 内容编码

验证“15.5 内容编码”用完整实体、截尾实体和局部范围三组字节,比较边界解析、摘要或验证器与最终表示是否一致。

15.5.1 内容编码过程

“15.5.1 内容编码过程”的失败会表现为消息串线、解码错误或错误变体;仅凭 200 状态无法证明实体完整且可解释。

15.5.2 内容编码类型

“15.5.2 内容编码类型”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。

15.5.3 accept-encoding 首部

“15.5.3 accept-encoding 首部”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。

15.6 传输编码和分块编码

“15.6 传输编码和分块编码”把消息主体拆成十六进制长度标记的块,以零长度块结束;它只界定传输,不改变解码后的实体语义。

15.6.1 可靠传输

“15.6.1 可靠传输”的失败会表现为消息串线、解码错误或错误变体;仅凭 200 状态无法证明实体完整且可解释。

15.6.2 transfer-encoding 首部

分析“15.6.2 transfer-encoding 首部”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。

15.6.3 分块编码

“15.6.3 分块编码”把消息主体拆成十六进制长度标记的块,以零长度块结束;它只界定传输,不改变解码后的实体语义。

15.6.4 内容编码与传输编码的结合

“15.6.4 内容编码与传输编码的结合”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。

15.6.5 传输编码的规则

“15.6.5 传输编码的规则”描述表示字节及其封装:媒体类型说明格式,内容编码说明变换,长度或分块界定边界,验证器和范围支持局部传输。

15.7 随时间变化的实例

“15.7 随时间变化的实例”在本章用于回答“掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码”。学习时必须把这个名称落到具体报文、连接、中间状态或历史规范,并说明它改变了哪项可观察结果。

15.8 验证码和新鲜度

“15.8 验证码和新鲜度”由缓存键、当前年龄、新鲜寿命、Vary 维度和验证器共同决定;命中不等于新鲜,过期对象也可能通过条件请求复用。

15.8.1 新鲜度

分析“15.8.1 新鲜度”先计算校正年龄与新鲜寿命,再检查 Vary、ETag 或 Last-Modified 和请求指令;是否联系源站不是唯一证据。

15.8.2 有条件的请求与验证码

分析“15.8.2 有条件的请求与验证码”先计算校正年龄与新鲜寿命,再检查 Vary、ETag 或 Last-Modified 和请求指令;是否联系源站不是唯一证据。

15.9 范围请求

核对“15.9 范围请求”要保存编码前后实体、Content-Type、Content-Encoding、线路长度与解码长度,避免把传输编码误当资源格式。

15.10 差异编码

“15.10 差异编码”只传输客户端已有实例与目标实例之间的差异;双方必须明确基础版本和验证器,否则差异无法安全应用。

15.11 更多信息

“15.11 更多信息”是原书的延伸资料入口,不增加新的协议结论;使用时必须记录资料版本、适用的 HTTP 年代和与本章结论的对应关系。

分步1 / 3

复原原始HTTP事务

固定URL、资源、连接与版本,写出请求行、首部、主体、响应和所有中间实体。

HTTP/1.1 message laboratory

第15章 实体和编码

掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码

请求方法
GET /resource?chapter=%E7%AC%AC15%E7%AB%A0%20%E5%AE%9E%E4%BD%93%E5%92%8C%E7%BC%96%E7%A0%81 HTTP/1.1
Host: example.test
Connection: keep-alive

解析边界:首部空行结束请求

章内坐标:第15章 实体和编码、15.1 报文是箱子,实体是货物、15.2 content-length: 实体的大小、15.2.1 检测截尾、15.2.2 错误的content-length、15.2.3 content-length 与持久连接、15.2.4 内容编码、15.2.5 确定实体主体长度的规则

可复现实验记录

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
 
hello
evidence = request_bytes + response_bytes + tcp_timeline + intermediary_state + recovery

动手试:保存一次正常请求、一次缓存或连接边界和一次单变量故障。记录客户端、代理、缓存、网关与源服务器看到的原始报文,以及统一时间戳和恢复动作。

独立证据门

最小证据包包含:首版节点、URL、原始请求/响应、连接时间线、代理与缓存决策、身份和编码、单变量故障、恢复、偏差、责任人与复核人。

练习

练习

问题 1:为什么“第15章 实体和编码”必须固定2002年首版?

问题 2:怎样构造“把Content-Encoding与Transfer-Encoding颠倒或信任错误Content-Length会截断、挂起或错误解析连接”的最小反例?

问题 3:何时可以认为本页完成独立交接?

本章回顾

“第15章 实体和编码”的核心是掌握实体长度、摘要、媒体类型、内容编码、传输编码、分块、验证器、范围与差异编码。真正掌握不是记首部名,而是能用原始报文、连接和中间状态证明资源如何被定位、传输、缓存、保护与交付。

名词解释

本章出现的专业名词,用大白话再讲一遍。

实体

HTTP报文中由实体首部和实体主体组成的内容载荷。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。

Content-Length

声明实体主体八位字节长度的首部。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。

内容编码

对表示内容应用压缩等变换且由接收方解码的机制。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。

传输编码

为安全传输改变报文线路表示而不改变底层内容的机制。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。

分块编码

把未知总长度主体分成带长度块并以零块结束的传输编码。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。

← 上一页:第四部分 实体、编码和国际化 · 下一页:第16章 国际化 →

讨论

评论区加载中…