RFC 10036 HTTP 消息的增量转发 2026 年 8 月
Oku 等 标准轨 [页]
流:
互联网工程任务组(IETF)
RFC:
10036
类别:
标准轨
发布日期:
ISSN:
2070-1721
作者:
K. Oku
Fastly
T. Pauly
Apple
M. Thomson
Mozilla

RFC 10036

HTTP 消息的增量转发

摘要

本文档规定了 "Incremental" HTTP 标头字段,该字段指示 HTTP 中间方以增量方式转发 HTTP 消息。

本备忘录的状态

这是一份互联网标准轨文档。

本文档是互联网工程任务组 (IETF)的成果。它代表了 IETF 社区的共识。它已经 过公开评审,并已获互联网工程指导组 (IESG)批准发布。有关 互联网标准的更多信息,请参阅 RFC 7841 第 2 节。

有关本文档的当前状态、任何 勘误以及如何提供反馈的信息,可从 https://www.rfc-editor.org/info/rfc10036 获取。

目录

1. 引言

HTTP [HTTP] 允许接收方在 HTTP 消息的各部分到达时便开始处理, 而不要求它们在采取操作之前等待接收完整的 HTTP 消息。

某些应用程序经过专门设计,以利用此 能力。

例如,服务器发送事件 [SSE] 使用一个长时间运行的 HTTP 响应,其中 服务器会在通知可用时持续发送通知。

对于分块的不经意 HTTP 消息 [CHUNKED-OHTTP],客户端 打开一个 HTTP 请求 并以增量方式发送应用程序数据,而服务器甚至可以在 HTTP 请求 尚未完全结束之前就开始响应。通过这种方式,HTTP 请求-响应对实际上可以创建一个双向 通信通道。

当涉及 HTTP 中间方时,依赖数据增量交付的应用程序会比较脆弱。 这是因为 HTTP 中间方不仅被允许,而且经常被 部署为在向下游转发之前缓冲完整的 HTTP 消息 (第 7.6 节,见 [HTTP])。

如果客户端与服务器之间存在这样的缓冲型 HTTP 中间方, 这些应用程序可能无法按预期运行。

对于服务器发送事件,试图在转发之前完整缓冲 HTTP 响应的中间方可能会无限期等待。 客户端可能永远无法收到响应的任何部分。

对于涉及任何双向交换的请求, 试图缓冲完整消息的中间方—— 无论是请求还是响应——都会阻止任何数据被交付。

为帮助避免这种行为,本文档规定了 "Incremental" HTTP 标头 字段,该字段请求 HTTP 中间方在接收到完整消息之前 开始向下游转发 HTTP 消息。

中间方可能不支持此指示。 不知道此字段的中间方不会改变其行为。 支持该字段的中间方可能会改为选择拒绝请求; 参见第 4 节

2. 约定和定义

本文档中的关键词“必须”、“不得”、 “要求”、“应当”、“不得 ”、“应该”、“不应该”、“建议”、“不建议”、 “可以”和“可选”仅当它们 如此处所示以全大写形式出现时,才应按照 BCP 14 [RFC2119] [RFC8174] 中的说明进行 解释。

本文档依赖于 Item 和 Boolean 的结构化字段定义 [STRUCTURED-FIELDS]

3. Incremental 标头字段

Incremental HTTP 标头字段表达了发送方希望 HTTP 中间方在收到完整 消息之前就开始向下游转发消息的意图。

Incremental 标头字段被定义为 Item 类型的结构化字段 [STRUCTURED-FIELDS]。 只有 Boolean 值(第 3.3.6 节,见 [STRUCTURED-FIELDS])才有效; 如果该字段包含任何其他类型,接收方将忽略该字段。

Incremental: ?1

真值("?1")表示发送方请求中间方按照下述方式以增量方式转发 消息。

Incremental: ?0

