HTTP傳輸數據壓縮


一、基礎

1、HTTP壓縮是指: Web服務器和瀏覽器之間壓縮傳輸的”文本內容“的方法。 HTTP采用通用的壓縮算法,比如gzip來壓縮HTML,Javascript, CSS文件。 能大大減少網絡傳輸的數據量,提高了用戶顯示網頁的速度。當然,同時會增加一點點服務器的開銷。 本文從HTTP協議的角度,來理解HTTP壓縮這個概念。 

2、HTTP內容編碼和HTTP壓縮的關聯

HTTP壓縮其實是HTTP內容編碼的一種,在HTTP協議中,允許對內容(也就是Body部分)進行編碼,可以采用gzip這樣的編碼。 從而達到壓縮的目的。 也可以使用其他的編碼把內容攪亂或加密,以此來防止未授權的第三方看到文檔的內容,所以HTTP壓縮其實就是HTTP內容編碼的一種,大家不要混淆了兩種概念。

3、HTTP壓縮過程

第一步:瀏覽器發送Http request 給Web服務器,  request 中有Accept-Encoding: gzip, deflate。 (告訴服務器, 瀏覽器支持gzip壓縮)

第二步:Web服務器接到request后, 生成原始的Response, 其中有原始的Content-Type和Content-Length。

第三步:Web服務器通過Gzip,來對Response進行編碼, 編碼后header中有Content-Type和Content-Length(壓縮后的大小), 並且增加了Content-Encoding:gzip.  然后把Response發送給瀏覽器.

第四步:瀏覽器接到Response后,根據Content-Encoding:gzip來對Response 進行解碼。 獲取到原始response后, 然后顯示出網頁.

 

 

4、HTTP壓縮之gzip、deflate壓縮

(1)、什么是gzip

Gzip是一種數據格式,默認且目前僅使用deflate算法壓縮data部分;Gzip是一種流行的文件壓縮算法,現在的應用十分廣泛,尤其是在Linux平台。當應用Gzip壓縮到一個純文本文件時,效果是非常明顯的,大約可以減少70%以上的文件大小。這取決於文件中的內容。 

(2)、gzip的優點

a、利用Apache中的Gzip模塊,我們可以使用Gzip壓縮算法來對Apache服務器發布的網頁內容進行壓縮后再傳輸到客戶端瀏覽器。這樣經過壓縮后實際上降低了網絡傳輸的字節數,最明顯的好處就是可以加快網頁加載的速度。網頁加載速度加快的好處不言而喻,除了節省流量,改善用戶的瀏覽體驗外。

b、另一個潛在的好處是Gzip與搜索引擎的抓取工具有着更好的關系。Google就可以通過直接讀取gzip文件來比普通手工抓取更快地檢索網頁。在Google網站管理員工具(Google Webmaster Tools)中你可以看到,sitemap.xml.gz 是直接作為Sitemap被提交的。 

c、而這些好處並不僅僅限於靜態內容,PHP動態頁面和其他動態生成的內容均可以通過使用Apache壓縮模塊壓縮,加上其他的性能調整機制和相應的服務器端 緩存規則,這可以大大提高網站的性能。因此,對於部署在Linux服務器上的PHP程序,在服務器支持的情況下,我們建議你開啟使用Gzip Web壓縮。

(3)、什么是default

default是同時使用了LZ77算法與哈夫曼編碼(Huffman Coding)的一個無損數據壓縮算法。它最初是由Phil Katz為他的PKZIP歸檔工具第二版所定義的,后來定義在RFC 1951規范中。

人們普遍認為default不受任何專利所制約,並且在LZW(GIF文件格式使用)相關的專利失效之前,這種格式除了在ZIP文件格式中得到應用之外也在gzip壓縮文件以及PNG圖像文件中得到了應用。default壓縮與解壓的源代碼可以在自由、通用的壓縮庫zlib上找到。更高壓縮率的default是7-zip所實現的。AdvanceCOMP也使用這種實現,它可以對gzip、PNG、MNG以及ZIP文件進行壓縮從而得到比zlib更小的文件大小。在Ken Silverman的KZIP與PNGOUT中使用了一種更加高效同時要求更多用戶輸入的default程序。deflate是一種壓縮算法,是huffman編碼的一種加強。 deflate與gzip解壓的代碼幾乎相同,可以合成一塊代碼。

(4)、default與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字節一般是0x78, 第2字節與第一字節合起來的雙字節應能被31整除,詳見rfc1950。例如Firefox的zlib假頭為0x7801,python zlib.compress()結果頭部為0x789c。        

        deflate 是最基礎的算法,gzip 在 deflate 的 raw data 前增加了 10 個字節的 gzheader,尾部添加了 8 個字節的校驗字節(可選 crc32 和 adler32) 和長度標識字節。

        安裝它們的Apache Web服務器版本的差異。Apache 1.x系列沒有內建網頁壓縮技術,所以才去用額外的第三方mod_gzip 模塊來執行壓縮。而Apache 2.x官方在開發的時候,就把網頁壓縮考慮進去,內建了mod_deflate 這個模塊,用以取代mod_gzip。雖然兩者都是使用的Gzip壓縮算法,它們的運作原理是類似的。     

        壓縮質量。mod_deflate 壓縮速度略快而mod_gzip 的壓縮比略高。一般默認情況下,mod_gzip 會比mod_deflate 多出4%~6%的壓縮量。

        對服務器資源的占用。 一般來說mod_gzip 對服務器CPU的占用要高一些。mod_deflate 是專門為確保服務器的性能而使用的一個壓縮模塊,mod_deflate 需要較少的資源來壓縮文件。這意味着在高流量的服務器,使用mod_deflate 可能會比mod_gzip 加載速度更快。即在服務器性能足夠的情況下,使用mod_gzip,雖然會耗費服務器性能,但是值得(壓縮更快更好);在服務器性能不足的情況下,使用mod_deflate 確保性能。 

        從Apache 2.0.45開始,mod_deflate 可使用DeflateCompressionLevel 指令來設置壓縮級別。該指令的值可為1(壓縮速度最快,最低的壓縮質量)至9(最慢的壓縮速度,壓縮率最高)之間的整數,其默認值為6(壓縮速度和壓縮質 量較為平衡的值)。這個簡單的變化更是使得mod_deflate 可以輕松媲美mod_gzip 的壓縮。

 

二、實戰

下面開始講解IIS下的啟用GZIP壓縮,啟用GZIP一共有兩種方式,一種是代碼啟動,另一種是IIS啟動

1、IIS啟動GZIP壓縮

IIS默認並不支持HTTP壓縮,需要進行簡單的配置

第一步:打開Internet信息服務(IIS)管理器,右擊"網站"->"屬性",選擇"服務"。在"HTTP壓縮"框中選中"壓縮應用程序文件"和"壓縮靜態文件",按需要設置"臨時目錄"和"臨時目錄的最大限制"; 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM