1. 引言
1.1. 目的
超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一组无状态, 应用层, 请求/响应协议. 它们共享通用接口, 可扩展语义和自描述消息, 用于支持基于网络的超文本信息系统之间进行灵活交互.
HTTP 通过向客户端呈现统一接口来隐藏服务实现细节, 该接口独立于所提供资源的类型. 同样, 服务器不需要了解每个客户端的目的: 一个请求可以被单独考虑, 而不是与某类特定客户端或预先确定的一系列应用步骤绑定在一起. 这使通用实现能够在许多不同上下文中有效使用, 降低交互复杂度, 并支持随时间独立演进.
HTTP 也被设计为一种中介协议, 代理和网关可以借助它把非 HTTP 信息系统转换为更通用的接口.
这种灵活性的一个后果是, 协议不能根据接口背后发生的事情来定义. 相反, 我们只能定义通信语法, 接收通信的意图, 以及接收方的预期行为. 如果把通信单独考虑, 成功的动作理应反映为服务器所提供可观察接口中的相应变化. 然而, 由于多个客户端可能并行操作, 甚至目标相互冲突, 我们不能要求这种变化在单个响应范围之外仍然可观察.
1.2. 历史与演进
自 1990 年引入以来, HTTP 一直是 World Wide Web 的主要信息传输协议. 它最初只是一个用于低延迟请求的简单机制, 只有一个方法 (GET), 用于请求传输由给定路径名标识的, 推定为超文本文档的内容. 随着 Web 发展, HTTP 被扩展为在消息中封装请求和响应, 使用类似 MIME 的媒体类型传输任意数据格式, 并通过中介路由请求. 这些协议最终被定义为 HTTP/0.9 和 HTTP/1.0 (见 [HTTP/1.0]).
HTTP/1.1 旨在完善协议功能, 同时保持与既有基于文本的消息语法兼容, 提升其在 Internet 上的互操作性, 可扩展性和健壮性. 这包括用于固定内容和动态 (分块) 内容的基于长度的数据定界符, 一致的内容协商框架, 用于条件请求的不透明验证器, 用于提高缓存一致性的缓存控制, 用于局部更新的范围请求, 以及默认持久连接. HTTP/1.1 于 1995 年引入, 于 1997 年作为 Standards Track 发布 [RFC2068], 1999 年修订 [RFC2616], 并于 2014 年再次修订 ([RFC7230] 到 [RFC7235]).
HTTP/2 ([HTTP/2]) 在既有 TLS 和 TCP 协议之上引入了多路复用会话层, 用于交换并发 HTTP 消息, 并提供高效的字段压缩和服务器推送. HTTP/3 ([HTTP/3]) 使用 QUIC 作为 UDP 之上的安全多路复用传输, 取代 TCP, 从而为并发消息提供更强的独立性.
HTTP 的三个主要版本都依赖本文档定义的语义. 它们并没有相互废止, 因为每个版本都根据使用上下文具有特定优点和限制. 实现应当为其特定上下文选择最合适的传输和消息语法.
本次 HTTP 修订将语义定义 (本文档) 和缓存 ([CACHING]) 与当前 HTTP/1.1 消息语法 ([HTTP/1.1]) 分离, 以便每个主要协议版本都能独立推进, 同时引用相同的核心语义.
1.3. 核心语义
HTTP 通过发送用于操作或传输表示 (Section 3.2) 的消息, 为与资源 (Section 3.1) 交互提供统一接口, 而不受资源类型, 性质或实现的影响.
每个消息要么是请求, 要么是响应. 客户端构造请求消息来传达其意图, 并将这些消息路由到所标识的源服务器. 服务器侦听请求, 解析收到的每个消息, 根据所标识目标资源解释消息语义, 并用一个或多个响应消息响应该请求. 客户端检查收到的响应, 以判断其意图是否已被执行, 并根据收到的状态码和内容决定下一步操作.
HTTP 语义包括每个请求方法 (Section 9) 所定义的意图, 可能由请求头字段描述的这些语义扩展, 描述响应的状态码 (Section 15), 以及可能在响应字段中给出的其他控制数据和资源元数据.
语义还包括表示元数据, 它描述接收方应如何解释内容; 还包括可能影响内容选择的请求头字段, 以及统称为 "内容协商" (Section 12) 的各种选择算法.
1.4. 本文档废止的规范
| 标题 | 引用 | 见 |
|---|---|---|
| 基于 TLS 的 HTTP (HTTP Over TLS) | [RFC2818] | B.1 |
| HTTP/1.1 消息语法和路由 (HTTP/1.1 Message Syntax and Routing) [*] | [RFC7230] | B.2 |
| HTTP/1.1 语义和内容 (HTTP/1.1 Semantics and Content) | [RFC7231] | B.3 |
| HTTP/1.1 条件请求 (HTTP/1.1 Conditional Requests) | [RFC7232] | B.4 |
| HTTP/1.1 范围请求 (HTTP/1.1 Range Requests) | [RFC7233] | B.5 |
| HTTP/1.1 认证 (HTTP/1.1 Authentication) | [RFC7235] | B.6 |
| HTTP 状态码 308 (Permanent Redirect) | [RFC7538] | B.7 |
| HTTP Authentication-Info 和 Proxy-Authentication-Info 响应头字段 | [RFC7615] | B.8 |
| HTTP 客户端发起的 Content-Encoding (HTTP Client-Initiated Content-Encoding) | [RFC7694] | B.9 |
表 1
[*] 本文档仅废止 RFC 7230 中独立于 HTTP/1.1 消息语法和连接管理的部分; RFC 7230 的其余部分由 "HTTP/1.1" [HTTP/1.1] 废止.