gpt4 book ai didi

http - http2/http1.1 代理如何处理传输编码?

转载 作者:可可西里 更新时间:2023-11-01 15:20:06 27 4
gpt4 key购买 nike

HTTP/2 禁止特定于连接的 header 字段。以下 header 字段不得出现:“Connection”、“Keep-Alive”、“Proxy-Connection”、“Transfer-Encoding”和“Upgrade”。此外,“TE” header 字段不得包含“trailers”以外的任何值。

我想问的是,既然HTTP/2禁止了Transfer-Encoding header,那么HTTP/2 proxy如何处理header Tranfer-Encoding: chunked?

代理是否应该始终将整个分块请求缓存在内存中并添加 Content-Length header ,发送到 HTTP/2 服务器/客户端?

最佳答案

在 HTTP/2 中,内容总是“分块”的,因为它是在数据帧中发送的,即携带 block 长度的字节 block 以及表示该帧是否为最后一帧的流结束标志。

在 HTTP/2 到 HTTP/1.1 代理中,代理有多种选择。

一个非常简单的案例是重新映射每个 HTTP/2 接收到的数据帧并将其作为 HTTP/1.1 block 发送出去。因此,代理必须将 Transfer-Encoding: chunked header 添加到通信的 HTTP/1.1 端。类似地,它可以将每个内容读取重新映射到数据帧中(而不是等待/缓冲整个 block ,如果它很大)。

另一种情况是缓冲一些接收到的数据帧,希望其中一个设置了流结束标志。如果发生这种情况,则整个内容长度是已知的,代理可以添加 Content-Length header 并立即发送整个内容。

同样在前一种情况下,当缓冲区溢出时,代理可以添加 Transfer-Encoding: chunked header 并发送缓冲区大小的 block (而不是 DATA 的大小)像第一种情况一样的框架)。

当代理接收到最后一个数据帧时,它会将剩余的字节分块,然后发送终端 block (表示 block 结束的零长度 block )。

在另一个方向,从 HTTP/1.1 到 HTTP/2,当代理接收到分块内容时,它可以简单地丢弃 Transfer-Encoding: chunked header ,从接收到的数据中提取数据帧 block ,然后发送该帧。最终它将接收到终端 block (表示 block 结束的零长度 block ),并将其转换为长度为零且设置了流结束标志的数据帧。

当然,如果代理执行了一些缓冲或其他优化,DATA 帧大小可能不完全等于 block 大小。

由于 HTTP/2 接收/发送包含流结束标志的数据帧,代理可以轻松地与 HTTP/1.1 进行转换,将流结束数据帧映射到终端 block 和终端 block 到流结束数据帧。

关于http - http2/http1.1 代理如何处理传输编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29486086/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com