(Chunked)HTTP二进制消息体和CRLF

时间:2010-01-24 15:57:29

标签: http chunked-encoding

我似乎无法对以下问题得到明确的答案(谷歌搜索并阅读HTTP / 1.1规范):

当使用'chunked'传输编码时,为什么服务器需要以字节为单位写出块大小并使后续块数据以CRLF结束。这不会使发送二进制数据“CRLF-unclean”并且方法有点多余吗?如果数据在某处有一个0x0A后跟0x0D怎么办(即这些实际上是数据的一部分)?客户端是否应该遵守在数据中遇到的第一个CRLF上的块头或阻塞处明确提供的块大小?到目前为止,我的理解是简单地获取服务器提供的块大小,继续下一行,然后从以下数据中读取这个字节数(CRLF或内部没有CRLF),然后跳过跟随数据的CRLF并重复这个程序,直到没有更多的块...我是对的吗?那么每个数据库之后的CRLF有什么意义呢?可读性?

2 个答案:

答案 0 :(得分:23)

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

尾随CRLF是一种腰带和吊带保证(每RFC 2616 section 3.6.1分块传输编码),但它也用于维护字段从字段开始处开始的一致规则这条线。

答案 1 :(得分:4)

每个块之后的CRLF可能只是为了更好的可读性,因为在每个块的开头都没有必要的块大小。但是在“块头”之后的CRLF是必要的,因为在块大小之后可能存在其他信息(参见Chunk Transfer Encoding):

      chunk          = chunk-size [ chunk-extension ] CRLF
                       chunk-data CRLF