代码之家  ›  专栏  ›  技术社区  ›  Armen Michaeli

(分块)HTTP二进制消息正文和CRLF

  •  13
  • Armen Michaeli  · 技术社区  · 16 年前

    我似乎无法就以下问题得到明确的答案(主要是谷歌搜索和阅读http/1.1规范):

    当使用“chunked”传输编码时,为什么服务器需要写出以字节为单位的块大小,并让随后的块数据以crlf结尾。这是否会使发送二进制数据“crlf unclean”和方法有点多余?如果数据在某个地方有一个0x0A,后跟一个0x0D(也就是说,这些实际上是数据的一部分),该怎么办?客户机是否希望遵守在块的头部显式提供的块大小,或者在数据中遇到的第一个CRLF上阻塞?到目前为止,我的理解是简单地采用服务器提供的块大小,继续下一行,然后从以下数据(CRLF或无CRLF)中准确读取这部分字节,然后跳过数据后面的CRLF,重复该过程,直到不再有块……我说的对吗?那么,每个数据块之后的CRLF有什么意义呢?可读性?

    2 回复  |  直到 15 年前
        1
  •  23
  •   seh Alexei    16 年前

    分块的使用者不会扫描邮件正文中的CRLF对。它首先读取指定的字节数, 然后 再读取两个字节以确认它们是CR和LF。如果不是,则消息正文的格式不正确,或者指定的大小不正确,或者数据已损坏。

    尾随的CRLF是安全带和吊带的保证(根据 RFC 2616 section 3.6.1 , 块传输编码 ,但它还可以维护字段从行的开头开始的一致规则。

        2
  •  4
  •   Gumbo    16 年前

    每个块后的CRLF可能只是为了更好的可读性,因为每个块开头的块大小不需要它。但是,在块头__chunk header__之后的CRLF是必要的,因为在块大小之后可能还有其他信息(请参见 Chunk Transfer Encoding )以下内容:

          chunk          = chunk-size [ chunk-extension ] CRLF
                           chunk-data CRLF
    
    推荐文章