RFC 7230 §4.1定义了“块扩展”,可以与使用
Transfer-Encoding: chunked
编码的 HTTP 消息中的块一起发送的附加键值对:
分块编码允许每个块在块大小之后立即包含零个或多个块扩展,以便提供每个块元数据(例如签名或哈希)、消息中间控制信息或消息随机化身体尺寸。
HTTP/2声明,
HTTP/2 旨在尽可能与 HTTP 的当前使用兼容。 这意味着,从应用的角度来看,协议的特性基本上没有改变。 为了实现这一点,所有请求和响应语义都被保留,尽管传达这些语义的语法已经改变。
在 HTTP/2 中,
DATA
帧用于以块的形式承载数据,而不是 chunked
传输编码:
HTTP/2 使用 DATA 帧来携带消息负载。 [RFC7230] 第 4.1 节中定义的“分块”传输编码不得在 HTTP/2 中使用。
但是,AFAICT,
DATA
框架不支持块扩展,仅提供可选的填充。
特别是,HTTP/1.1 到 HTTP/2 的代理如何接收包含带有格式正确的块扩展的块的请求,并将这些块转换为 HTTP/2?
在https://greenbytes.de/tech/webdav/rfc7540.html#rfc.section.8.1.p.4:
HTTP/2 使用 DATA 帧来携带消息负载。 [RFC7230] 第 4.1 节中定义的分块传输编码不得在 HTTP/2 中使用。
因此没有分块编码,因此没有分块扩展。
特别是,HTTP/1.1 到 HTTP/2 的代理如何接收包含带有格式正确的块扩展的块的请求,并将这些块转换为 HTTP/2?
RFC 7230 §4.1.1 规定:
接收者必须忽略无法识别的块扩展。
您将很难识别任何块扩展,因为据我所知,还没有定义过任何扩展。
Transfer-Encoding
是逐跳标头,因此您可以合规地丢弃收到的任何块扩展并从分块数据生成 DATA
帧。
根据 MDN,您不能将
Transfer-Encoding: chunked
与 HTTP2 一起使用:
注意:HTTP/2 不允许使用除了 HTTP/2 特定的“预告片”之外的所有 Transfer-Encoding 标头。 HTTP 2 提供了比分块传输更有效的数据流机制,并禁止使用标头。在 HTTP/2 中使用标头可能会导致特定的协议错误,因为 HTTP/2 协议禁止使用。
在 HTTP/2 中,DATA 帧用于以块的形式承载数据,而不是分块的传输编码
简单来说,每个DATA帧都是一个chunk。无需使用 HTTP/1.1 分块编码,因为 HTTP/2 数据帧提供相同的功能集。