传输编码
Transfer-Encoding
头部指定了用于在网络节点之间传输消息的编码形式。
警告:HTTP/2 不允许使用除 HTTP/2 特定的 "trailers"
之外的任何 Transfer-Encoding
头部。HTTP/2 及更高版本提供了比分块传输更高效的数据流机制,并禁止使用该头部。在 HTTP/2 中使用该头部可能会导致特定的 协议错误
,因为 HTTP/2 协议禁止使用它。
Transfer-Encoding
是一个逐跳头部,它应用于两个节点之间的消息,而不是资源本身。多节点连接的每个段可以使用不同的 Transfer-Encoding
值。如果要压缩整个连接上的数据,请改用端到端的 Content-Encoding
头部。
语法
Transfer-Encoding: chunked
Transfer-Encoding: compress
Transfer-Encoding: deflate
Transfer-Encoding: gzip
// Several values can be listed, separated by a comma
Transfer-Encoding: gzip, chunked
指令
分块
-
数据以一系列块的形式发送。在这种情况下,
Content-Length
头部将被省略,并且在每个块的开头,您需要添加当前块的长度(以十六进制格式),后跟 '\r\n
',然后是块本身,后跟另一个 '\r\n
'。终止块是一个常规块,但其长度为零。它后面跟着尾部,尾部由一个(可能是空的)头部字段序列组成。 压缩
-
使用 Lempel-Ziv-Welch (LZW) 算法的格式。值名称取自 UNIX 的 compress 程序,该程序实现了此算法。与已从大多数 UNIX 发行版中消失的 compress 程序一样,这种内容编码如今几乎没有浏览器使用,部分原因是专利问题(已于 2003 年过期)。
deflate
gzip
-
使用 Lempel-Ziv 编码 (LZ77),带有 32 位 CRC。这最初是 UNIX gzip 程序的格式。HTTP/1.1 标准还建议支持此内容编码的服务器应识别
x-gzip
作为别名,以实现兼容性。
示例
分块编码
当向客户端发送大量数据并且响应的总大小可能在请求完全处理之前未知时,分块编码非常有用。例如,当生成数据库查询产生的大型 HTML 表格或传输大型图像时。分块响应如下所示
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
规范
规范 |
---|
HTTP/1.1 # field.transfer-encoding |
浏览器兼容性
BCD 表格仅在浏览器中加载
另请参阅
Accept-Encoding
Content-Encoding
Content-Length
- 调节尾部使用的头部字段:
TE
(请求)和Trailer
(响应)。 - 分块传输编码