16

当使用分块的 HTTP 传输编码时,为什么服务器需要以字节为单位写出块大小后续的块数据以 CRLF 结尾?

这不会使发送二进制数据“CRLF-unclean”并且该方法有点多余吗?

如果数据在某处有 0x0A 后跟 0x0D 怎么办(即这些实际上是数据的一部分)?那么客户端是否期望遵守在块头部明确提供的块大小,或者在它在数据中遇到的第一个 CRLF 时阻塞?

到目前为止,我对预期客户端行为的理解是简单地获取服务器提供的块大小,继续下一行,然后从以下数据(CRLF 或其中没有 CRLF)中准确读取此字节数,然后跳过 CRLF跟踪数据并重复该过程,直到不再有块。这是合规行为吗?如果是这样,那么每个数据块之后的 CRLF 有什么意义呢?可读性?

我已经对此进行了一些网络搜索,并且还阅读了一些 HTTP 1.1 规范,但我似乎无法找到明确的答案。

4

2 回答 2

28

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

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

于 2010-01-24T16:17:16.827 回答
6

每个块之后的 CRLF 可能只是为了更好的可读性,因为由于每个块开始时的块大小,它不是必需的。但是“块头”之后的 CRLF 是必要的,因为在块大小之后可能还有其他信息(请参阅块传输编码):

      chunk          = chunk-size [ chunk-extension ] CRLF
                       chunk-data CRLF
于 2010-01-24T16:05:45.023 回答