Transfer-Encoding: chunked
是 HTTP 协议中常见的一个头部字段,用于指示数据以分块传输编码(Chunked Transfer Encoding)的方式传输。
分块传输编码的作用
1. 动态生成内容 当服务器无法预先知道要发送的数据总长度(例如动态生成的内容或流式数据)时,无法使用 [Content-Length](https://zhida.zhihu.com/search?content_id=254918266&content_type=Article&match_order=1&q=Content-Length&zhida_source=entity)
头部。此时可以通过 chunked
分块传输,逐步发送数据。
2. 流式传输 允许服务器在生成数据的同时逐步传输,无需等待所有数据就绪后再发送,提升效率(例如实时日志、视频流)。
3. 避免大内存占用
适用于大文件或长连接场景,避免一次性加载全部数据到内存。
分块传输的格式
数据会被分成多个块(chunk),每个块的格式如下:
<十六进制表示的块长度>\r\n
<块数据>\r\n
所有块传输完成后,发送一个长度为 0
的块作为结束标志:
0\r\n
\r\n
示例:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
7\r\n
Hello, \r\n
6\r\n
world!\r\n
0\r\n
\r\n
最终客户端会将所有块拼接为 Hello, world!
。
与 Content-Length
的区别
Content-Length
需要提前知道数据总长度,适用于静态内容。Transfer-Encoding: chunked
无需提前知道长度,适用于动态或流式内容。
注意事项
1. 客户端兼容性
现代浏览器和 HTTP 客户端均支持分块传输编码。
2. 无法与 Content-Length
共存
如果使用了 Transfer-Encoding: chunked
,响应头中不应包含 Content-Length
。
3. 压缩与编码
分块传输编码可以与其他编码(如 gzip
)结合使用,但需明确区分 Transfer-Encoding
和 Content-Encoding
。
如果是在调试网络请求时看到 Transfer-Encoding: chunked
,它表示服务器正在以分块形式传输数据,这是 HTTP/1.1 的常见行为。