HTTP 1.1中有两个实体头(Entity-Header)直接与编码相关,分别为Content-Encoding和Transfer-Encoding. 先说Content-Encoding, 该头表示实体已经采用了的编码方式.Content-Encoding是请求URL对应实体(Entity)自己的一部分.好比请求URL为http://host/image.png.gz时,可能会获得的Content-Encoding为gzip.Content-Encoding的值是不区分大小写的,目前HTTP1.1标准中已包括的有gzip/compress/deflate/identity等. 与Content-Encoding头对应,HTTP请求中包含了一个Accept-Encoding头,该头用来讲明用户代理(User-Agent,通常也就是浏览器)能接受哪些类型的编码. 若是HTTP请求中不存在该头,服务器能够认为用户代理能接受任何编码类型. 接下来重点描述Transfer-Encoding, 该头表示为了达到安全传输或者数据压缩等目的而对实体进行的编码. Transfer-Encoding与Content-Encoding的不一样之处在于: 1, Transfer-Encoding只是在传输过程当中才有的,并不是请求URL对应实体的自己特性. 2, Transfer-Encoding是一个"跳到跳"头,而Content-Encoding是"端到端"头. 该头的用途举例如,请求URL为http://host/abc.txt,服务器发送数据时认为该文件可用gzip方式压缩以节省带宽,接收端看到Transfer-Encoding为gzip首先进行解码而后才能获得请求实体. 此外多个编码可能同时对同一实体使用,因此Transfer-Encoding头中编码顺序至关重要,它表明了解码的顺序过程.一样,Transfer-Encoding的值也是不区分大小写的,目前HTTP1.1标准中已包括的有gzip/compress/deflate/identity/chunked等. Transfer-Encoding中有一类特定编码:chunked编码.该编码将实体分块传送并逐块标明长度,直到长度为0块表示传输结束, 这在实体长度未知时特别有用(好比由数据库动态产生的数据). HTTP1.1标准规定,只要使用了Transfer-Encoding的地方就必须使用chunked编码,而且chunked必须为最后一层编码.任何HTTP 1.1应用都必须能处理chunked编码. 与Transfer-Encoding对应的请求头为TE,它主要表示请求发起者愿意接收的Transfer-Encoding类型. 若是TE为空或者不存在,则表示惟一能接受的类型为chunked. 其余与Transfer-Encoding相关的头还包括Trailer,它与chunked编码相关,就不细述了. 顾名思义,Content-Length表示传输的实体长度,以字节为单位(在请求方法为HEAD时表示会要发送的长度,但并不实际发送.).Content-Length受Transfer-Encoding影响很大,只要Transfer-Encoding不为identity,则实际传输长度由编码中的chunked决定,Content-Length即便存在也被忽略. 关于HTTP Message Body的长度 在HTTP中有消息体(Message body)和实体(Entity body)之分,简单说来在没有Transfer-Encoding做用时,消息体就是实体,而应用了Transfer-Encoding后,消息体就是编码后的实体,以下: Message body = Transfer-Encoding encode(Entity body) 如何肯定消息体的长度? HTTP 1.1标准给出了以下方法(按照优先级依次排列): 1, 响应状态(Response Status)为1xx/204/304或者请求方法为HEAD时,消息体长度为0. 2, 若是使用了非"identity"的Transfer-Encoding编码方式,则消息体长度由"chunked"编码决定,除非该消息以链接关闭为结束. 3, 若是存在"Content-Length"实体头,则消息长度为该数值. 3, 若是消息使用关闭链接方式表明消息体结束,则长度由关闭前收到的长度决定. 该条对HTTP Request包含的消息体不适用.