HTTP协议中你必须知道的三种数据格式(2)

2016/12/30 15:37:43 作者:华威天下发布企业:沈阳华威天下科技有限公司[打印]

Gzip 压缩两种类型

 

压缩算法不同可以产生不同的压缩数据(目的都是为了减小文件大小)。目前Web 端流行的压缩格式有两种分别是 Gzip 和 Defalte。

 

Apache 中的就是 Gzip 模块Deflate 是同时使用了 LZ77 算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。Deflate 压缩与解压的源代码可以在自由通用的压缩库 zlib 上找到。

 

更高压缩率的Deflate是7-zip 所实现的。AdvanceCOMP 也使用这种实现它可以对 gzip、PNG、MNG以及 ZIP 文件进行压缩从而得到比 zlib 更小的文件大小。在 Ken Silverman的 KZIP 与 PNGOUT 中使用了一种更加高效同时要求更多用户输入的 Deflate 程序。

 

deflate 使用 inflateInit()而 gzip 使用 inflateInit2() 进行初始化,比 inflateInit() 多一个参数-MAX_WBITS,表示处理 raw deflate 数据。因为 gzip 数据中的 zlib 压缩数据块没有 zlib header 的两个字节。使用 inflateInit2 时要求 zlib 库忽略 zlib header。在 zlib 手册中要求 windowBits 为 8..15但是实际上其它范围的数据有特殊作用,如负数表示 raw deflate。

 

其实说这么多总结一句话,Deflate 是一种压缩算法是 huffman 编码的一种加强。 deflate 与 gzip 解压的代码几乎相同可以合成一块代码。

 

(更多知识请见维基百科 zlib )

 

Web 服务器处理数据压缩的过程

1、Web服务器接收到浏览器的HTTP请求后检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);

2、如果浏览器支持HTTP压缩Web服务器检查请求文件的后缀名;

3、如果请求文件是HTML、CSS等静态文件Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;

4、如果请求文件的压缩文件不存在Web服务器向浏览器返回未压缩的请求文件并在压缩缓冲目录中存放请求文件的压缩文件;

5、如果请求文件的最新压缩文件已经存在则直接返回请求文件的压缩文件;

6、如果请求文件是动态文件Web服务器动态压缩内容并返回浏览器压缩内容不存放到压缩缓存目录中。

 

举个栗子

 

说了这么多下面举一个例子,打开抓包软件访问我们学校的官网( )请求头如下:

 

GET /_css/tpl2/system.css HTTP/1.1

Host http://www.ecnu.edu.cn

Connectionkeep-alive

User-AgentMozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/54.0.2840.59 Safari/537.36

Accepttext/css,*/*;q=0.1

Refererhttp:// /

Accept-Encodinggzip, deflate

Accept-Languagezh-CN,zh;q=0.8

Cookiea10-default-cookie-persist-20480-sg_bluecoat_a=AFFIHIMKFAAA

 

在第七行 Accept-Encoding 显示的是 gzip, deflate这句话的意思是,浏览器告诉服务器支持 gzip 和 deflate 两种数据格式服务器收到这种请求之后会进行 gzip 或 deflate 压缩(一般都是返回gzip格式的数据)。

 

Python 的 urllib2 就可以设置这个参数:

 

request = urllib2.Request(url)

request.add_header(39;Accept-encoding39;, 39;gzip39;)

//或者设置成 deflate

request.add_header(39;Accept-encoding39;, 39;deflate39;)

//或者两者都设置

request.add_header(39;Accept-encoding39;, 39;gzip, deflate39;)

 

服务器给的响应一般如下:

 

HTTP/1.1 200 OK

DateSat, 22 Oct 2016 11:41:19 GMT

Content-Typetext/javascript;

Transfer-Encodingchunked

Connectionclose

VaryAccept-Encoding

tracecode24798560510951725578102219

ServerApache

Content-Encodinggzip

 

400a

............ks#I. ...W...,....>..T..]..Z...Y..].MK..2..L..(略)

//响应体为压缩数据

 

从响应头来看Content-Encoding: gzip 这段话说明响应体的压缩方式是 gzip 压缩,一般有几种情况字段为空表示明文无压缩,还有 Content-Encoding: gzip 和 Content-Encoding: deflate 两种。

 

实际上 Gzip 网站要远比 Deflate 多之前写过一个简单爬虫从 hao123的主页开始爬,爬几千个网页(基本涵盖所有常用的)专门分析响应体的压缩类型得到的结果是:

 

1、Accept-Encoding 不设置参数会返回一个无压缩的响应体(浏览器比较特别他们会自动设置 Accept-Encoding: gzip: deflate 来提高传输速度);

2、Accept-Encoding: gzip100% 的网站都会返回 gzip 压缩,但不保证互联网所有网站都支持 gzip(万一没开启);

3、Accept-Encoding: deflate:只有不到 10% 的网站返回一个 deflate 压缩的响应其他的则返回一个没有压缩的响应体。

4、Accept-Encoding: gzip, deflate:返回的结果也都是 gzip 格式的数据说明在优先级上 gzip 更受欢迎。

5、响应头的 Encoding 字段很有帮助比如我们写个正则表达式匹配响应头是什么压缩:

 

(?<=Content-Encoding: ).+(?=\r\n)

 

匹配到内容为空说明没有压缩为 gzip 说明响应体要经过 gzip 解压为deflate 说明为deflate压缩。

 


关键字:华威天下,沈阳华威,华威科技
免责声明:以上所展示的信息由网友自行发布,内容的真实性、准确性和合法性由发布者负责。行业信息网对此不承担任何保证责任。任何单位或个人如对以上内容有权利主张(包括但不限于侵犯著作权、商业信誉等),请与我们联系并出示相关证据,我们将按国家相关法规即时移除。

其他新闻

关于我们 | 服务条款 | 网站指南 | 免责声明 | 友情链接 | 给我们留言
红盾
COPYRIGHT @ 2001-2017 CNlinfo.net ALL RIGHTS RESERVED
深圳市信息行业协会商务网站 运营商:深圳市兴讯信息技术有限公司 粤ICP备:05039908
营业执照