假值("?0")表示 [HTTP] 中定义的默认行为,其中 中间方可能会在转发之前缓冲整个消息。不过, 这一显式信号可能使中间方在 选择缓冲时更有把握。

Incremental HTTP 标头字段适用于每个 HTTP 消息。因此,如果 HTTP 请求和响应都需要以增量方式转发,则 HTTP 请求和响应都必须设置 Incremental HTTP 标头字段。

收到包含真值 Incremental 标头字段的标头节后, HTTP 中间方在转发之前不应该缓冲整个消息。 相反,中间方应该向下游传输标头节, 并在消息内容的字节到达时持续转发。由于 Incremental 标头字段仅指示消息内容 应如何转发,因此中间方仍可以在向下游转发之前缓冲消息的整个标头节和尾部 节。

如果中间方明确决定拒绝以增量方式转发消息体, 则中间方必须生成错误响应,而不是 缓冲整个消息后再转发。中间方可能拒绝的典型 情形在第 4 节中讨论。

使用增量转发的请求也适用于 HTTP 实现。 尽管大多数 HTTP API 都提供以增量方式传输消息内容的能力, 但那些因任何原因不提供这种能力的实现应该利用 Incremental 标头字段的存在来减少或禁用缓冲。

中间方可能不支持 Incremental 字段。 不知道该字段 或不支持该字段的中间方可能会缓冲消息, 即使明确请求不要这样做。 因此,客户端和服务器不能期望所有中间方都理解 并遵守以增量方式交付消息的请求。 依赖增量转发支持的客户端可以依靠先验知识, 或探测各个资源是否支持该功能。

Incremental 标头字段有助于通过 HTTP 建立双向 字节通道,因为它同时出现在请求和响应中时,会请求 中间方转发提前响应(第 7.5 节,见 [HTTP]),并 在两个方向上以增量方式传输消息内容。不过,在 HTTP 上开发 双向协议时,扩展 CONNECT [RFC8441][RFC9220] 通常 更符合 HTTP 的体系结构。

本文档未为 Incremental 标头字段 值定义任何参数,但未来的文档可能会定义参数。接收方必须忽略 未知参数。

4. 安全注意事项

当收到请求增量转发的请求或响应时, 中间方可能会出于安全考虑拒绝该 HTTP 请求。 以下小节探讨了中间方可能 拒绝请求的典型情形。

请注意,只有当中间方理解 Incremental 字段时, 才会根据该字段的值拒绝请求。

4.1. 永久拒绝

某些中间方会检查 HTTP 消息的内容,并且仅当 其内容被认为安全时才转发。任何依赖以这种方式查看 整个消息的功能都与增量交付不兼容。

当中间方被请求以增量方式转发消息但无法做到时—— 无论该消息是请求还是响应—— 如果原因是对消息内容存在安全方面的顾虑, 中间方应该返回 501(未实现)错误, 并带有 incremental_refused Proxy-Status 响应标头字段 (第 5 节)。

4.2. 临时拒绝

为了节省处理 HTTP 请求或连接所需的资源, 中间方通常会对其转发的并发 HTTP 请求最大数量施加限制,同时缓冲超出该 限制的请求。

此类中间方可以对 标记为增量的请求应用更严格的并发限制,以确保即使增量请求的最大数量 已达到,仍能为非增量请求保留可用容量。 这种方法有助于平衡不同类型 请求的处理,并维持所有请求的服务可用性。

当由于达到并发限制而拒绝增量请求时, 中间方应该返回 429(请求过多)错误 (第 4 节,见 [EXTRA-STATUS]), 并附带 connection_limit_reached Proxy-Status 响应标头字段 (第 2.3.12 节,见 [PROXY-STATUS])。

4.3. 小数据包的处理

