前言

rfc7230是替换rfc2616的文档,主要描述http 1.1相关内容。本文是学习http chunk封装格式笔记。 http 引入chunk,可以流式发送数据包给客户端,如果服务端发一张大的图片给客户端渲染。 使用chunk可以一个包一个小包发给浏览器。浏览器解析到一个小包,就可以渲染出来。

一chunked数据格式

chunk数据格式rfc文档位于 https://tools.ietf.org/html/rfc7230#section-4.1 

1. chunked-body

chunked-body数据由chunk数据,last-chunk组成, trailer-part CRLF 组成

1
2
3
4
5
6
     chunked-body   = *chunk
                      last-chunk
                      trailer-part
                      CRLF


1.0 chunk 是主要数据段,由以下部分组成

  • chunk-size 必选
  • [chunk-ext] 可选
  • CRLF chunk-data CRLF 必选
1
2
     chunk          = chunk-size [ chunk-ext ] CRLF
                      chunk-data CRLF

1.1chunk-size 数据格式

至少一个16进制字符组成,所以这里遇到不是16进制的直接报错。

1
     chunk-size     = 1*HEXDIG

1.2. chunk-data

这个没啥好聊的,bytes数据。

1
     chunk-data     = 1*OCTET ; a sequence of chunk-size octets

2.last-chunk

  • 1*(“0”) 由1至多个0组成
  • [chunk-ext] CRLF
1
     last-chunk     = 1*("0") [ chunk-ext ] CRLF

3. chunk-ext

回到上面可以看到[chunk-ext]是可选的。 chunked trailer part 由; chunk-ext-name["=" chunk-ext-val ]组成

1
2
3
4
 chunk-ext      = *( ";" chunk-ext-name [ "=" chunk-ext-val ] )

     chunk-ext-name = token
     chunk-ext-val  = token / quoted-string

4. trailer-part

解析到trailer-part,把他当http header处理。但是下面的一些header是要忽略的 Transfer-Encoding, Content-Length, Host, Content-Encoding, Content-Type, Content-Range, and Trailer

1
 trailer-part   = *( header-field CRLF )

二、解码伪代码

先读取chunk-size。然后读取chunk-size的数据。标准TLV解法。然后需要处理trailer-field数据

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
A process for decoding the chunked transfer coding can be represented
   in pseudo-code as:

     length := 0
     read chunk-size, chunk-ext (if any), and CRLF
     while (chunk-size > 0) {
        read chunk-data and CRLF
        append chunk-data to decoded-body
        length := length + chunk-size
        read chunk-size, chunk-ext (if any), and CRLF
     }
     read trailer field
     while (trailer field is not empty) {
        if (trailer field is allowed to be sent in a trailer) {
            append trailer field to existing header fields
        }
        read trailer-field
     }
     Content-Length := length
     Remove "chunked" from Transfer-Encoding
     Remove Trailer from existing header fields