Transfer-Encoding:用于指定传输报文主体时使用的编码方式,属于逐跳首部,即只在两个节点间有效。
TE:用于告知服务器客户端能够处理的编码方式和相对优先级,属于逐跳首部,即只在两个节点间有效。
Content-Encoding:用于指定报文主体已经采用的编码方式,属于端到端首部,即在整个传输过程中有效。
Accept-Encoding:用于告知服务器客户端能够处理的编码方式和相对优先级,属于端到端首部,即在整个传输过程中有效。
很显然,Transfer-Encoding和TE是一组,Content-Encoding和Accept-Encoding是一组。
根本区别在于,Content-Encoding和Accept-Encoding限制的是报文主体在整个传输过程中使用的编码方式,全局有效;Transfer-Encoding和TE限制的是报文主体在两个节点间(源服务器和代理服务器之间、代理服务器和客户端之间等)传输时使用的编码方式,只在两节点间有效。举例说明:
假设A为服务器,D为客户端,从A到D的路径为A-B-C-D,所需传输的资源为X。步骤如下:
(1)D向A请求X,并在请求报文中指明自己支持的编码方式为gzip;
Accept-Encoding:gzip
(2)请求按路径传递到A处,A将X用gzip编码进行压缩并发到B处,由B进行下一步转交,并在报文中指明使用的编码方式为gzip;
Content-Encoding:gzip
(3)B认为传给C时使用分块传输比较合理,就对A传过来的报文实体进行分块,并在报文中说明:
Content-Encoding:gzip
Transfer-Encoding:chunked
(4)C收到B的报文,并根据Transfer-Encoding:chunked判断出B进行了分块传输,于是C对收到的各个分块进行重组,还原出完整的X(注意此时的X还是被gzip压缩过的状态)。之后C不进行分块,直接将整个发送给D:
Content-Encoding:gzip
(5)D接收到响应报文,并根据Content-Encoding:gzip判断出报文实体已经被gzip压缩过了,于是对其进行解码,最终获得资源X。