gzip 与 deflate
新东家还没有报道,就安排先做一个小任务:把 nginx 的 gzip 换成 deflate ,问为什么,老大说能省 18 个字节。 在baidu上搜了好久,搜到的中文基本上都是讲 apache 的 gzip(apache 1.3) 和 deflate(apache 2.x)的配置的,仅有的几个跟 nginx 相关的,也逃不出配置文件的范畴。至于原理,算法等等,只有去 Google 英文资料了。 换了关键词,直接搜 zlib ,终于找到一些有用的东西,在 http://www.cppblog.com/jinq0123/archive/2007/07/09/HttpCompressConv.html 处看到这样一段话: deflate与gzip解压的代码几乎相同,应该可以合成一块代码。 区别仅有: deflate使用inflateInit(),而gzip使用inflateInit2()进行初始化,比 inflateInit()多一个参数: -MAX_WBITS,表示处理raw deflate数据。因为gzip数据中的zlib压缩数据块没有zlib header的两个字节。使用inflateInit2时要求zlib库忽略zlib header。在zlib手册中要求windowBits为8..15,但是实际上其它范围的数据有特殊作用,见zlib.h中的注释,如负数表示raw deflate。 Apache的deflate变种可能也没有zlib header,需要添加假头后处理。即MS的错误deflate (raw deflate).zlib头第1字节一般是0×78, 第2字节与第一字节合起来的双字节应能被31整除,详见rfc1950。例如Firefox的zlib假头为0×7801,python zlib.compress()结果头部为0x789c。 再去检查 zlib.h 中的注释说明,在 zlib-1.2.3/zlib.h Line 500 的地方发现这样一段话: The windowBits parameter is the base two [...]