http协议压缩

来源:互联网 发布:javaudp网络编程 编辑:程序博客网 时间:2024/06/04 18:07

常用压缩方法的介绍:

gzip 和deflate

 LZ77 是一种基于字典的无损数据压缩算法(还有 LZ78, LZW 等)。
     deflate 
是一种数据压缩算法,实际上就是先用 LZ77 压缩,然后用霍夫曼编码压缩。
     gzip 的基础是defalte 。其通过 defalte 算法压缩数据,然后加上 gzip 文件头和 CRC 校验。压缩后生成 .tar.gz 或者 .tgz 文件。既是一种文件结构,也可以算一种压缩格式。
     ZIP 也使用defalte 算法,但可移植性更好,并且不需要一个外部的归档工具就可以包容多个文件。但是由于 ZIP 对每个文件进行单独压缩而没有利用文件间的冗余信息(固实压缩),所以 ZIP 的压缩率要稍逊于 tar 压缩包。
      zlib是一个提供了 deflate, zlib, gzip 压缩方法的函数库;同时也是一种压缩格式,可以通过 deflate 压缩数据,之后加上 zlib 头和 CRC 校验来生成 zlib 文件格式。
     bzip2一个基于数据块排序算法的文件压缩工具,并作为 gzip 的替代者逐渐得到流行,它可以生成相当小的压缩文件,尤其是对于源代码以及其它的结构化文本来说更是这样,但是这样做的代价是最高达 4倍内存与处理器时间消耗。bzip2 压缩的 tar 包传统上叫作 .tar.bz2 。

      zlib 数据流格式、defalte 以及 gzip 文件格式均已被标准化成了,分别是 RFC 1950、RFC 1951 以及 RFC 1952

HTTP/1.1 协议允许客户端可以选择要求从服务器下载压缩内容,这个标准本身定义了三种压缩方法: 

  1. “gzip”(内容用 gzip 数据流进行封装)
  2. “compress”(内容用 compress 数据流进行封装)
  3. “deflate”(内容是原始格式、没有数据头的 DEFLATE 数据流)

许多 HTTP 客户端库以及绝大多数现代的浏览器都支持前后两种格式。

Web 压缩相关技术如下:

  • HTTP 压缩:压缩来自 Web 服务器的内容
  • Gzip 压缩: 一种无损失的数据压缩格式
  • 静态压缩:预压缩,用于发送静态页面
  • 内容及传输编码:IETF 用于压缩 HTTP 内容的两级标准


HTTP 压缩

      HTTP 压缩是一种用于压缩来自 Web 服务器(HTTP 服务器)的内容的技术。Web 服务器内容的格式可以是诸多 MIME 类型中的一种:HTML、纯文本、图像格式、PDF 文件等。其中 HTML 和图像格式是在 Web 应用程序中最常用的 MIME 格式。

      Web 应用程序中使用的大多数图像(例如 GIF 和 JPG)已经是压缩过的格式,无需进一步压缩;即使再压缩,性能也不会有大的改善。然而,静态或动态创建的 HTML 内容只包含纯文本,适合进行压缩。

HTTP 压缩的目的是使 Web 站点发送更少的数据。要有效实地现这个目的,需要以下条件:

  • Web 服务器应该能够压缩数据
  • 浏览器应能解压缩数据并以正常的方式显示页面

这是很明显的。当然,压缩和解压缩的处理不应消耗大量的时间或资源。

Gzip 压缩

       Gzip 是一种无损失的数据压缩格式。所使用的算法是开源、无专利的 LZ77(Lempel-Ziv 1977)算法的变体。 该算法寻找输入数据内的重复字符串。二次出现的字符串由一个指向前一字符串的指针代替。

静态压缩

      如果 Web 内容是预生成的并且不需要与其他系统进行服务器端动态交互,那么内容就可以被预压缩并放置在 Web 服务器内。而这些压缩了的页面则在用户请求时被发送。流行的压缩工具(gzip、Unix compress)均可压缩这些静态文件。
      但是,当内容必须动态生成,比如对于电子商务站点或由应用程序和数据库驱动的站点,静态压缩没有什么用处。

HTTP内容编码和HTTP压缩的区别

HTTP压缩,在HTTP协议中,其实是内容编码的一种。

在http协议中,可以对内容(也就是body部分)进行编码, 可以采用gzip这样的编码。 从而达到压缩的目的。 也可以使用其他的编码把内容搅乱或加密,以此来防止未授权的第三方看到文档的内容。

所以我们说HTTP压缩,其实就是HTTP内容编码的一种。 所以大家不要把HTTP压缩和HTTP内容编码两个概念混淆了。

 

HTTP压缩的过程

1. 浏览器发送Http request 给Web服务器,  request 中有Accept-Encoding: gzip, deflate。 (告诉服务器, 浏览器支持gzip压缩)

2. Web服务器接到request后, 生成原始的Response, 其中有原始的Content-Type和Content-Length。

3. Web服务器通过Gzip,来对Response进行编码, 编码后header中有Content-Type和Content-Length(压缩后的大小), 并且增加了Content-Encoding:gzip.  然后把Response发送给浏览器。

4. 浏览器接到Response后,根据Content-Encoding:gzip来对Response 进行解码。 获取到原始response后, 然后显示出网页。


如下图:

 

 

实例:Fiddler观察HTTP压缩

眼见为实, 我们看一个实际的例子, 我发现博客园就使用了gzip压缩。

使用Fiddler可以清楚地看到。  

 

在Fiddler中,每次都要手动去decode. 太麻烦。  点击工具栏上的"Decode"按钮,就可以自动decode了。

 

内容编码类型

 HTTP定义了一些标准的内容编码类型,并允许用扩展的形式添加更多的编码。

Content-Encoding header 就用这些标准化的代号来说明编码时使用的算法

Content-Encoding值

gzip  表明实体采用GNU zip编码

compress 表明实体采用Unix的文件压缩程序

deflate  表明实体是用zlib的格式压缩的

identity  表明没有对实体进行编码。当没有Content-Encoding header时, 就默认为这种情况

gzip, compress, 以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失。 其中gzip通常效率最高, 使用最为广泛。

 

压缩的好处

 http压缩对纯文本可以压缩至原内容的40%, 从而节省了60%的数据传输。

 实例: 博客园首页压缩前是:46124 bytes. 压缩后是:16368bytes.     只有原先的35%。  节省了65%的数据传输,从而大大提高了性能

 有图为证。

 

Gzip的缺点

JPEG这类文件用gzip压缩的不够好。

 

Gzip是如何压缩的

简单来说, Gzip压缩是在一个文本文件中找出类似的字符串, 并临时替换他们,使整个文件变小。这种形式的压缩对Web来说非常适合, 因为HTML和CSS文件通常包含大量的重复的字符串,例如空格,标签。

 

HTTP Response能压缩,HTTP Request也是可以压缩的

浏览器是不会对Request压缩的。 但是 一些HTTP程序在发送Request时,会对其进行编码。 如下图。

 

 

 

 

 

 

 

0 0