Appendix A: Differences from RFC 7540 (与RFC 7540的差异)
本文档是RFC 7540的修订版。除了编辑改进之外,以下列表描述了实质性变化:
主要变化
优先级系统
弃用: RFC 7540中定义的优先级系统已被弃用 (第5.3节)。PRIORITY帧及其在HEADERS帧中的相关字段的某些方面已被保留,以确保向后兼容性。
理由: 原始优先级系统过于复杂,实现不均匀,未被广泛采用。
字段验证
增强: 字段验证要求已得到加强,以防止HTTP请求走私等安全问题 (第8.2.1节)。
连接启动
澄清: 连接前言和设置的处理得到了澄清 (第3.4节)。
SETTINGS确认
改进: SETTINGS帧的确认要求已得到澄清 (第6.5.3节)。
格式错误消息
明确化: 格式错误消息的定义和处理已得到扩展 (第8.1.1节)。
Appendix B: Differences from HTTP/1.1 (与HTTP/1.1的差异)
HTTP/2在几个关键方面与HTTP/1.1不同:
主要差异
1. 二进制协议
HTTP/1.1: 基于文本的协议
HTTP/2: 二进制帧协议
优势: 更高效的解析,更少的错误,更紧凑
2. 多路复用
HTTP/1.1: 顺序和阻塞;每个连接一次一个请求/响应
HTTP/2: 完全多路复用;单个连接上的多个并发流
优势:
- 消除队头阻塞
- 更好的资源利用
- 减少延迟
3. 头部压缩
HTTP/1.1: 未压缩的文本头部
HTTP/2: HPACK压缩的头部
优势:
- 减少开销
- 更快的页面加载
- 减少带宽使用
4. 服务器推送
HTTP/1.1: 不支持
HTTP/2: 支持服务器推送
优势:
- 服务器可以主动发送资源
- 减少往返
- 更快的页面渲染
5. 流优先级
HTTP/1.1: 无内置优先级
HTTP/2: 流优先级机制 (在本规范中已弃用,推荐使用HTTP-PRIORITY扩展)
6. 连接管理
HTTP/1.1:
- 持久连接是可选的
- 管道化支持有限
- 通常需要多个连接
HTTP/2:
- 持久连接是默认的
- 单个连接即可
- 更好的连接复用
7. 请求表示
HTTP/1.1:
GET /path HTTP/1.1
Host: example.com
User-Agent: ...
HTTP/2:
:method: GET
:path: /path
:scheme: https
:authority: example.com
user-agent: ...
差异: HTTP/2使用伪头部字段表示控制数据
8. 分块传输编码
HTTP/1.1: 支持Transfer-Encoding: chunked
HTTP/2: 不支持分块编码;使用DATA帧的END_STREAM标志
9. Connection头部
HTTP/1.1: 使用Connection头部
HTTP/2: 禁止Connection和其他连接特定头部
10. 升级机制
HTTP/1.1: 支持协议升级 (101 Switching Protocols)
HTTP/2: 不支持101响应;使用ALPN进行协议协商
🔑 迁移要点
从HTTP/1.1迁移到HTTP/2
客户端:
- 支持二进制帧格式
- 实现HPACK解压
- 处理多路复用流
- 使用伪头部字段
- 移除连接特定头部
服务器:
- 实现帧解析
- 支持流多路复用
- 实现HPACK压缩
- 可选实现服务器推送
- 处理流优先级 (如果支持)
中介 (代理/网关):
- 协议转换 (HTTP/1.1 ↔ HTTP/2)
- 头部映射
- 连接管理
- 流控制
兼容性考虑
向后兼容: HTTP/2保持与HTTP/1.1的语义兼容性
协议协商: 使用ALPN (TLS) 或h2c升级机制
降级: 服务器可以使用HTTP_1_1_REQUIRED错误码要求降级
📚 总结
HTTP/2相对于HTTP/1.1的主要改进:
✅ 性能: 二进制、多路复用、头部压缩
✅ 效率: 单连接、流控制、服务器推送
✅ 安全: 强制TLS (在实践中)、字段验证
✅ 灵活性: 可扩展的帧和设置
同时保持:
✅ 语义兼容: HTTP方法、状态码、头部字段的含义不变
✅ 透明性: 对应用层透明的改进