HTTP 中的内容编码与传输编码

Vam*_*han 6 http rfc2616

我对 Content-Encoding 和 Transfer-Encoding 的使用有疑问:

请让我知道我的以下理解是否正确:

客户端在其请求中可以使用 accept-encoding 标头指定它愿意接受哪些编码类型。因此,如果服务器希望在传输之前对消息进行编码,例如。gzip,它可以压缩实体(内容)并添加内容编码:gzip 并通过 HTTP 响应发送。在接收时,客户端可以接收并解压缩和解析实体。

在传输编码的情况下,客户端可以指定它愿意接受哪种编码并即时执行其操作。即如果客户端发送一个 TE: gzip; q=1,这意味着如果服务器愿意,它可以使用 Transfer-Encoding: gzip 发送 200 OK 并且当它尝试发送流时,它可以压缩和发送,客户端在接收到内容后,可以即时解压缩和执行其解析。

我的理解到此为止吗?请给出意见。

另外,动态压缩实体与先压缩实体然后再传输的基本优势是什么?传输编码是否仅对分块响应有效,因为我们在传输前不知道实体的大小?

Jul*_*hke 12

区别真的不在于即时与否——内容编码既可以预先计算,也可以即时计算。

区别在于:

  • 传输编码是逐跳的,而不是端到端的
  • 在实践中没有实现除“分块”(可悲)之外的传输编码
  • 传输编码在消息层,内容编码在负载层
  • 使用内容编码会影响实体标签等。

请参阅http://greenbytes.de/tech/webdav/rfc7230.html#transfer.codingshttp://greenbytes.de/tech/webdav/rfc7231.html#data.encoding

  • 谢谢回答我的问题。请原谅我的无知,消息层与负载层有何不同?Payload 层是指(实体或实体的表示),消息层是指完整的 HTTP Headers+Entity 吗? (2认同)
  • “传输编码(遗憾的是)在实践中并未实现”-“传输编码:分块”被广泛使用,因此这可能需要一些限定。 (2认同)