Skip to main content

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方法、状态码、头部字段的含义不变
透明性: 对应用层透明的改进