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

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Transfer-Encoding

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

参见