Appendix A. HTTP Version History (附录 A. HTTP 版本历史)
HTTP 协议的演变经历了多个版本的迭代。本附录简要介绍了 HTTP 的主要版本历史。
A.1. HTTP/0.9
HTTP 的第一个版本是一个简单的协议, 用于在互联网上传输原始数据。HTTP/0.9 是一个仅限于 GET 方法的单行协议。响应也极其简单: 只包含实体本身, 没有头部或任何其他元数据。
HTTP/0.9 从未被正式标准化, 但其语法可以描述为:
Request = "GET" SP Request-URI CRLF
Response = HTML-Content
由于 HTTP/0.9 不支持头部字段, 因此无法在消息中传输元数据, 这严重限制了其功能。HTTP/0.9 在早期 Web 浏览器中使用, 但很快被 HTTP/1.0 取代。
A.2. HTTP/1.0
HTTP/1.0 在 [RFC1945] 中定义, 引入了以下重要特性:
- 请求和响应头部字段: 允许传输元数据, 如内容类型、内容长度、服务器信息等
- HTTP 版本标识: 在请求和响应中包含版本号
- 状态码: 引入了 3 位数字的状态码系统来指示请求的结果
- 多种请求方法: 支持 GET、HEAD、POST 等方法
- 内容协商: 客户端可以指定它能够处理的内容类型
HTTP/1.0 的一个主要限制是每个请求/响应交换都需要一个新的 TCP 连接, 这导致了显著的性能开销。
A.3. HTTP/1.1
HTTP/1.1 最初在 [RFC2068] 中定义, 后来在 [RFC2616] 中修订, 现在由 RFC 7230-7237 系列定义。HTTP/1.1 引入了以下重要改进:
- 持久连接 (Persistent Connections): 默认情况下, 连接在请求/响应完成后保持打开状态, 允许在同一连接上发送多个请求
- 管道化 (Pipelining): 允许客户端发送多个请求而不等待响应
- 分块传输编码 (Chunked Transfer Encoding): 允许在不知道内容总长度的情况下发送动态生成的内容
- Host 头部字段: 强制要求
Host头部字段, 支持虚拟主机 - 缓存增强: 更复杂的缓存控制机制
- 内容协商改进: 更灵活的内容协商机制
- 范围请求: 支持部分内容请求 (断点续传)
HTTP/1.1 显著改进了性能和功能, 成为了 Web 的主要协议版本, 直到 HTTP/2 的出现。
A.4. HTTP/2
HTTP/2 在 [RFC7540] 中定义, 是对 HTTP/1.1 的重大改进, 但保持了语义兼容性。主要特性包括:
- 二进制框架 (Binary Framing): 使用二进制格式而不是文本格式
- 多路复用 (Multiplexing): 在单个 TCP 连接上并行发送多个请求和响应
- 服务器推送 (Server Push): 服务器可以主动向客户端推送资源
- 头部压缩 (Header Compression): 使用 HPACK 算法压缩头部
- 流优先级 (Stream Prioritization): 允许客户端指定流的优先级
尽管 HTTP/2 改变了消息的传输方式, 但它保持了与 HTTP/1.1 相同的语义, 因此应用程序可以在不修改的情况下使用 HTTP/2。
A.5. HTTP/3
HTTP/3 在 [RFC9114] 中定义, 是 HTTP 协议的最新版本。主要特性包括:
- 基于 QUIC: 使用 QUIC 传输协议 (基于 UDP) 而不是 TCP
- 改进的连接建立: 减少连接建立的延迟
- 更好的丢包恢复: QUIC 的设计使其能够更好地处理丢包
- 连接迁移: 支持 IP 地址或端口变化时的连接迁移
A.6. 版本互操作性
HTTP 的设计考虑了版本之间的互操作性。较新版本的 HTTP 客户端和服务器可以与使用较旧版本的对等方通信。版本号的使用允许实现协商最合适的协议版本。
HTTP/1.1 实现被设计为能够与 HTTP/1.0 客户端和服务器互操作, 尽管某些 HTTP/1.1 特性 (如持久连接) 在与 HTTP/1.0 对等方通信时可能无法使用。
注: 本附录提供的是历史概览。有关每个版本的详细信息, 请参阅相应的规范文档。