出于性能和效率原因,即使对于增量消息,中间方也可能 使用少量缓冲。立即转发 可能会被利用,导致中间方在大量小 数据包上浪费处理资源。启用增量交付时,可以改为限制 被缓冲的字节数,或缓冲区在转发前保持的时间长度。 即使缓冲提高了效率,任何缓冲都可能对应用程序延迟产生不利影响。 在所有情况下,中间方都不能将数据无限期保留在缓冲区中, 因此当达到时间限制或 字节限制时,就需要转发数据。

5. IANA 注意事项

名为 Incremental 的 HTTP 字段已注册到 “超文本传输协议(HTTP)字段名称注册表”中, 注册过程遵循 第 18.4 节,见 [HTTP]。 注册了以下值:

字段名称:

Incremental

状态:

永久

结构化类型:

Item

参考:

本文档

注释:

一个 HTTP 代理错误类型已注册到“HTTP 代理错误类型”注册表中, 如下所示:

名称:

incremental_refused

描述:

HTTP 消息包含 Incremental HTTP 标头字段,但 中间方拒绝以增量方式转发该消息。

额外参数:

建议的 HTTP 状态码:

501

响应仅由中间方生成:

true

参考:

本文档

6. 参考文献

6.1. 规范性参考文献

[EXTRA-STATUS]
Nottingham, M.R. Fielding“附加 HTTP 状态码”RFC 6585DOI 10.17487/RFC6585<https://www.rfc-editor.org/info/rfc6585>
[HTTP]
Fielding, R.,编辑Nottingham, M., 编辑,以及 J. Reschke,编辑“HTTP 语义”STD 97RFC 9110DOI 10.17487/RFC9110<https://www.rfc-editor.org/info/rfc9110>
[PROXY-STATUS]
Nottingham, M.P. Sikora“Proxy-Status HTTP 响应标头字段”RFC 9209DOI 10.17487/RFC9209<https://www.rfc-editor.org/info/rfc9209>
[RFC2119]
Bradner, S.“RFC 中用于 指示要求级别的关键词”BCP 14RFC 2119DOI 10.17487/RFC2119<https://www.rfc-editor.org/info/rfc2119>
[RFC8174]
Leiba, B.“RFC 2119 关键词中大写与 小写的歧义”BCP 14RFC 8174DOI 10.17487/RFC8174<https://www.rfc-editor.org/info/rfc8174>
[STRUCTURED-FIELDS]
Nottingham, M.P. Kamp“HTTP 的结构化字段值”RFC 9651DOI 10.17487/RFC9651<https://www.rfc-editor.org/info/rfc9651>

6.2. 资料性参考文献

[CHUNKED-OHTTP]
Pauly, T.M. Thomson“分块的不经意 HTTP 消息”进行中的工作互联网草案, draft-ietf-ohai-chunked-ohttp-08<https://datatracker.ietf.org/doc/html/draft-ietf-ohai-chunked-ohttp-08>
[RFC8441]
McManus, P.“使用 HTTP/2 引导 WebSockets ”RFC 8441DOI 10.17487/RFC8441<https://www.rfc-editor.org/info/rfc8441>
[RFC9220]
Hamilton, R.“使用 HTTP/3 引导 WebSockets”RFC 9220DOI 10.17487/RFC9220<https://www.rfc-editor.org/info/rfc9220>
[SSE]
WHATWG“HTML - 服务器发送 事件”WHATWG 现行标准<https://html.spec.whatwg.org/multipage/server-sent-events.html>提交快照:<https://html.spec.whatwg.org/commit-snapshots/6f84b26bd6eb8bd0e0e8df9819e43e901867166b/>

致谢

作者谨感谢 IETF HTTP 工作组的许多成员 对本规范的讨论和反馈。尤其是,作者 感谢 Mark ThomasPiotr SikoraThibault MeunierMarius KleidlBen SchwartzWilly TarreauWill HawkinsMark NottinghamLucas Pardue 的细致审阅和修改建议。

作者地址

Kazuho Oku
Fastly
其他联系信息:
奥 一穂
Fastly
Tommy Pauly
Apple
Martin Thomson
Mozilla