gzip 是什么
gzip 是一种用于数据压缩的编码格式,经常被使用在基于 http 协议的网络传输中。gzip 功能允许服务器在传输数据是对其进行压缩,从而减小传输的数据量,加快页面加载速度,这对于节省带宽和提高用户体验非常有用。本文将从 gzip 使用场景、gzip 原理、gzip 在 nginx 中的应用以及华为云 api 网关的 gzip 功能实现几个方面介绍 gzip。
gzip 使用场景
gzip 能够提升传输速度和降低带宽消耗,因此适合应用 gzip 的场景有很多。
网页传输:在 web 开发中,使用 gzip 可以减小文件大小,从而加快页面加载速度。
移动应用通信:在移动应用中,使用 gzip 可以降低移动网络的数据消耗,加快数据传输速度,提升用户体验。
文件备份和传输:在进行文件备份或者文件传输时,使用 gzip 可以减小备份文件的大小,节省存储空间和传输带宽。
网络传输限制:在网络带宽受限的环境下,使用 gzip 可以减小数据传输量,提升网络性能。
api 通信:对于 restful api 或其他数据接口的传输,使用 gzip 可以降低传输的数据量,减少对网络带宽的占用,提升响应速度。
gzip 原理
gzip 使用 deflate 算法进行压缩。其原理主要包括 lz77 算法以及 huffman 编码(哈夫曼编码)。
lz77 算法
lz77 算法是将重复字符串替换为长度距离对来达到压缩的目的。长度是重复字符串的长度,距离是重复字符串与第一个出现该字符串的距离,下图是一个简单的示例:
在 lz77 算法中,主要运用了基于滑动窗口的字典压缩算法。首先是滑动窗口:
以上图为例,一开始,查找区是没有字符的。滑动窗口从 k 开始移动,依次在查找区尝试查找当前指向字符及之后字符的最长匹配,直到滑动窗口区不再有字符为止。这里就涉及到另外一个问题了,如何在查找区中快速的找到与滑动窗口中匹配的字符,lz77 显然不会采取暴力遍历查找的方法,通常使用哈希数组来实现字典的快速搜索。在哈希数组中有两个数组,一个数组用来存放最新重复字符串的哈希地址,一个数组用来解决哈希冲突。具体以下图为例进行说明:
当第一次扫描 abc 时,对应数组 1 中 4 号位置为空,因此不用转化为长度距离对。当第二次扫描到 abc 时,对应数组 1 中 4 号位置存放的是 1,于是将 4 号位置替换为 6,再将 1 放置在数组 2 中的 6 号位置,此时数组 2 的 6 号位置存放的是 1,对当前字符串后的字符继续和 1 位置对应字符后的字符继续进行匹配,记录最长匹配字符长度。然后在数组 2 中查找 1 号位置,如果为空则结束匹配,最后将匹配到的最长字符替换为长度距离对。
huffman 编码
huffman 编码的原理是基于哈夫曼树。哈夫曼树是一种最优二叉树,是一种带权路径长度最短的二叉树。
以下是哈夫曼树的构造过程:
假设有 a、b、c、d、e 五个字母,他们对应出现的次数分别为 5,6,8,12,20
构造哈夫曼树的基本流程:将 a、b、c、d、e 看作是只有一个结点的树,其中出现的次数作为他们的权值。将权值和最小的两个数进行合并称为一个新树,权值较小的树作为左子树,权值较大的树作为右子树,新树的根结点权值为两子树之和,然后将新树也加入到树的集合中,重复上述流程知道又有一棵树为止。
针对哈夫曼树编码, 左分支为 0,右分支为 1。可得出 a、b、c、d、e 的编码如下:
从最后的编码来看,出现次数最多的 e 的编码长度比出现次数较少的 a 或 b 要少。最终频率高的字符会使用较短的编码,频率低的字符会使用较长的编码,总体的编码长度就会变小,从而达到压缩的结果。
gzip 在 nginx 中的应用
nginx 作为当下很流行的开源网页服务器和反向代理服务器,原生支持了 gzip 的功能。但是在 nginx 中 gzip 功能默认是不开启,需要在配置文件中配置相关指令才可以开启 gzip 功能。常见的配置项如下:
华为云 api 网关的 gzip 功能
华为云 api 网关(apig)为企业和开发者提供的高性能、高可用、高安全的云原生网关服务,融合安全、负载均衡、流量入口治理、微服务流量治理、运维等多项能力,也支持 gzip 压缩功能。用户可以通过一键式开关控制 gzip 功能的开启。同时 apig 还开放了压缩等级,用户可以通过配置不同的压缩等级,根据自己的需求对 gzip 功能进行性能调优。当一个客户端发送一个 http 请求时,需要包含一个 accept-encoding 头部用来指示客户端支持的压缩算法。
apig 会根据 gzip 开关来判断是否进行压缩。在开关开启的状态下,apig 会将响应内容压缩,然后将压缩后的响应发送给客户端(如果客户端已经进行 gzip 压缩,那么 apig 将不会进行二次压缩)。客户端收到响应后,会根据响应头部的 content-encoding 字段判断是否经过了压缩。如果响应被压缩了,客户端会进行解压缩,以获取原始的内容。
可以参考以下步骤打开 gzip 开关及设置压缩等级:
打开华为云 apig 控制台,依次进入实例管理-->配置参数,在页面列表中找到参数 gzip 如下:
如上图,gzip 功能为开启状态,且压缩等级为 6。
此外,apig 还提供了 debug 功能用以调试 gzip 功能。首先依次打开 api 列表, 然后点击创建 api。
在填写好 api 详细信息后,在后端配置选项页面选择 mock 后端,并且增加 header 参数-content-length(参数值需要大于等于 1028, 否则 gzip 功能将不生效。)
然后进入 api 的调试界面,在 headers 中添加参数:accept-encoding,对应参数值为 gzip。在响应结果中,如果有 content-encoding: gzip 出现,即代表 gzip 功能生效。
gzip 自首次发布以来,已经成为互联网上常用的压缩格式之一。各种高性能的开源代理如 nginx、envoy 等都原生支持 gzip 的功能。在传输速度和降低带宽消耗方面,gzip 有着十分强大的优势,希望本文能帮助到想要了解 gzip 背后原理及其应用的人。
另外,如果你有更多关于华为云产品的疑问,可扫码添加华为云专家的联系方式,咨询相关问题。
西门子S-1500 OPC UA服务器配置方法图解
中国人工智能技术区域布局和应用领域
影像识别扫描厂商广州优库电子有限公司创业历程
100W音频放大器电路 (100 W Audio Ampli
多屏显示卡的显示器要求
深入浅出了解华为云 API 网关的 Gzip 功能
美光断供,机台设备成了美国禁止令下的最后一项“致命武器”
NAND加速边缘计算场景化落地
网络设备市场份额逐步扩大 菲菱科思等内资企业迎来发展良机
5G是如何加快智能家居的发展的
两只PNP晶体三极管和四个电阻组成恒流源电路
松下开发两种新型锂离子电池
回顾苹果自研芯片的历史进程
建立系统滴答率所涉及的基本权衡
什么无线蓝牙耳机好?音质好性价比高的蓝牙耳机
智能家居镜面显示屏轻松打造智能家居新生活
nb-iot芯片有哪些厂家?nb-iot芯片特点
物通博联数据采集智能网关介绍
RFID室内人员定位—RFID室内定位技术原理浅析
金升阳推出有源高精度单电源输入、正负电源输出型信号调理模块