【整理】HTTP 協議中的壓縮問題

      公司因業務須要,要求實現 REST API 的 HTTP 客戶端支持 gzip 壓縮。那麼首先須要回答下面幾個問題:
  1. gzip 壓縮和其餘壓縮方式有什麼不一樣?或者說優劣在哪裏? 
  2. HTTP 協議中對壓縮方式的常規支持有哪些? 
=========== 我是分割線 ============

查閱相關資料以下:


      LZ77 是一種基於字典的無損數據壓縮算法(還有 LZ78, LZW 等)。
      deflate 是一種數據壓縮算法,實際上就是先用 LZ77 壓縮,而後用霍夫曼編碼壓縮。
      gzip 的基礎是 defalte 。其經過 defalte 算法壓縮數據,而後加上 gzip 文件頭和 CRC 校驗。壓縮後生成 .tar.gz 或者 .tgz 文件。既是一種文件結構,也能夠算一種壓縮格式。
      ZIP 也使用 defalte 算法,但可移植性更好,而且不須要一個外部的歸檔工具就能夠包容多個文件。可是因爲 ZIP 對每一個文件進行單獨壓縮而沒有利用文件間的冗餘信息(固實壓縮),因此 ZIP 的壓縮率要稍遜於 tar 壓縮包。
      zlib 是一個提供了 deflate, zlib, gzip 壓縮方法的函數庫;同時也是一種壓縮格式,能夠經過 deflate 壓縮數據,以後加上 zlib 頭和 CRC 校驗來生成 zlib 文件格式。
      bzip2一個基於數據塊排序算法的文件壓縮工具,並做爲 gzip 的替代者逐漸獲得流行,它能夠生成至關小的壓縮文件,尤爲是對於源代碼以及其它的結構化文原本說更是這樣,可是這樣作的代價是最高達 4倍內存與處理器時間消耗。bzip2 壓縮的 tar 包傳統上叫做 .tar.bz2 。

      zlib 數據流格式、defalte 以及 gzip 文件格式均已被標準化成了,分別是 RFC 1950、RFC 1951 以及 RFC 1952。

=========== 我是分割線 ============ 
HTTP/1.1 協議容許客戶端能夠選擇要求從服務器下載壓縮內容,這個標準自己定義了三種壓縮方法: 算法

  1. 「gzip」(內容用 gzip 數據流進行封裝)
  2. 「compress」(內容用 compress 數據流進行封裝)
  3. 「deflate」(內容是原始格式、沒有數據頭的 DEFLATE 數據流)
許多 HTTP 客戶端庫以及絕大多數現代的瀏覽器都支持先後兩種格式。

=========== 我是分割線 ============  
Web 壓縮相關技術以下:
  • HTTP 壓縮:壓縮來自 Web 服務器的內容
  • Gzip 壓縮: 一種無損失的數據壓縮格式
  • 靜態壓縮:預壓縮,用於發送靜態頁面
  • 內容及傳輸編碼:IETF 用於壓縮 HTTP 內容的兩級標準

HTTP 壓縮

      HTTP 壓縮是一種用於壓縮來自 Web 服務器(HTTP 服務器)的內容的技術。Web 服務器內容的格式能夠是諸多 MIME 類型中的一種:HTML、純文本、圖像格式、PDF 文件等。其中 HTML 和圖像格式是在 Web 應用程序中最經常使用的 MIME 格式。

      Web 應用程序中使用的大多數圖像(例如 GIF 和 JPG)已是壓縮過的格式,無需進一步壓縮;即便再壓縮,性能也不會有大的改善。然而,靜態或動態建立的 HTML 內容只包含純文本,適合進行壓縮。

HTTP 壓縮的目的是使 Web 站點發送更少的數據。要有效實地現這個目的,須要如下條件:
  • Web 服務器應該可以壓縮數據
  • 瀏覽器應能解壓縮數據並以正常的方式顯示頁面
這是很明顯的。固然,壓縮和解壓縮的處理不該消耗大量的時間或資源。


Gzip 壓縮

       Gzip 是一種無損失的數據壓縮格式。所使用的算法是開源、無專利的 LZ77(Lempel-Ziv 1977)算法的變體。 該算法尋找輸入數據內的重複字符串。二次出現的字符串由一個指向前一字符串的指針代替。

靜態壓縮

      若是 Web 內容是預生成的而且不須要與其餘系統進行服務器端動態交互,那麼內容就能夠被預壓縮並放置在 Web 服務器內。而這些壓縮了的頁面則在用戶請求時被髮送。流行的壓縮工具(gzip、Unix compress)都可壓縮這些靜態文件。
      可是,當內容必須動態生成,好比對於電子商務站點或由應用程序和數據庫驅動的站點,靜態壓縮沒有什麼用處。


內容和傳輸編碼

      IETF 用來壓縮 HTTP 內容的標準包括兩級編碼:內容編碼 和 傳輸編碼 。
      內容編碼 是指在 Web 用戶請求文檔以前就已經應用到這些文檔的編碼和壓縮方法。這也被稱爲預壓縮 或靜態壓縮。因爲存在複雜的文件維護負擔,這個概念歷來沒有獲得真正的重視,並且使用預壓縮頁面的站點也不多。

      傳輸編碼 是指實際數據傳輸過程當中的編碼方法。
相關文章
相關標籤/搜索