Brotli程式庫

Brotli程式庫

Brotli程式庫是一個Jyrki Alakuijala和Zoltán Szabadka開發的開源數據壓縮程式庫。Brotli基於LZ77算法的一個現代變體、霍夫曼編碼和二階上下文建模。 在Chrome、Opera和Firefox中,它已被用於加速全球資訊網的傳輸速度。類似Google的壓縮算法zopfli,brotli這個名字來自瑞士的烘培產品brötli。

簡介

Brotli是一種數據格式規範,用於通過通用LZ77無損壓縮算法,霍夫曼編碼和二階上下文建模的特定組合壓縮的數據流。 Brotli最初是為了減少WOFF2網路字型傳輸的大小而開發的,並且在這種情況下是zopfli開發的延續,zopfli是標準gzip和deflate規範的zlib兼容實現。由於幾種算法和格式級別的改進,Brotli允許比gzip和deflate更密集的打包:使用文本和複製距離的上下文模型,描述通過過去距離的複製距離,在熵代碼選擇中使用移動到前端佇列,聯合文字和複製長度的熵編碼,塊分割中圖形算法的使用以及較大的後向參考視窗是示例改進。 Brotli規範於2015年9月針對HTTP流壓縮(內容編碼類型'br')進行了概括,可用於將Web伺服器傳送的任何數據編碼到Web瀏覽器(如果客戶端和伺服器都支持該格式)。這種廣義疊代還通過使用經常使用的單詞和短語的預定義字典來提高壓縮率。

Brotli規範由Google員工Jyrki Alakuijala和Zoltan Szabadka於2013-2016開發,並伴隨著規範的兩位作者與Evgenii Kliuchnikov和Lode Vandevenne共同開發的參考實現,後者之前開發了谷歌的zopfli在2013年重新實現了收縮/gzip壓縮格式。與zopfli不同,後者是對現有數據格式規範的重新實現,Brotli是一種新的數據格式,並允許作者進一步提高壓縮比。

Brotli設計用於順序處理的數據流(比特流),而不是離散的隨機訪問檔案。這使得Brotli特別適合在通過網路連線傳送數據時進行壓縮。在理想情況下,這會減少傳輸的數據量。然後,壓縮流的傳輸也可以比未壓縮流的情況更快地完成,或者用諸如gzip或deflate的低效流壓縮器壓縮的流完成。雖然gzip和deflate是相對輕量級的壓縮器(即比Brotli更少的處理器和記憶體密集型),並且已經被許多Web伺服器廣泛支持,但Brotli尚未得到廣泛實施。 Brotli壓縮數據格式於2016年7月提交給網際網路工程任務組,並提出置評請求(RFC 7932)。Brotli數據格式是Web Open字型格式第二次疊代的一個組成部分。

雖然谷歌的defop壓縮算法的zopfli實現是以瑞士德語單詞命名的編織甜麵包,字面意思是“小辮子”,但brotli是瑞士德語中的麵包卷,字面意思是“小麵包”。Google自己實施的Brotli規範是在2016年許可的免費軟體MIT許可條款下發布的.Barkl規範的正式驗證由Mark Adler獨立實施zlib / gzip壓縮格式和庫的共同作者之一。 Adler的實施是根據類似允許的Apache許可條款發布的。當然還存在規範的其他實現,包括源到源haxe語言中的一個。

Brotli於2013年首次發布用於網路字型的離線壓縮。Google軟體工程師於2015年9月發布的Brotli版本包含了通用無損數據壓縮的增強功能,特彆強調了HTTP壓縮的使用。編碼器被部分重寫,結果是壓縮比得到改善,編碼器和解碼器都得到了加速,流API得到了改進,增加了更多的壓縮質量水平。此外,新版本顯示了跨平台的性能改進,解碼記憶體減少。

與大多數通用壓縮算法不同,除了動態填充(“滑動視窗”)字典之外,Brotli還使用預定義的120千位元組字典。預定義的字典包含超過13000個常用單詞,短語和其他從大型文本和HTML文檔派生的子字元串。[6] [2]使用預定義的字典已被證明可以增加壓縮,其中檔案主要包含常用詞。

