Gzip 是什么
Gzip 是一種用于數(shù)據(jù)壓縮的編碼格式,經(jīng)常被使用在基于 HTTP 協(xié)議的網(wǎng)絡(luò)傳輸中。Gzip 功能允許服務(wù)器在傳輸數(shù)據(jù)是對(duì)其進(jìn)行壓縮,從而減小傳輸?shù)臄?shù)據(jù)量,加快頁面加載速度,這對(duì)于節(jié)省帶寬和提高用戶體驗(yàn)非常有用。本文將從 Gzip 使用場(chǎng)景、Gzip 原理、Gzip 在 nginx 中的應(yīng)用以及華為云 API網(wǎng)關(guān)的 Gzip 功能實(shí)現(xiàn)幾個(gè)方面介紹 Gzip。
Gzip 使用場(chǎng)景
Gzip 能夠提升傳輸速度和降低帶寬消耗,因此適合應(yīng)用 Gzip 的場(chǎng)景有很多。
網(wǎng)頁傳輸:在 web 開發(fā)中,使用 Gzip 可以減小文件大小,從而加快頁面加載速度。
移動(dòng)應(yīng)用通信:在移動(dòng)應(yīng)用中,使用 Gzip 可以降低移動(dòng)網(wǎng)絡(luò)的數(shù)據(jù)消耗,加快數(shù)據(jù)傳輸速度,提升用戶體驗(yàn)。
文件備份和傳輸:在進(jìn)行文件備份或者文件傳輸時(shí),使用 Gzip 可以減小備份文件的大小,節(jié)省存儲(chǔ)空間和傳輸帶寬。
網(wǎng)絡(luò)傳輸限制:在網(wǎng)絡(luò)帶寬受限的環(huán)境下,使用Gzip可以減小數(shù)據(jù)傳輸量,提升網(wǎng)絡(luò)性能。
API 通信:對(duì)于RESTfulAPI或其他數(shù)據(jù)接口的傳輸,使用Gzip可以降低傳輸?shù)臄?shù)據(jù)量,減少對(duì)網(wǎng)絡(luò)帶寬的占用,提升響應(yīng)速度。
Gzip 原理
gzip 使用 deflate 算法進(jìn)行壓縮。其原理主要包括 LZ77 算法以及 Huffman 編碼(哈夫曼編碼)。
LZ77 算法
LZ77 算法是將重復(fù)字符串替換為長(zhǎng)度距離對(duì)來達(dá)到壓縮的目的。長(zhǎng)度是重復(fù)字符串的長(zhǎng)度,距離是重復(fù)字符串與第一個(gè)出現(xiàn)該字符串的距離,下圖是一個(gè)簡(jiǎn)單的示例:
在 LZ77 算法中,主要運(yùn)用了基于滑動(dòng)窗口的字典壓縮算法。首先是滑動(dòng)窗口:
以上圖為例,一開始,查找區(qū)是沒有字符的。滑動(dòng)窗口從 K 開始移動(dòng),依次在查找區(qū)嘗試查找當(dāng)前指向字符及之后字符的最長(zhǎng)匹配,直到滑動(dòng)窗口區(qū)不再有字符為止。這里就涉及到另外一個(gè)問題了,如何在查找區(qū)中快速的找到與滑動(dòng)窗口中匹配的字符,LZ77 顯然不會(huì)采取暴力遍歷查找的方法,通常使用哈希數(shù)組來實(shí)現(xiàn)字典的快速搜索。在哈希數(shù)組中有兩個(gè)數(shù)組,一個(gè)數(shù)組用來存放最新重復(fù)字符串的哈希地址,一個(gè)數(shù)組用來解決哈希沖突。具體以下圖為例進(jìn)行說明:
當(dāng)?shù)谝淮螔呙?ABC 時(shí),對(duì)應(yīng)數(shù)組 1 中 4 號(hào)位置為空,因此不用轉(zhuǎn)化為長(zhǎng)度距離對(duì)。當(dāng)?shù)诙螔呙璧?ABC 時(shí),對(duì)應(yīng)數(shù)組 1 中 4 號(hào)位置存放的是 1,于是將 4 號(hào)位置替換為 6,再將 1 放置在數(shù)組 2 中的 6 號(hào)位置,此時(shí)數(shù)組 2 的 6 號(hào)位置存放的是 1,對(duì)當(dāng)前字符串后的字符繼續(xù)和 1 位置對(duì)應(yīng)字符后的字符繼續(xù)進(jìn)行匹配,記錄最長(zhǎng)匹配字符長(zhǎng)度。然后在數(shù)組 2 中查找 1 號(hào)位置,如果為空則結(jié)束匹配,最后將匹配到的最長(zhǎng)字符替換為長(zhǎng)度距離對(duì)。
Huffman 編碼
Huffman 編碼的原理是基于哈夫曼樹。哈夫曼樹是一種最優(yōu)二叉樹,是一種帶權(quán)路徑長(zhǎng)度最短的二叉樹。
以下是哈夫曼樹的構(gòu)造過程:
假設(shè)有 A、B、C、D、E 五個(gè)字母,他們對(duì)應(yīng)出現(xiàn)的次數(shù)分別為 5,6,8,12,20
構(gòu)造哈夫曼樹的基本流程:將 A、B、C、D、E 看作是只有一個(gè)結(jié)點(diǎn)的樹,其中出現(xiàn)的次數(shù)作為他們的權(quán)值。將權(quán)值和最小的兩個(gè)數(shù)進(jìn)行合并稱為一個(gè)新樹,權(quán)值較小的樹作為左子樹,權(quán)值較大的樹作為右子樹,新樹的根結(jié)點(diǎn)權(quán)值為兩子樹之和,然后將新樹也加入到樹的集合中,重復(fù)上述流程知道又有一棵樹為止。
針對(duì)哈夫曼樹編碼,左分支為 0,右分支為 1??傻贸?A、B、C、D、E 的編碼如下:
從最后的編碼來看,出現(xiàn)次數(shù)最多的 E 的編碼長(zhǎng)度比出現(xiàn)次數(shù)較少的 A 或 B 要少。最終頻率高的字符會(huì)使用較短的編碼,頻率低的字符會(huì)使用較長(zhǎng)的編碼,總體的編碼長(zhǎng)度就會(huì)變小,從而達(dá)到壓縮的結(jié)果。
Gzip 在 Nginx 中的應(yīng)用
Nginx 作為當(dāng)下很流行的開源網(wǎng)頁服務(wù)器和反向代理服務(wù)器,原生支持了 Gzip 的功能。但是在 Nginx 中 Gzip 功能默認(rèn)是不開啟,需要在配置文件中配置相關(guān)指令才可以開啟 Gzip 功能。常見的配置項(xiàng)如下:
華為云 API網(wǎng)關(guān)的 Gzip 功能
華為云API網(wǎng)關(guān)(APIG)為企業(yè)和開發(fā)者提供的高性能、高可用、高安全的云原生網(wǎng)關(guān)服務(wù),融合安全、負(fù)載均衡、流量入口治理、微服務(wù)流量治理、運(yùn)維等多項(xiàng)能力,也支持 Gzip 壓縮功能。用戶可以通過一鍵式開關(guān)控制 Gzip 功能的開啟。同時(shí) APIG 還開放了壓縮等級(jí),用戶可以通過配置不同的壓縮等級(jí),根據(jù)自己的需求對(duì) Gzip 功能進(jìn)行性能調(diào)優(yōu)。當(dāng)一個(gè)客戶端發(fā)送一個(gè) HTTP 請(qǐng)求時(shí),需要包含一個(gè) Accept-Encoding 頭部用來指示客戶端支持的壓縮算法。
APIG 會(huì)根據(jù) GZIP 開關(guān)來判斷是否進(jìn)行壓縮。在開關(guān)開啟的狀態(tài)下,APIG 會(huì)將響應(yīng)內(nèi)容壓縮,然后將壓縮后的響應(yīng)發(fā)送給客戶端(如果客戶端已經(jīng)進(jìn)行 Gzip 壓縮,那么 APIG 將不會(huì)進(jìn)行二次壓縮)??蛻舳耸盏巾憫?yīng)后,會(huì)根據(jù)響應(yīng)頭部的 Content-Encoding 字段判斷是否經(jīng)過了壓縮。如果響應(yīng)被壓縮了,客戶端會(huì)進(jìn)行解壓縮,以獲取原始的內(nèi)容。
可以參考以下步驟打開 Gzip 開關(guān)及設(shè)置壓縮等級(jí):
打開華為云 APIG 控制臺(tái),依次進(jìn)入實(shí)例管理-->配置參數(shù),在頁面列表中找到參數(shù) gzip 如下:
如上圖,gzip 功能為開啟狀態(tài),且壓縮等級(jí)為 6。
此外,APIG 還提供了 Debug 功能用以調(diào)試 Gzip 功能。首先依次打開 API 列表,然后點(diǎn)擊創(chuàng)建 API。
在填寫好 API 詳細(xì)信息后,在后端配置選項(xiàng)頁面選擇 Mock 后端,并且增加 header 參數(shù)-content-length(參數(shù)值需要大于等于 1028,否則 gzip 功能將不生效。)
然后進(jìn)入 API 的調(diào)試界面,在 Headers 中添加參數(shù):Accept-Encoding,對(duì)應(yīng)參數(shù)值為 gzip。在響應(yīng)結(jié)果中,如果有 Content-Encoding:gzip出現(xiàn),即代表 Gzip 功能生效。
Gzip 自首次發(fā)布以來,已經(jīng)成為互聯(lián)網(wǎng)上常用的壓縮格式之一。各種高性能的開源代理如 Nginx、Envoy 等都原生支持 Gzip 的功能。在傳輸速度和降低帶寬消耗方面,Gzip 有著十分強(qiáng)大的優(yōu)勢(shì),希望本文能幫助到想要了解 Gzip 背后原理及其應(yīng)用的人。
另外,如果你有更多關(guān)于華為云產(chǎn)品的疑問,可掃碼添加華為云專家的聯(lián)系方式,咨詢相關(guān)問題。
審核編輯 黃宇
-
網(wǎng)關(guān)
+關(guān)注
關(guān)注
9文章
4199瀏覽量
50776 -
API
+關(guān)注
關(guān)注
2文章
1468瀏覽量
61693 -
華為云
+關(guān)注
關(guān)注
3文章
2387瀏覽量
17207
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論