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

Posted

技术标签:

【中文标题】HTTP 中的内容编码与传输编码【英文标题】:Content-Encoding vs Transfer Encoding in HTTP 【发布时间】:2014-06-26 06:45:54 【问题描述】:

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

如果我的以下理解正确,请告诉我:

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

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

我的理解在这里吗?请发表评论。

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

【问题讨论】:

另见***.com/questions/11641923/… 【参考方案1】:

真正的区别不在于即时或不即时 - 内容编码既可以预先计算,也可以即时计算。

区别在于:

传输编码是逐跳的,而不是端到端的 “分块”以外的传输编码(遗憾的是)并未在实践中实现 传输编码在消息层,内容编码在负载层 使用内容编码会影响实体标签等

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

【讨论】:

感谢您回答我的问题。请原谅我的无知,消息层与有效负载层有何不同? Payload层是指(实体或实体的表示),Message Layer是指完整的HTTP Headers+Entity吗? 另外,来自 RFC 7230,据说:“传输编码名称用于指示已经、可以或可能需要应用于有效负载主体的编码转换,以便确保通过网络的“安全传输”。这与内容编码的不同之处在于,传输编码是消息的属性,而不是正在传输的表示的属性。您能帮我理解消息的属性与表示的属性吗? “传输编码(遗憾地)在实践中没有实现” - Transfer-Encoding: chunked 被广泛使用,所以这可能需要一些限定。 user3623821:消息就是网络上的内容。有效载荷在传输编码之前。

以上是关于HTTP 中的内容编码与传输编码的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 协议中的 Transfer-Encoding与Content-Length

HTTP 传输内容的压缩

HTTP 内容编码,base64

HTTP 内容编码,base64

(chap 3 Http报文内的http信息) 编码提升传输速率

HTTP协议之chunk编码(分块传输编码)