Brotli的解碼記憶體使用限制為16 MB。這使得能夠在資源有限的行動電話上進行解碼,但是使得Brotli在具有更大檔案的壓縮基準測試中表現不佳。可以通過使用與RFC7932(“常規”Brotli)不兼容的Large Window Brotli來規避解碼存儲器約束。

在最高壓縮設定下,Brotli可以比Zstandard更加密集地壓縮Web內容,儘管速度明顯較慢。

用Brotli壓縮的流具有內容編碼類型“br”。

工業支持

瀏覽器支持

自第50版(2016年4月20日發布)以來,谷歌瀏覽器一直支持'br'內容編碼方法。

自版本15(2017年4月5日發布)以來,Microsoft Edge一直支持'br'內容編碼方法。

Mozilla Firefox在44版(2016年1月26日發布)中引入了對'br'內容編碼方法的支持。

自版本38(2016年6月8日發布)以來,Opera一直支持'br'內容編碼方法。

自版本11(2017年10月5日發布)以來,Safari一直支持'br'內容編碼方法。

Web伺服器支持

對於Apache HTTP Server,自2.4.2版本以來,mod_brotli模組一直支持'br'內容編碼方法。

自2016年3月起,Microsoft IIS具有IIS brotli社區擴展,增加了對“br”內容編碼方法的支持。

nginx自2016年12月起擁有由Google提供的ngx_brotli模組。

Node.js有一個名為shrink-ray的社區模組,它增加了對'br'內容編碼方法的支持。

自2017年7月版本5.2以來,LiteSpeed Web Server僅包含靜態檔案的'br'內容編碼方法。

OpenLiteSpeed首次在版本1.4.27中引入了靜態檔案的'br'內容編碼方法,作為Web伺服器的一部分。

Cloudflare CDN提供了一個brotli選項,用於在其邊緣節點和用戶之間壓縮數據。

支持其他軟體

從2017年11月29日發布的版本7.57開始,可以使用可選的基於libbrotli的“br”內容編碼方法對cURL進行編譯。

Brotli 進行Web Server的壓縮

我們大多數網站都是啟用的 gzip 來進行 資源傳輸的壓縮,這有利於我們更加快速的訪問我們的網站;但是除了 gzip 外,我們或許還有別的選項,而且性能會更好,比如 Facebook 便是啟用的 Brotli 算法;

Brotli最初發布於2015年,用於網路字型的離線壓縮。Google軟體工程師在2015年9月發布了包含通用無損數據壓縮的Brotli增強版本,特別側重於HTTP壓縮。新版本還展現了跨平台的性能改進,以及減少解碼所需的記憶體。

與常見的通用壓縮算法不同,Brotli使用一個預定義的120千位元組字典。該字典包含超過13000個常用單詞、短語和其他子字元串,這些來自一個文本和HTML文檔的大型語料庫。預定義的算法可以提升較小檔案的壓縮密度。

對全球1000個訪問量比較大的地址進行測試,使用 Brotli 算法可以得到明顯的性能改善:

•14%smaller than gzip for JavaScript

•*21% *smaller than gzip for HTML

•*17% *smaller than gzip for CSS

使用brotli取代deflate來對文本檔案壓縮通常可以增加20%的壓縮密度,而壓縮與解壓縮速度則大致不變。

當然如同 HTTP2, 我們還需要考慮瀏覽器的兼容性。

因此我們在設計自己程式還需要考慮到對於不支持 Brotli 壓縮的進行 gzip 的降級處理;

ngx_brotli 配置有如下指令:

•brotli 是否啟用 Brotli on 為開啟 off 為關閉

•brotli_types 允許的壓縮 mime 類型比如 text/css, text/javascript

•brotlicomplevel 壓縮級別 可選值範圍為0~11,默認值為6

配置參考

改完之後可以記得 重啟 nginx 查看 header 頭是不是有這樣的值:

Node.js 中使用

以 egg.js 中間件為案例。

記得在配置中啟用這箇中間件。

brotli 壓縮只能在 https 中生效,因為 在 http 請求中 request header 里的 Accept-Encoding: gzip, deflate 是沒有 br 的。

相關詞條

相關搜尋

熱門詞條

聯絡我們