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

amn*_*amn 13 http chunked-encoding

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

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

seh*_*seh 24

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

尾随CRLF是一种带和吊带保证(根据RFC 2616第3.6.1节,分块传输编码),但它也用于维持字段从行开头开始的一致规则.


Gum*_*mbo 6

每个块之后的 CRLF 可能只是为了更好的可读性,因为由于每个块开头的块大小,它没有必要。但是“块头”之后的 CRLF 是必要的,因为块大小之后可能有附加信息(参见块传输编码):

      chunk          = chunk-size [ chunk-extension ] CRLF
                       chunk-data CRLF
Run Code Online (Sandbox Code Playgroud)