HTTP 协议中你必须知道的三种数据格式
实习中的一个主要工作就是分析HTTP 中的协议,自己也用Python 写过正则表达式对HTTP 请求和响应的内容进行匹配,然后把关键字段抽离出来放到一个字典中以备使用(可以稍微改造一下就是一个爬虫工具)。
HTTP 协议中的很多坑,自己都遇到过,我就针对自己遇到的几种HTTP 常见的数据格式,来做一个总结。
Zlib 压缩数据
对于Zlib,一点也不陌生,我们平时用它来压缩文件,常见类型有zip、rar 和7z 等。Zlib 是一种流行的文件压缩算法,应用十分广泛,尤其是在Linux 平台。当应用Zlib 压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小,这取决于文件中的内容。
Zlib 也适用于Web 数据传输,比如利用Apache 中的Gzip (后面会提到,一种压缩算法) 模块,我们可以使用Gzip 压缩算法来对Apache 服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度。
网页加载速度加快的好处不言而喻,节省流量,改善用户的浏览体验。而这些好处并不仅仅限于静态内容,PHP 动态页面和其他动态生成的内容均可以通过使用Apache 压缩模块压缩,加上其他的性能调整机制和相应的服务器端缓存规则,这可以大大提高网站的性能。因此,对于部署在Linux 服务器上的PHP 程序,在服务器支持的情况下,建议你开启使用Gzip Web 压缩。
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 服务器处理数据压缩的过程
Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息);
如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名;
如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件;
如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;
如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件;
如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。
举个栗子
说了这么多,下面举一个例子,打开抓包软件,访问我们学校的官网( ),请求头如下:
GET /_css/tpl2/system.css HTTP/1.1
Host:
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: /
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('Accept-encoding', 'gzip')
//或者设置成deflate
request.add_header('Accept-encoding', 'deflate')
//或者两者都设置
request.add_header('Accept-encoding', 'gzip, deflate')