在 Http 版本 1.1 中提供支持。

通常情况下我们服务器的每一个 Response 都是以整个内容发送的。Content-Length 消息头字段表示整个内容的长度。数据的长度很重要,因为客户端需要知道哪里是应答消息的结束,以及后续应答消息的开始。然而,使用分块传输编码,数据分解成一系列数据块,并以一个或多个块发送,这样服务器可以发送数据而不需要预先知道发送内容的总大小。

Chunked编码使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。

每个Chunk分为头部和正文两部分,头部内容指定下一段正文的字符总数(十六进制的数字)和数量单位(一般不写),正文部分就是指定长度的实际内容,两部分之间用回车换行(CRLF)隔开。

在最后一个长度为0的Chunk中的内容是称为footer的内容,是一些附加的Header信息(通常可以直接忽略)。

参见 [RFC2616] 标准 3.6.1 提供的 编码解码 算法

   每一个 chunk 块都有以下可选指标
   **编码算法**
   Chunked-Body   = *chunk
                    last-chunk
                    trailer
                    CRLF
   chunk          = chunk-size [ chunk-extension ] CRLF
                    chunk-data CRLF
   chunk-size     = 1*HEX
   last-chunk     = 1*("0") [ chunk-extension ] CRLF
   chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
   chunk-ext-name = token
   chunk-ext-val  = token | quoted-string
   chunk-data     = chunk-size(OCTET)
   trailer        = *(entity-header CRLF)



   **解码算法**
   length := 0
   read chunk-size, chunk-ext (if any) and CRLF
   while (chunk-size > 0) {
     read chunk-data and CRLF
     append chunk-data to entity-body
     length := length + chunk-size
     read chunk-size and CRLF
   }

   read entity-header

   while (entity-header not empty) {
     append entity-header to existing header fields
     read entity-header
   }
   Content-Length := length
   Remove "chunked" from Transfer-Encoding

东来
1.7k 声望55 粉丝

一年磨一剑,专心写程序