繁体   English   中英

http2 / http1.1代理如何处理Transfer-Encoding?

[英]How http2/http1.1 proxy handle the Transfer-Encoding?

HTTP / 2禁止特定于连接的标头字段。 不得出现以下标题字段:“连接”,“保持活动”,“代理连接”,“传输编码”和“升级”。 此外,“TE”标题字段不得包含“预告片”以外的任何值。

我想问的是,由于HTTP / 2禁止Transfer-Encoding标头,所以HTTP / 2代理如何处理标头Tranfer-Encoding:chunked?

如果代理总是将整个chunked请求缓存在内存中并添加Content-Length头,那么发送到HTTP / 2服务器/客户端?

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

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

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

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

同样在前一种情况下,当缓冲区溢出时,代理可以添加Transfer-Encoding: chunked头并发送一个与缓冲区大小相同的块(而不是像第一种情况那样的DATA帧的大小)。

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

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

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

由于HTTP / 2接收/发送包含流末尾标志的DATA帧,因此代理可以轻松地转换为HTTP / 1.1或从HTTP / 1.1转换,将流末尾DATA帧映射到终端块,以及终端块到流末尾DATA帧。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM