内容长度
标Content-Length
头确定请求/响应正文的字节长度。如果您忽略指定Content-Length
标头,HTTP 服务器将隐式添加Transfer-Encoding: chunked
标头。和Content-Length
头Transfer-Encoding
不应该一起使用。接收方将不知道正文的长度,也无法估计下载完成时间。如果确实添加了Content-Length
标头,请确保它以字节为单位与整个正文匹配,如果不正确,则接收者的行为未定义。
标Content-Length
头不允许流式传输,但它对于希望支持部分内容服务的大型二进制文件很有用。这基本上意味着可恢复下载、暂停下载、部分下载和多宿主下载。这需要使用一个名为Range
. 这种技术称为字节服务。
传输编码
的用途Transfer-Encoding: chunked
是允许在单个请求或响应中进行流式传输。这意味着数据以分块方式传输,并且不会影响内容的表示。
正式地,HTTP 客户端旨在发送带有TE
标头字段的请求,该字段指定客户端愿意接受的传输编码类型。这并不总是发送,但是大多数服务器假定客户端可以处理chunked
编码。
传输编码更好地利用了持久的chunked
TCP 连接,HTTP 1.1 默认假定为真。
内容编码
也可以压缩分块或非分块数据。这实际上是通过Content-Encoding
标题完成的。
请注意,Content-Length
等于 之后的主体长度Content-Encoding
。这意味着如果您对响应进行了 gzip 压缩,则长度计算将在压缩后进行。如果要计算长度,则需要能够将整个正文加载到内存中(除非您在其他地方有该信息)。
当使用分块编码进行流式传输时,压缩算法还必须支持在线处理。幸运的是,gzip 支持流压缩。我相信内容会先被压缩,然后再切成块。这样,块被接收,然后解压缩以获取真实内容。如果反过来,你会得到压缩流,然后解压缩会给我们块。这没有任何意义。
典型的压缩流响应可能具有以下标头:
Content-Type: text/html
Content-Encoding: gzip
Transfer-Encoding: chunked
从语义上讲,使用Content-Encoding
表示“端到端”编码方案,这意味着只有最终客户端或最终服务器应该对内容进行解码。中间的代理不应该解码内容。
如果要允许中间的代理对内容进行解码,则要使用的正确标头实际上就是Transfer-Encoding
标头。如果 HTTP 请求具有TE: gzip chunked
标头,则使用 . 响应是合法的Transfer-Encoding: gzip chunked
。
然而,这很少得到支持。所以你现在应该只Content-Encoding
用于你的压缩。
分块与存储和转发