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
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/54.0.2840.59 Safari/537.36
Accept: text/css,*/*;q=0.1
Referer: http:// /
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: a10-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
Date: Sat, 22 Oct 2016 11:41:19 GMT
Content-Type: text/javascript;
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
tracecode: 24798560510951725578102219
Server: Apache
Content-Encoding: gzip
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压缩。