7.2.1 減少請求帶寬

- 使用高效的數據交換格式 - 為客戶端與服務器之間傳輸的數據選擇高效的編碼.

- 在可能的情況下使用預先壓縮的數據 - 使用專用算法對諸如音頻、視頻和圖像進行壓縮或按比較縮放以適應通道與設備

- 壓縮每一個請求與響應負載 - 壓縮文本負載以減少帶寬, 同時又不太影響服務器與客戶端代碼

實際上, 可以通過壓縮服務器響應或是客戶端請求為非媒體負載開啟負載壓縮.

壓縮模式與 JSON 與 XML

1. 響應壓縮

響應負載壓縮是最簡單的一種 HTTP 負載壓縮形式. HTTP 響應由返回給客戶端的用于響應上一個 HTTP 請求的響應頭與響應體構成. 響應壓縮會對響應體應用數據壓縮算法, 但不會操縱 HTTP 頭

在 iOS HTTP 負載中, 默認情況下, 所有的 HTTP NSURLConnection 請求都是開啟壓縮的. 接收到的負載會自動解壓縮并以最初的格式呈現在代碼中. 解壓縮的計算代碼要比傳輸 10 倍字節的通信代價低; 因此, 激活響應壓縮幾乎總是有益無害的

在默認請況下, NSURLConnection 會向每個請求添加好下 HTTP 頭:

Accept-Encoding: gzip, deflate

Accept-Encoding 頭告訴服務器, 客戶端可以接收使用 gzip 或 DEFLATE 壓縮的負載, 不過服務器可以自己選擇是否壓縮響應. 這樣, 通過響應負載壓縮來提升性能的關鍵就在于配置服務器以支持壓縮

有些瀏覽器無法正確處理 DEFLATE 壓縮, 因此最常用的壓縮其實是 gzip

比如, 配置 Apache Web 服務器的過程涉及加載壓縮模塊并針對特定的文檔類型激活輸出過濾器
LoadModulefilter_module library-path/mod_filter.so
LoadModuledeflate_module library-path/mod_deflate.so

library-path 的值會根據 Apache 的安裝位置而發生變化

filter_module 是個常用的模塊, 并且可能已經被加載了. deflate_module 則不太常用, 不過也是 Linux、OSX 與 Windows 上標準 Apache 安裝的組成部分

deflate_module 支持的是 gzip 而非 DEFLATE 壓縮

為那些能夠從壓縮中獲益的內容類型添加輸出過濾器(非圖片、音頻和視頻)

添加壓縮類型

禁用負載壓縮, 可以通過清除自動設定的 Accept-Encoding 頭來實現


清除 Accept-Encoding

對請求的響應不會再被服務器壓縮. 響應壓縮是優化應用網絡帶寬使用的一種簡單手段, 只需要對服務層做很小的修改即可實現

2. 請求壓縮

與響應壓縮不同, 請求壓縮的實現更為復雜, 因為它既需要客戶端與服務端的協調實現.?

模式一:?
iOS 應用首先查詢服務器來判斷是否支持壓縮, 然后根據服務器的響應來調整其行為

請求壓縮會為移動應用帶來很大的好處, 因為廣域無線傳輸速率是非對稱的, 為發送給設備的數據提供了更大的帶寬, 而對設備發出的數據則提供了很小的帶寬. 之所以使用這種非對稱的帶寬, 原因在于大多數 Web 流量都是非對稱的. 如果應用定義了標準的非對稱模式, 那么你絕對應該考慮使用請求壓縮. 比如, 如果應用上傳到服務器, 那么應用就會通過上傳負載的壓縮而獲益(傳輸到服務器以及回傳給設備時就會消耗 80KB 的帶寬, 在請求與響應開啟了壓縮, 那么同樣一次往返, 數據只會消耗 12KB 的帶寬)

要想創建請求壓縮, 首先需要在 Web 服務器上定義好輸入過濾器

Apache 并不會在通過 PHP 或 mod_jk 模塊等資源過濾器發送數據前對其解壓縮, 因此, 如果通過資源過濾器向 Web 應用傳遞了壓縮數據, 那么目標 Web 應用就要負責負載的解壓縮

與響應壓縮一樣, 客戶端應用不應該將 CPU 時間浪費在壓縮諸如 PDF、加密數據、圖像、音頻及視頻等已經壓縮的內容上. 然而, 代表預先壓縮的數據的 Base64 數據常常會從請求壓縮中獲益, 比如, 如果要以 Base64 格式上傳 JPEG 文件, 那么可以對 Base64 數據進行壓縮, 相較于未壓縮的 Base64 數據, 壓縮后的數據體積會降低 30% 左右

在 Apache 中, 用于響應壓縮的模塊也可以執行請求壓縮. 如下配置片段會加載所需模塊:

配置所需模塊

接下來需要為 DEFLATE 模塊定義輸入過濾器

定義一個輸入過濾器和一個 CGI 別名

如果帶有 Content-Encoding:gzip 頭的請求到達 HTTP 服務器, HTTP 服務器就會嘗試解壓縮請求體并將其傳給過濾器鏈中的下一個過濾器. 出于說明的目的, 這個示例請求壓縮應用帶有一段簡單的 Perl腳本, 它會將接收到的響應體負載回顯出來, 腳本并不關心接收到的負載是不是壓縮過的

Perl腳本: 將接收到的響應體負載回顯出來

接下來, 為 iOS 應用添加壓縮代碼. 需要壓縮負載并向請求添加 Content-Encoding 頭. 示例壓縮代碼使用了 libz.dylib 框架, 這需要項目在編譯任何壓縮代碼前行先鏈接到該框架


壓縮 HTTP 請求體的方法


Content-Encoding 頭添加到請求中的代碼

示例應用實現了壓縮并提供了一種方式以執行多個請求(包含了針對你所選擇的 URL 的示例負載). 除了請求所消耗的平均時間與總時間外, 還會顯示出負載的大小. 時間包含了計算出的壓縮所需的時間. ?

圖 7-4: 通過 Network Link Conditioner 工具計算的請求與響應壓縮的時間變化

通過 DSL 可以看到收益, 因為 DSL 連接對于上下游的速率來說通常是非對稱的. 值得注意的是, 在 Edge 網絡上要 10 秒鐘才能完成的請求, 如果對請求和響應進行了壓縮, 處理時間會降到 3 秒以下

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,775評論 18 139
  • 【摘要】 面對大量用戶訪問、高并發請求,海量數據,可以使用高性能的服務器、大型數據庫,存儲設備,高性能Web服務器...
    靜修佛緣閱讀 4,580評論 0 24
  • 試想一下,一個科班出身,擁有豐富開發經驗的程序員對于HTTP協議卻不甚了解?還是很尷尬的!這么一個可以說是常識的問...
    一個人在路上走下去閱讀 91,927評論 18 189
  • 開學伊始,我們師生之間是陌生的。 孩子們開啟了人生一段新的旅程,種種不適應是一定的,但是每個人的性格、特點、經歷不...
    我是張老師閱讀 803評論 0 8
  • 姓名:崔麗麗 日精進打卡第二天 【打卡始于2017.10.18持續于2017.10.19】 【知~學習】 ...
    小紫茉莉閱讀 143評論 0 0