正常响应用 Content-Length 声明长度,但有些场景服务端开始响应时还不知道总长度:动态生成的页面、流式输出、服务器推送。这时用 Transfer-Encoding: chunked——响应体切成一块块发送,每块以「十六进制长度 + CRLF + 数据 + CRLF」组织,最后发一个长度为 0 的块表示结束。客户端逐块解码拼接,无需预先知道总长。
注意点:1)Content-Length 与 chunked 互斥,出现 chunked 时忽略 Content-Length;2)分块是传输层概念,与业务无关,浏览器/fetch 收到的是拼接后的完整流;3)HTTP/2 和 HTTP/3 有自己的帧机制,不再使用 chunked(HEADERS+DATA 帧天然支持流式);4)SSE(Server-Sent Events)正是建立在 chunked 长响应上的应用:连接不关闭,服务端有事件就写一块。安全角度:请求走私(HTTP Request Smuggling)常利用前端与后端对 Content-Length 和 chunked 优先级的解析差异,现代服务器已统一按 RFC 处理。追问方向:chunked 与 Range 能否共存、gzip 与 chunked 的先后关系(先压缩再分块)。
(约 400 字)