Transfer-Encoding
用法
Transfer-Encoding 头部是一个逐跳(hop-by-hop)头部,用于描述消息正文如何针对当前连接段进行编码。每个中间节点(代理、网关)会解码传输编码、处理消息,并在转发给下一个节点前重新编码。
最常见的值是 chunked,它允许服务器在不知道总 Content-Length 的情况下就开始流式传输响应。服务器将正文拆分为若干分块,每个分块前面带有一个大小指示符。一个长度为零的分块表示消息结束。
与对资源本身进行端到端压缩的 Content-Encoding 不同,Transfer-Encoding 仅在两个相邻节点之间起作用。服务器在 chunked 连接上发送经 gzip 压缩的资源时,会使用 Content-Encoding 进行压缩,使用 Transfer-Encoding 进行分块。
当 Transfer-Encoding 出现在对 HTTP HEAD 请求的响应中时,其值反映服务器会在相应的 GET 响应中对正文应用的编码。
注意
Content-Encoding 是端到端的:资源本身被压缩(例如 gzip),每个接收方都会解码负载。Transfer-Encoding 是逐跳的:为两个相邻节点之间的传输而应用的编码,并在每一跳被移除。一个响应可同时携带这两个头部,用 Content-Encoding 进行资源压缩,用 Transfer-Encoding 进行分块传送。
注意
HTTP 的 Transfer-Encoding 头部与电子邮件的 Content-Transfer-Encoding 无关,后者处理诸如 base64 或 quoted-printable 之类用于邮件正文的 MIME 编码。
注意
Transfer-Encoding 头部在 HTTP/2 和 HTTP/3 中被禁用。这些协议提供了它们自己的数据分帧机制,使得传输层编码变得不必要。
chunked
chunked 指令将消息正文拆分为一系列分块。每个分块以十六进制表示的分块大小开始,后跟分块数据。一个大小为零的最终分块终止消息。Trailer 头部列出在最后一个分块之后附加的任何字段。
compress
compress 指令应用 Lempel-Ziv-Welch(LZW)压缩。此编码在现代部署中很少使用。
deflate
deflate 指令应用带有 deflate 算法的 zlib 压缩。
gzip
gzip 指令应用带有 32 位 CRC 校验和的 Lempel-Ziv 编码(LZ77)。这与 gzip 文件格式使用的算法相同,并在各种 HTTP 实现中受到广泛支持。
示例
服务器发送一个 chunked 响应。缺少 Content-Length 头部表明服务器正在分片流式传输正文。
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
0\r\n
\r\n
多个传输编码按顺序应用。在此响应中,正文先经过 gzip 压缩,再被分块以便传输。
Transfer-Encoding: gzip, chunked