一句话定义:分块传输编码(Chunked Transfer Encoding)是 HTTP/1.1 的一种传输方式:服务器不必预先知道响应总长度,而是把内容切成带长度标记的块逐个发送,最后用一个零长度块表示结束。
原理:普通响应通常用 Content-Length 告诉客户端“总共多少字节”。但大模型逐字生成回答时,最终有多少字事先不知道;若硬等全部生成完再算长度,用户只能干等。分块传输像搬家时不知道总共几车:每车贴一张“本车清单”,到一车发一车,最后发一辆空车表示搬完。接收方每收到一块就处理一块,因此能边生成、边发送、边显示。每块前有十六进制长度,块后跟分隔符;零长度块是结束信号,后面还可带少量 trailer 字段(可选)。
和相邻概念的区别:
| 概念 | 作用 | 层级 |
|---|---|---|
Content-Length | 事先声明总字节数 | HTTP 消息头 |
| 分块传输编码 | 不知道总长度时,逐块界定传输边界 | HTTP/1.1 传输编码 |
| gzip | 压缩内容,减少字节数 | 内容编码,可与分块并用 |
| SSE | 按事件推送文本,如 data: ... | 应用层事件格式,不是传输编码 |
关键别混:SSE(Server-Sent Events)是“消息长什么样”,分块传输是“字节怎么运”。在 HTTP/1.1 下,SSE 和很多流式输出常借助分块传输实现;但 HTTP/2、HTTP/3 有自己的流与帧机制,不再用 Transfer-Encoding: chunked。AI 输出里的“token 块”也是应用层概念,传输块边界不必与 token 或 SSE 事件对齐。
实际意义:做聊天、日志、进度推送时,服务端要尽快 flush,客户端要增量解析;中间代理若开启缓冲,可能攒满再转发,流式效果会消失,部署时需确认缓冲/流式配置,具体以所用组件官方文档为准。
