GZIP压缩
文章平均质量分 64
jison_r_wang
刚刚入行的菜鸟
展开
-
GZIP压缩原理分析(01)——第一章 序言
本系列博客将详细分析当前主流压缩技术gzip的原理及其源码(gzip1.2.4)。暂时只分析无损压缩(如果后续我能有机会研究有损压缩,依然会以类似的形式将分析结果发布到博客中),并对当前网络上大量使用的HTTP压缩进行专项分析。希望本系列博客能够起到抛砖引玉的作用。有什么疑问,欢迎直接在我博客上留言,我将在第一时间回复。另,本系列文章皆系原创,欢迎转载,转载请注明出处。 本系列文章能够成文原创 2016-07-30 09:58:13 · 3150 阅读 · 0 评论 -
GZIP压缩原理分析(21)——第五章 Deflate算法详解(五12) 动态哈夫曼编码分析(01) 本节说明
存储、静态哈夫曼编码的原理较为简单,在分析格式的过程中就可以顺带介绍。在压缩原理中,最麻烦、最难、最绕的地方就是动态哈夫曼编码这里了,比较烧脑子。原创 2016-07-31 11:02:43 · 2391 阅读 · 1 评论 -
GZIP压缩原理分析(22)——第五章 Deflate算法详解(五13) 动态哈夫曼编码分析(02) LZ77过程(01)
LZ77要解决的几个问题原创 2016-07-31 11:03:17 · 2722 阅读 · 1 评论 -
GZIP压缩原理分析(23)——第五章 Deflate算法详解(五14) 动态哈夫曼编码分析(03) LZ77过程(02)
匹配串由几个字符构成?原创 2016-07-31 11:03:39 · 2242 阅读 · 0 评论 -
GZIP压缩原理分析(24)——第五章 Deflate算法详解(五15) 动态哈夫曼编码分析(04) LZ77过程(03)
如何高效查找匹配串?原创 2016-07-31 11:04:08 · 3943 阅读 · 2 评论 -
GZIP压缩原理分析(25)——第五章 Deflate算法详解(五16) 动态哈夫曼编码分析(05) LZ77过程(04)
如何找到最长匹配?原创 2016-07-31 11:05:08 · 3991 阅读 · 14 评论 -
GZIP压缩原理分析(26)——第五章 Deflate算法详解(五17) 动态哈夫曼编码分析(06) LZ77过程(05)
找不到匹配怎么办?原创 2016-07-31 11:05:38 · 2159 阅读 · 1 评论 -
GZIP压缩原理分析(27)——第五章 Deflate算法详解(五18) 动态哈夫曼编码分析(07) LZ77过程(06)
LZ77结果原创 2016-07-31 11:05:58 · 2095 阅读 · 0 评论 -
GZIP压缩原理分析(28)——第五章 Deflate算法详解(五19) 动态哈夫曼编码分析(08) LZ77过程(07)
哈希函数以及哈希值计算初探原创 2016-07-31 11:06:54 · 2317 阅读 · 2 评论 -
GZIP压缩原理分析(29)——第五章 Deflate算法详解(五20) 动态哈夫曼编码分析(09)构建哈夫曼树(01)
现在已经完成了对字符串“As mentioned above,there are many kinds of wireless systems other than cellular.”进行压缩的第一步,LZ77算法通过用长度距离对儿替换匹配串的方式将这句话在“字节”层面上压缩,压缩结果为“Asmentioned above,there a(3,4)many kinds of wireless原创 2016-07-31 11:07:59 · 2402 阅读 · 0 评论 -
GZIP压缩原理分析(31)——第五章 Deflate算法详解(五22) 动态哈夫曼编码分析(11)构建哈夫曼树(03)
构建distance树原创 2016-07-31 11:09:49 · 6574 阅读 · 5 评论 -
GZIP压缩原理分析(32)——第五章 Deflate算法详解(五23) 动态哈夫曼编码分析(12)构建哈夫曼树(04)
构建literal/length树原创 2016-07-31 11:11:40 · 4080 阅读 · 8 评论 -
GZIP压缩原理分析(33)——第五章 Deflate算法详解(五24) 动态哈夫曼编码分析(13)构建哈夫曼树(05)
构建CCL树原创 2016-07-31 13:11:20 · 4547 阅读 · 27 评论 -
GZIP压缩原理分析(04)——第三章 gzip文件格式详解(三02) gzip文件头
文件头由固定长度的部分和扩展部分组成,扩展部分不一定存在,尤其是网络传输使用的HTTP压缩,如果使用了gzip格式,那么对应的压缩报文一般都不带扩展部分。gzip文件格式通过将头部中定长部分的某些比特位置位来标识头部是否带有扩展部分,我们一一来看。以下各字段的中文含义,我在网上搜了好久也没找到理想的,这里我将RFC1952中的英文释义粗略的翻译一下,不足之处欢迎吐槽。1、 文件原创 2016-07-30 10:02:42 · 13993 阅读 · 0 评论 -
GZIP压缩原理分析(06)——第三章 gzip文件格式详解(三04) gzip文件格式实例分析以及本章总结
这里简单提一下字节顺序的问题,为了理解起来更快更清晰,我不说大小端的问题,只要各位看官记住分析套路先把gzip文件格式分析清楚,知道实际的二进制存储方式即可。后续章节分析压缩源码的时候会结合代码说明。实例一:原始文件的文件信息如下,使用UE打开将该文件经过gzip压缩后的结果,如下图所示,我们逐字节分析,开始的10个字节是固定头部,即00000000h行原创 2016-07-30 10:09:07 · 5803 阅读 · 0 评论 -
GZIP压缩原理分析(20)——第五章 Deflate算法详解(五11) 算法分析(05) 格式说明(04) 动态哈夫曼编码
动态哈夫曼编码(Compression with dynamic Huffman codes),这部分内容只介绍动态哈夫曼编码的格式,对格式中的各个字段做一个简单说明,详细分析见下一节。动态哈夫曼编码格式, 图中每一个“*”代表一比特,蓝色部分为经过压缩之后的数据,其他部分,除了首部块,都用于构建动态哈夫曼树。原创 2016-07-30 14:56:54 · 2484 阅读 · 0 评论 -
GZIP压缩原理分析(19)——第五章 Deflate算法详解(五10) 算法分析(04) 格式说明(03) 静态哈夫曼编码
静态哈夫曼编码(Compression with fixed Huffman codes),这部分内容只要看格式就好,出现在这里的码表只是为了说明,细节此时可能不懂,但是后面会铺开来讲,不用担心。静态哈夫曼编码使用一张固定的literal/length码表,码表如下,Lit Value Bits原创 2016-07-30 14:56:12 · 4480 阅读 · 0 评论 -
GZIP压缩原理分析(18)——第五章 Deflate算法详解(五09) 算法分析(03) 格式说明(02) 存储类型
存储类型(store)的格式如下, 0 1 2 3 4...+---+---+---+---+================================+| LEN|NLEN |... LEN bytes of literal data...|+---+---+---+---+========================原创 2016-07-30 14:55:09 · 2907 阅读 · 10 评论 -
GZIP压缩原理分析(02)——第二章 背景简介
以下文字摘自《数据压缩导论(第4版)》:“……数据压缩并不只是对数据的处理,它还是找出数据中已有结构的过程……在数据压缩中,首先要为各种数据中的不同结构建立模型,然后利用这些模型(可能还需要最终感知这些数据的一些应用环境),以更紧凑的方式来表示这些数据。这些结构可能是非常简单的图案,只要划出数据的图形就能看到;也可能比较复杂,需要更为抽象的方法才能体会到。信息常常包含在数据的结构中,而不是包含原创 2016-07-30 09:59:32 · 2290 阅读 · 0 评论 -
GZIP压缩原理分析(03)——第三章 gzip文件格式详解(三01) 章前语
网上有人用“算法”来形容gzip,总是gzip算法长、gzip算法短的,其实不然。gzip根本不是一种算法,可以说它是一种压缩工具(software,见《Data Compression – The CompleteReference》 3.23节),或者说它是一种文件格式(file format,见RFC1952开篇),但绝对不是一种算法!!!这里澄清此概念。 我更倾向于将gzip作为一原创 2016-07-30 10:00:23 · 2479 阅读 · 0 评论 -
GZIP压缩原理分析(05)——第三章 gzip文件格式详解(三03) gzip文件尾和文件体
1、文件尾相比gzip文件头,gzip文件尾较简单,只由四个字节构成,0 1 2 3 4 5 6 7+---------+---------+---------+---------+---------+-原创 2016-07-30 10:07:23 · 3299 阅读 · 0 评论 -
GZIP压缩原理分析(07)——第四章 基于gzip的HTTP压缩详解(四01) 章前语
简单来讲,HTTP压缩就是将HTTP应答报文数据部分压缩(所谓数据部分,是用于区分HTTP头的),这对于减小网络带宽来讲有极大的好处。目前大型网站基本都会使用HTTP压缩功能,比如百度、腾讯、新浪等,使用wireshark抓包可以非常直观的看到被压缩的报文。 压缩本身是比较消耗CPU性能的(后续章节分析源码时会有更深的体会,因为压缩要涉及大量的位操作,比较考验CPU的运算能力),对内存的要原创 2016-07-30 10:14:30 · 2725 阅读 · 3 评论 -
GZIP压缩原理分析(08)——第四章 基于gzip的HTTP压缩详解(四02) 原理
经过压缩的HTTP应答报文是由浏览器解压的,用wireshark抓包可以看到客户端主机接收到的HTTP应答报文仍然是压缩的,而且wireshark可以将该HTTP应答解压(是否让wireshark解压是可以设置的,兹不赘述)。比起压缩,解压的速度是非常快的(只要数据正常,可以解压的话),所以不用担心浏览器用于解压的时间会降低用户体验。事实上,浏览器解压消耗的这点时间比起数据包因为网络拥堵而耽误的时原创 2016-07-30 10:15:54 · 3669 阅读 · 1 评论 -
GZIP压缩原理分析(09)——第四章 基于gzip的HTTP压缩详解(四03) 处理细节(关于流压缩的问题)以及本章总结
我们构建负载均衡设备的模型来描述流压缩的问题。模型是这样的:负载均衡设备在服务器前端,客户端访问服务器实际上是访问这个负载均衡设备,由该设备将来自客户端的请求发送给服务器并将服务器回复的应答发送给客户端。HTTP压缩功能就做在这个负载均衡设备上,服务器发送给负载均衡设备的HTTP应答是未经过压缩的明文。由负载均衡设备将明文应答压缩后再将压缩结果发送给客户端。负载均衡设备在压缩明文应答数据原创 2016-07-30 10:18:34 · 2671 阅读 · 1 评论 -
GZIP压缩原理分析(10)——第五章 Deflate算法详解(五01) 章前语
本章不对deflate算法背景做过多介绍,但是对Phil Katz的敬重是永远的!!!这里会用整整一个章节的内容来详细分析第三章中简略提到的“文件体”,也就是gzip压缩中的瓤,或者说虾的身子部分。其实不仅仅是gzip,只要是使用的deflate算法的文件压缩格式,它们的中间部分,即保存实际压缩数据的部分,基本都是一样的,因为deflate本身有自己的格式。本章能够成文,以及我对压缩能够原创 2016-07-30 12:23:54 · 5180 阅读 · 0 评论 -
GZIP压缩原理分析(11)——第五章 Deflate算法详解(五02) 预备知识(01) LZ77算法
词典,分为静态词典与自适应词典两种,而大多数基于自适应词典的技术都源于Jacob Ziv和Abraham Lempel在1977年和1978年发表的两篇里程碑式的论文。这两篇论文提供了两种不同的方法,用于自适应的构建词典,每种方法都衍生出多种变体。人们将基于1977年论文的方法划归LZ77系列,将基于1978年论文的方法划归LZ78系列。第二章链接中的文章对这部分内容的背景以及各种变体有更加详细的原创 2016-07-30 12:25:52 · 2990 阅读 · 0 评论 -
GZIP压缩原理分析(12)——第五章 Deflate算法详解(五03) 预备知识(02) 压缩“窗口”概念
压缩的过程使用了“窗口”这一概念。压缩时,将需要处理的数据拷贝到窗口中,然后直接在窗口中分析并处理这些数据。这个窗口就好比一张工作台,每次把要处理的东西放到这张工作台上,人们站在工作台旁边收拾这些数据,等到快收拾完的时候(还没收拾完!!!),再去库房把后面的数据取到工作台上……基本就是这样一个过程。需要注意的是,窗口的概念是贯穿压缩始终的,真的就像个工作台一样。在源码中,指针window原创 2016-07-30 12:28:24 · 2903 阅读 · 0 评论 -
GZIP压缩原理分析(13)——第五章 Deflate算法详解(五04) 预备知识(03) 游程编码
有关游程编码的定义,在网上有很多较为专业的版本,但我觉得那些较为专业的版本就是把简单的东西搞复杂然后看起来高大上罢了,入门太麻烦。这里我们沿用本章开始提到的那篇博客中的内容:“什么叫游程呢?就是一段完全相同的数的序列。什么叫游程编码呢?说起来原理更简单,就是对一段连续相同的数,记录这个数一次,紧接着记录出现了多少个即可。”,这样说多浅显易懂。举个简单的例子,有如下数列,1,1,1,1,2,2,原创 2016-07-30 12:29:23 · 2934 阅读 · 0 评论 -
GZIP压缩原理分析(14)——第五章 Deflate算法详解(五05) 预备知识(04) 前缀码、原始哈夫曼编码原理以及deflate所用哈夫曼编码的性质
1.前缀码在一个字符集中,任何一个字符的编码都不是另一个字符编码的前缀,即前缀码。例如,有两个码字111与1111,那么这两个码字就不符合前缀码的规则,因为111是1111的前缀。放到二叉树里来讲,只用叶子节点编码的码字才是前缀码,如果同时使用中间节点和叶子节点编码,那结果就不是前缀码。因为压缩中经过编码的码字全部是前缀码,所以在对照码表解压的时候,碰到哪个码字就是哪个码字,不用担心出现某个字原创 2016-07-30 12:30:33 · 4490 阅读 · 3 评论 -
GZIP压缩原理分析(15)——第五章 Deflate算法详解(五06) 预备知识(05) 预备知识总结
这一节我们主要介绍了分析deflate算法所要用到的一些基本知识,这些基本知识非常重要,是分析deflate算法必不可少的,后面的章节已经假定各位看官掌握了这些基本知识,不再介绍这些知识的具体内容。本节内容预先提到了几个deflate算法中的哈夫曼编码会使用到的性质,这些性质非常重要,在这个地方有一个基本认识,后面分析源码的时候才能事半功倍(经验之谈)。关于性质,我做个总结,a) 2n-1与原创 2016-07-30 12:39:09 · 1762 阅读 · 0 评论 -
GZIP压缩原理分析(16)——第五章 Deflate算法详解(五07) 算法分析(01) 本节概述
本节内容,是整个该系列文章的灵魂所在,后面的源码分析不过是肉体罢了。所有使用deflate算法的压缩格式,gzip、PKzip等等,也许他们互相之间的头和尾不同,但是这部分,属于瓤的这部分,是基本相同的。 压缩是分块(block)输出的,即每处理一定数量的数据就将这部分数据的压缩结果输出一次,而不是一口气将全部数据压缩并输出。这一点其实我们在上一节中从哈夫曼编码的角度提到过一次,这里还会继原创 2016-07-30 14:52:53 · 2714 阅读 · 2 评论 -
GZIP压缩原理分析(17)——第五章 Deflate算法详解(五08) 算法分析(02) 格式说明(01) 块首部
以下内容包含我对RFC1951部分内容的翻译与总结,不足之处还请大家指出,小弟感激不尽。在压缩中,哈夫曼编码有两种方式,分别是静态哈夫曼编码(Compression with fixed Huffman codes)和动态哈夫曼编码(Compressionwith dynamic Huffman codes),前者针对不同的字符有一张固定的编码表,压缩的时候直接按照这张码表对原始字符一一原创 2016-07-30 14:53:57 · 4240 阅读 · 2 评论 -
GZIP压缩原理分析(30)——第五章 Deflate算法详解(五21) 动态哈夫曼编码分析(10)构建哈夫曼树(02)
*范式哈夫曼编码使用静态哈夫曼编码的编码/解码双方同时拥有一张完全相同的码表,这张码表是事先规定好的,只要使用这种压缩方式并且使用这种压缩方式对应的静态哈夫曼编码,那么压缩方就照着码表压缩,解码方照着码表直接解压。就好比我们使用莫尔斯码通讯,双方在通讯之前就约定好使用莫尔斯码(什么时候约定的?可能是某次吃饭的时候,或者聊天的时候,或者一起喝酒的时候……),双方都有一张莫尔斯码表,通讯的时候,一原创 2016-07-31 11:08:28 · 3457 阅读 · 3 评论