第3章 http 报文
掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类
第3章 http 报文
“第3章 http 报文”锁定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个部分、章、编号节/小节、附录与索引节点。
“第3章 http 报文”未取得未获授权的完整中文正文;课程以 O’Reilly 官方在线版 与 章级导览 界定首版范围,中文解释、报文、实验和练习均为独立教学重写。现代语义仅以 RFC 9110、RFC 9111 和 RFC 9112 核对差异。
学习目标
- 能解释“第3章 http 报文”的全部正式节点及其HTTP事务位置。
- 能绘制请求、响应、TCP连接、中间实体和资源状态。
- 能设计单变量实验,验证“原始字节能无歧义解析为起始行、首部与主体,并能说明方法语义和状态类别”。
- 能写出含首版边界、原始报文、故障、恢复和复核人的证据包。
从一条可证伪的HTTP事务开始
先预测:只看JSON主体会忽略消息边界、条件首部、代理首部和无主体响应的规则。把预测写成“URL/资源、连接、请求报文、中间实体、响应报文、身份与编码”六行,再运行客户端、代理或服务器。结果不同先定位首个字节或状态偏差。
本页主问题是:掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类。每条消息要注明发送者、接收者、HTTP版本、连接复用、逐跳/端到端首部、主体边界与历史协议状态。
验收不变量是:原始字节能无歧义解析为起始行、首部与主体,并能说明方法语义和状态类别。最终页面正常、状态码200或TLS通道建立都只是局部事实,不能单独证明资源身份、缓存变体、代理转发与证书身份全部正确。
核心词汇与首版边界
↡由方法、请求目标和HTTP版本构成的请求起始行、↡由HTTP版本、状态码和原因短语构成的响应起始行、↡以字段名和值携带协议元数据的报文组成部分、↡承载资源表示或请求数据的可选报文内容、↡按定义不会请求服务器改变状态的方法类别
这些词汇固定在2002年英文首版和2012年中译本语境。在“第3章 http 报文”中,HTTP/2、HTTP/3、OAuth、JWT、SameSite、HSTS和现代CDN行为只作独立比较,不得替换HTTP-NG、Digest、WebDAV、WPAD等首版节点。
核心机制深读
先从请求行画出事务
掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类。先固定资源身份和请求目标,再标出客户端、中间实体与源服务器,任何优化或安全结论都不能跳过原始报文。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
区分请求行与状态行
请求行和状态行可能在同一事务中协作,但责任、状态位置和失败语义不同。对比正常请求、单个首部变化和单个连接故障,定位首个偏差。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
让首部经过真实中间实体
代理、缓存、网关或隧道会读取、添加、删除或转发不同首部。逐跳记录Via、Connection列出的字段、缓存决策和认证边界。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
验证实体主体的历史语境
原书写于2002年,以HTTP/1.0、HTTP/1.1、SSL/TLS早期版本和当时Web基础设施为背景。现代实现可做对照,但不能冒充原书节点。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
用安全方法关闭证据门
原始字节能无歧义解析为起始行、首部与主体,并能说明方法语义和状态类别。证据至少包含原始请求/响应、TCP时间线、中间状态、失败注入、恢复动作和第三方复核。
动手试:先手写预期请求与响应,再抓取正常事务和一个单变量故障事务。标出首个不同字节或状态,不用最终页面猜根因。
首版机制逐项深读
第3章 http 报文
验证“第3章 http 报文”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
3.1 报文流
验证“3.1 报文流”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
3.1.1 报文流入源端服务器
“3.1.1 报文流入源端服务器”描述报文方向:请求朝源服务器流动,响应朝用户代理流动;上游/下游是相对当前报文方向的称呼,不是固定机器角色。
3.1.2 报文向下游流动
“3.1.2 报文向下游流动”描述报文方向:请求朝源服务器流动,响应朝用户代理流动;上游/下游是相对当前报文方向的称呼,不是固定机器角色。
3.2 报文的组成部分
分析“3.2 报文的组成部分”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。
3.2.1 报文的语法
“3.2.1 报文的语法”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。
3.2.2 起始行
“3.2.2 起始行”在本章用于回答“掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类”。学习时必须把这个名称落到具体报文、连接、中间状态或历史规范,并说明它改变了哪项可观察结果。
3.2.3 首部
“3.2.3 首部”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。 对“3.2.3 首部”的验收必须能指向原始报文、状态变化或版本证据。
3.2.4 实体的主体部分
“3.2.4 实体的主体部分”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
3.2.5 版本0.9 的报文
分析“3.2.5 版本0.9 的报文”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。
3.3 方法
“3.3 方法”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。 对“3.3 方法”的验收必须能指向原始报文、状态变化或版本证据。
3.3.1 安全方法
“3.3.1 安全方法”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
3.3.2 get
“3.3.2 get”读取资源的当前表示,通常不应改变服务器状态;缓存与条件请求可复用已有表示,但仍要按请求首部选择变体。
3.3.3 head
“3.3.3 head”返回与 GET 对应的响应首部而不传输消息主体,适合核对元数据、验证器和资源可达性。
3.3.4 put
“3.3.4 put”要求用请求主体创建或替换目标资源的表示;服务端必须明确目标 URI、权限和成功后的资源状态。
3.3.5 post
“3.3.5 post”把表示交给目标资源按其语义处理,结果可能是新资源、动作结果或状态变化,不能默认具有 PUT 的幂等性。
3.3.6 trace
“3.3.6 trace”让服务器回显其收到的请求,用于观察中间实体改写;它可能暴露敏感首部,生产环境通常需要限制。
3.3.7 options
“3.3.7 options”查询目标资源或服务器支持的通信选项;Allow 等响应元数据是能力声明,不等于调用者已经获得执行权限。
3.3.8 delete
“3.3.8 delete”请求删除目标 URI 与当前资源的关联;响应成功也不保证底层存储字节被物理擦除。
3.3.9 扩展方法
验证“3.3.9 扩展方法”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
3.4 状态码
分析“3.4 状态码”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。
3.4.1 100 ~ 199——信息性状态码
“3.4.1 100 ~ 199——信息性状态码”表示临时进展而非最终结果;客户端收到 1xx 后仍要等待最终响应,代理也不能把它当作完整事务终点。
3.4.2 200 ~ 299——成功状态码
“3.4.2 200 ~ 299——成功状态码”表示请求已成功处理,但不同代码对主体和后续动作的要求不同;成功状态不能替代资源身份与实体完整性检查。
3.4.3 300 ~ 399——重定向状态码
“3.4.3 300 ~ 399——重定向状态码”通过 Location 或缓存验证引导后续动作;必须区分重定向、未修改响应以及方法是否应在下一跳保留。
3.4.4 400 ~ 499——客户端错误状态码
“3.4.4 400 ~ 499——客户端错误状态码”表示请求侧条件未满足,例如语法、认证、权限或资源定位问题;诊断要保留服务器给出的状态和挑战信息。
3.4.5 500 ~ 599——服务器错误状态码
“3.4.5 500 ~ 599——服务器错误状态码”表示服务器或网关未能完成看似有效的请求;重试前需判断方法幂等性,并区分源站失败与中间实体失败。
3.5 首部
“3.5 首部”必须在线路语义中判断:请求方法声明意图,状态码表达处理结果,首部携带元数据,主体边界由明确的报文规则确定。
3.5.1 通用首部
分析“3.5.1 通用首部”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。
3.5.2 请求首部
分析“3.5.2 请求首部”要保留起始行、全部首部与实体边界;把解析对象重新打印,可能丢掉重复字段、空白和线路顺序证据。
3.5.3 响应首部
“3.5.3 响应首部”由发送者意图与接收者结果共同决定;状态成功并不能证明方法安全、幂等或表示完整。
3.5.4 实体首部
验证“3.5.4 实体首部”构造一条合法报文和一条只改一个字节的反例,比较解析、状态码、连接复用与后续消息边界。
3.6 更多信息
“3.6 更多信息”是原书的延伸资料入口,不增加新的协议结论;使用时必须记录资料版本、适用的 HTTP 年代和与本章结论的对应关系。
复原原始HTTP事务
固定URL、资源、连接与版本,写出请求行、首部、主体、响应和所有中间实体。
HTTP/1.1 message laboratory
第3章 http 报文
掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类
GET /resource?chapter=%E7%AC%AC3%E7%AB%A0%20http%20%E6%8A%A5%E6%96%87 HTTP/1.1 Host: example.test Connection: keep-alive
章内坐标:第3章 http 报文、3.1 报文流、3.1.1 报文流入源端服务器、3.1.2 报文向下游流动、3.2 报文的组成部分、3.2.1 报文的语法、3.2.2 起始行、3.2.3 首部
可复现实验记录
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:为什么“第3章 http 报文”必须固定2002年首版?
问题 2:怎样构造“只看JSON主体会忽略消息边界、条件首部、代理首部和无主体响应的规则”的最小反例?
问题 3:何时可以认为本页完成独立交接?
本章回顾
“第3章 http 报文”的核心是掌握HTTP报文流、起始行、首部、实体、方法、状态码和首部分类。真正掌握不是记首部名,而是能用原始报文、连接和中间状态证明资源如何被定位、传输、缓存、保护与交付。
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 请求行
由方法、请求目标和HTTP版本构成的请求起始行。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 状态行
由HTTP版本、状态码和原因短语构成的响应起始行。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 首部
以字段名和值携带协议元数据的报文组成部分。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 实体主体
承载资源表示或请求数据的可选报文内容。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。
- 安全方法
按定义不会请求服务器改变状态的方法类别。掌握标准是能在原始HTTP报文、中间状态或历史规范中定位,并构造最小失败反例。