Skip to main content

1. Introduction (简介)

超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一种无状态的应用层请求/响应协议, 它使用可扩展的语义和自描述消息, 以实现与基于网络的超文本信息系统的灵活交互. HTTP 通常用于分布式信息系统, 在这些系统中, 使用响应缓存 (Response Caches) 可以提高性能. 本文档定义了与缓存和重用响应消息相关的 HTTP 各个方面.

HTTP "缓存 (Cache)" 是响应消息的本地存储, 以及控制其中消息的存储、检索和删除的子系统. 缓存存储可缓存的响应, 以减少未来等效请求的响应时间和网络带宽消耗. 任何客户端或服务器都可以 (MAY) 使用缓存, 但在充当隧道 (Tunnel) 时除外 (参见 [HTTP] 的第 3.7 节).

"共享缓存 (Shared Cache)" 是存储响应以供多个用户重用的缓存; 共享缓存通常 (但并非总是) 作为中间件 (Intermediary) 的一部分部署. 相比之下, "私有缓存 (Private Cache)" 专用于单个用户; 通常, 它们作为用户代理 (User Agent) 的组件部署.

HTTP 缓存的目标是通过重用先前的响应消息来满足当前请求, 从而显著提高性能. 如第 4.2 节所定义, 如果缓存可以在不进行"验证 (Validation)" (即检查源服务器以查看缓存的响应对此请求是否仍然有效) 的情况下重用存储的响应, 则缓存认为该响应是"新鲜的 (Fresh)". 因此, 每次缓存重用新鲜响应时, 都可以减少延迟和网络开销. 当缓存的响应不新鲜时, 如果验证可以使其更新 (第 4.3 节) 或源服务器不可用 (第 4.2.4 节), 它仍然可能是可重用的.

本文档废止 RFC 7234, 变更总结在附录 B 中.

1.1 Requirements Notation (要求表示法)

本文档中的关键词 "MUST" (必须), "MUST NOT" (禁止), "REQUIRED" (必需), "SHALL" (应), "SHALL NOT" (不应), "SHOULD" (应该), "SHOULD NOT" (不应该), "RECOMMENDED" (推荐), "NOT RECOMMENDED" (不推荐), "MAY" (可以), 和 "OPTIONAL" (可选) 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释, 当且仅当它们以全大写形式出现时, 如此处所示.

[HTTP] 的第 2 节定义了一致性标准, 并包含有关错误处理的考虑.

1.2 Syntax Notation (语法表示法)

本规范使用 [RFC5234] 的增强巴科斯-瑙尔范式 (Augmented Backus-Naur Form, ABNF) 表示法, 并扩展了 [RFC7405] 中定义的字符串大小写敏感性表示法.

它还使用了 [HTTP] 第 5.6.1 节中定义的列表扩展, 该扩展允许使用 "#" 运算符紧凑地定义逗号分隔的列表 (类似于 "*" 运算符表示重复的方式). 附录 A 显示了将所有列表运算符扩展为标准 ABNF 表示法的完整语法.

1.2.1 Imported Rules (导入的规则)

以下核心规则通过引用包含, 如 [RFC5234] 附录 B.1 中所定义: DIGIT (十进制 0-9).

[HTTP] 定义了以下规则:

HTTP-date     = <HTTP-date, see [HTTP], Section 5.6.7>
OWS = <OWS, see [HTTP], Section 5.6.3>
field-name = <field-name, see [HTTP], Section 5.1>
quoted-string = <quoted-string, see [HTTP], Section 5.6.4>
token = <token, see [HTTP], Section 5.6.2>

1.2.2 Delta Seconds (增量秒数)

delta-seconds 规则指定一个非负整数, 表示以秒为单位的时间.

delta-seconds  = 1*DIGIT

解析 delta-seconds 值并将其转换为二进制形式的接收方应该 (ought to) 使用至少 31 位非负整数范围的算术类型. 如果缓存接收到的 delta-seconds 值大于它可以表示的最大整数, 或者其任何后续计算溢出, 则缓存必须 (MUST) 将该值视为 2147483648 (2^31) 或它可以方便表示的最大正整数.

注意: 值 2147483648 出于历史原因存在, 表示无穷大 (超过 68 年), 并且不需要以二进制形式存储; 即使计算使用无法直接表示该数字的算术类型, 如果发生任何溢出, 实现也可以将其生成为字符串. 这里重要的是检测到溢出, 而不是在后续计算中将其视为负值.