Transfer-Encoding

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Transfer-Encoding 标头指明了将有效负载体安全传输给用户所采用的编码形式。

备注: HTTP/2 禁止使用除 HTTP/2 特有的 "trailers" 以外的所有 Transfer-Encoding 标头。HTTP 2 提供了比分块传输更有效的数据流机制,并禁止使用该标头。在 HTTP/2 中使用该标头可能会导致特定的 protocol error,因为 HTTP/2 协议禁止使用该标头。

Transfer-Encoding 是一个逐跳传输标头,即仅应用于两个节点之间的消息传递,而不是所请求的资源本身。一个多节点连接中的每一段都可以应用不同的 Transfer-Encoding 值。如果你想要将压缩后的数据应用于整个连接,那么请使用端到端标头 Content-Encoding

当这个标头出现在 HEAD 请求的响应中,而这样的响应没有消息体,那么它其实指的是应用在相应的 GET 请求的应答的值。

标头类型 请求标头响应标头有效负载标头
禁止修改的标头

语法

http
Transfer-Encoding: chunked
Transfer-Encoding: compress
Transfer-Encoding: deflate
Transfer-Encoding: gzip

// 可以列出多个值,用逗号分割
Transfer-Encoding: gzip, chunked

指令

chunked

数据以一系列分块的形式进行发送。Content-Length 标头在这种情况下不被发送。在每一个分块的开头需要添加当前分块的长度,以十六进制的形式表示,后面紧跟着“\r\n”,之后是分块本身,后面也是“\r\n”。终止块是一个常规的分块,不同之处在于其长度为 0。终止块后面是一个挂载(trailer),由一系列的标头(可能为空)构成。

compress

采用 Lempel-Ziv-Welch(LZW)压缩算法。这个名称来自 UNIX 系统的 compress 程序,该程序实现了前述算法。与已从大多数 UNIX 发行版中消失的 compress 程序一样,如今几乎没有浏览器使用这种内容编码,部分原因是专利问题(2003 年到期)。

deflate

采用 zlib 结构(于 RFC 1950 定义)和 deflate 压缩算法(于 RFC 1951 定义)。

gzip

表示采用 Lempel-Ziv coding(LZ77)压缩算法,以及 32 位 CRC 校验的编码方式。这个编码方式最初由 UNIX 平台上的 gzip 程序采用。出于兼容性的考虑,HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 x-gzip 指令。

示例

分块编码

分块编码主要应用于如下场景,即要传输大量的数据,但是在请求在没有被处理完之前响应的长度是无法获得的。例如,当需要用从数据库中查询获得的数据生成一个大的 HTML 表格的时候,或者需要传输大量的图片的时候。一个分块响应形式如下:

http
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked

7\r\n
Mozilla\r\n
11\r\n
Developer Network\r\n
0\r\n
\r\n

规范

Specification
HTTP/1.1
# field.transfer-encoding

浏览器兼容性

BCD tables only load in the browser

参见