HTTP 1.1中的Transfer-Encoding及Content-Encoding机制

发布: 2011-12-09 18:04

Transfer-Encoding头字段是HTTP 1.1协议新加的字段之一,无论客户端是否指定接收这个头字段指定的值,只要客户端使用了HTTP/1.1协议,服务器端都可以响应这个字段并附带相应的值。
这个字段是支持HTTP/1.1协议的所有客户端必须支持的。

Transfer-Encoding的常见值为chunked,表示服务器传输过来的是分块的,这种情况下,服务器不再发送Content-Length:字段。

这种方式的好处是,服务器在处理动态请求时,不需要缓存动态生成的结果页面,而是生成一段,发送一段,能让http服务器的效率更高些。

当然,发送来的数据,是经过http服务器分块的数据,而不是原文,所以需要做的处理,才能得到实际响应的内容。

chunked方式的响应格式:
从内容开始的位位置,
chunk1长度\r\nchunk1内容\r\nchunk2长度\r\nchunk2内容\r\n

最后的结束chunk为0\r\n

根据这个格式,可解析出实际原文。


另外,还有一个头字段Content-Encoding,是HTTP 1.0和1.1都支持的,如果服务器响应头中有这个字段,表示响应头后面的内容是压缩数据,需要客户端解压。

其优点是双向的,对服务器,减少带宽使用,客户端也是。像html这种数据,压缩率在70%以上。

压缩算法有gzip有 deflate,以前都gzip比较常见。

当服务器响应头中即有Content-Encoding,并且还有Transfer-Encoding的时候,说明响应头后面数据是分块的压缩数据,分块格式依旧和上面一样,只是chunk的内容部分是压缩的,把这部分解压,并把解压后的所有内容串联起来,这就是服务器响应的内容数据了。

参与:http://en.wikipedia.org/wiki/Chunked_transfer_encoding



原文: http://qtchina.tk/?q=node/619

Powered by zexport