文章目录
-
- [0 序言](#0 序言)
-
- [0.1 由来](#0.1 由来)
- [0.2 使用场景](#0.2 使用场景)
- [1 `Transfer-Encoding: chunked`的机制](#1
Transfer-Encoding: chunked
的机制) - [2 语法 && 通过设置`Transfer-Encoding: chunked`优化性能](#2 语法 && 通过设置
Transfer-Encoding: chunked
优化性能) - [3 总结](#3 总结)
- References
0 序言
0.1 由来
Transfer-Encoding
头部字段在HTTP/1.1中被引入,用于指示数据传输过程中使用的编码方式。常见的值包括chunked
。当使用chunked
传输编码时,数据以分块的形式传输,每一块都有自己的大小标识,直到最后一个块(大小为0)表示传输结束。
可以将Transfer-Encoding: chunked
机制比作分批次发送邮件:
- 情景设定 :
- 你需要寄送一大批邮件,但一次性发送可能会超出邮件系统的限制。
- 正常流程 :
- 你将所有邮件一次性发送,可能会遇到系统限制或传输失败。
- 使用
Transfer-Encoding: chunked
:- 你将邮件分批次发送,每次发送一部分,直到所有邮件发送完毕。
0.2 使用场景
-
大文件上传 :当客户端需要上传大文件时,使用
chunked
传输可以避免一次性传输大量数据,减轻服务器压力。 -
不确定的内容长度 :在数据长度不确定的情况下,使用
chunked
传输可以方便地逐块发送数据。- 减少失败率:分块传输可以避免一次性传输大量数据导致的传输失败。
- 提高效率:在数据生成过程中可以逐块发送数据,提高传输效率。
虽然Transfer-Encoding: chunked
在某些情况下依然有用,但现代HTTP/2和HTTP/3协议中已经内置了多路复用和流控制机制,使其重要性有所降低:
- HTTP/2和HTTP/3:现代协议已经支持多路复用和流控制,可以高效处理大数据传输。
- 高效网络:现代网络基础设施的改进使得数据传输更加稳定和高效。
是否需要使用Transfer-Encoding: chunked
取决于具体的应用场景:
- 需要:在使用HTTP/1.1的环境中,尤其是需要传输大数据或不确定长度的数据时,依然可以使用。
- 不需要 :在使用HTTP/2或HTTP/3的环境中,已经不需要显式设置
chunked
传输。
1 Transfer-Encoding: chunked
的机制
Transfer-Encoding
是一个请求和响应消息头,用于指示数据传输过程中使用的编码方式。常见的值包括chunked
。
规范中规定,chunked
表示数据以分块的形式传输,每一块都有自己的大小标识,直到最后一个块(大小为0)表示传输结束。
例如,如果使用chunked
,服务器可以逐块接收数据,而不是一次性接收所有数据。
Client Server HTTP Request (Headers with Transfer-Encoding: chunked) HTTP/1.1 200 OK Client sends request body in chunks HTTP Request Body (Chunk 1) HTTP Request Body (Chunk 2) HTTP Request Body (Final Chunk) HTTP Response Client Server
在分块传输中,
Transfer-Encoding
头可以显著影响数据传输的稳定性和效率。默认情况下,客户端可能会使用chunked
传输,但明确设置可以确保行为一致。
客户端发送带有Transfer-Encoding: chunked
头的请求,服务器接收数据时逐块处理。这种机制可以避免一次性传输大量数据导致的传输失败,提高传输效率。
在HTTP长连接(持久连接)中,客户端与服务器之间会复用同一个TCP连接以发送多个请求/响应对话。这通常会显著降低延迟和资源消耗。
注意 : Transfer-Encoding: chunked
机制与连接的长短无关。无论是短连接还是长连接,当客户端发送一个包含chunked
头的请求时,都会触发分块传输的机制。
2 语法 && 通过设置Transfer-Encoding: chunked
优化性能
目前规范中规定的值包括chunked
:
http
Transfer-Encoding: chunked
例如,curl库默认设置,或者在大文件上传时:
http
# 客户端发送带有 Transfer-Encoding: chunked 消息头的请求,逐块传输数据。
PUT /upload HTTP/1.1
Host: origin.example.com
Transfer-Encoding: chunked
通过设置Transfer-Encoding: chunked
,可以避免一次性传输大量数据,提高传输稳定性和效率。
3 总结
通过正确使用Transfer-Encoding
头,尤其是chunked
传输,可以避免一次性传输大量数据导致的传输失败,提高传输稳定性和效率。