Transfer-Encoding 头部
HTTP Transfer-Encoding
请求和响应头部指定了用于在网络节点之间传输消息的编码形式。
Transfer-Encoding
是一个逐跳头部,应用于两个节点之间的消息,而不是资源本身。多节点连接的每个段都可以使用不同的Transfer-Encoding
值。如果你想在整个连接中压缩数据,请改用端到端Content-Encoding
头部。
实际上,这个头部很少使用,在这些情况下,它几乎总是与chunked
一起使用。
也就是说,规范指出,当消息中存在此头部时,它表示该跳中对消息使用的压缩,和/或消息是否已分块。例如,Transfer-Encoding: gzip, chunked
表示内容已使用 gzip 编码压缩,然后在使用分块编码形成消息正文时进行分块。
在对 HEAD
请求的响应中,该头部是可选的,因为这些消息没有正文,因此没有传输编码。当存在时,它表示如果相应的 GET
请求不包含首选的 Transfer-Encoding
,那么它将应用于该 GET
消息的响应值。
警告: HTTP/2 不允许所有使用 Transfer-Encoding
头部的情况。HTTP/2 及更高版本提供了比分块传输更高效的数据流机制。在 HTTP/2 中使用此头部很可能导致特定的协议错误
。
语法
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
指令
分块(chunked)
-
数据以一系列“块”的形式发送。内容可以以未知大小的流形式传输,作为一系列长度分隔的缓冲区,以便发送方可以保持连接打开,并让接收方知道何时已收到整个消息。
Content-Length
头部必须省略。在每个块的开头,一串十六进制数字表示块数据的大小(以八位字节为单位),后跟\r\n
,然后是块本身,再后跟另一个\r\n
。终止块是零长度的块。 压缩(compress)
-
一种使用 Lempel-Ziv-Welch (LZW) 算法的格式。该值名称取自实现此算法的 UNIX compress 程序。就像 compress 程序已从大多数 UNIX 发行版中消失一样,这种内容编码如今几乎没有浏览器使用,部分原因是专利问题(已于 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 |
浏览器兼容性
加载中…