# HTTPS, SPDY和 HTTP/2性能的簡單對比
Firefox 35這周發布了,成為第一個默認開啟支持HTTP/2協議的瀏覽器。Chrome也支持了,只是以SPDY 4的名義,并且要自己在about://flags里面手動開啟。
不過HTTP/2規范還沒有最終完成,所以Firefox實際上支持的是HTTP/2第14版草案,這個版本的草案離最終發布可能不會有大改動了。Google現在在其服務器上同時支持了HTTP/2的第14草案和SPDY協議,這就給我們了一個基于同一個網頁來對比HTTPS, SPDY和 HTTP/2的性能的機會。
HttpWatch 也更新了,從而可以在Firefox里面監控HTTP/2了,它現在有一列專門顯示每個請求所使用的協議了:
### 性能對比
這組性能測試是使用Firefox和HttpWatch,測試頁面為Google英國首頁,使用了三種協議:
- 原始的HTTPS
- SPDY/3.1
- HTTP/2
每次測試都是基于空緩存的。所以即便這個測試很簡單并且只基于一個網站,但其結果還是具有代表性的。
### 測試#1:請求和響應報頭的大小
大部分網站在下載文本內容的時候已經啟用了壓縮(Gzip),因為它可以提供很明顯的性能優勢。但是很不幸,HTTP/1.1不支持壓縮每個請求和相應的HTTP報頭。SPDY和后來的HTTP/2旨在使用不同的壓縮類型來彌補這個短板。
SPDY使用普通的DEFLATE 算法而HTTP/2使用專門為壓縮報頭而設計的HPACK算法。它使用預定義的token、動態表以及哈夫曼壓縮。
從一個空請求也可以看到生成的報頭大小的不同。在Google英國首頁有返回空內容的信標請求(204返回碼)。下面是HttpWatch的截圖,‘Sent’列顯示請求報頭的大小,‘Received’列顯示響應報頭的大小:
**勝出**: HTTP/2的報頭大小還是很明顯的,看來HPACK確實不錯。
### 測試#2:響應信息大小
響應信息包括響應報頭和編碼過的響應內容。HTTP/2提供了最小的報頭,那么它會否給到最小的響應信息?
原因在于可被添加到HTTP/2數據幀的可選填充字節。HttpWatch現在并不能顯示填充,但是在debug log里面可以看到Google服務器向文本內容的數據幀中添加了填充。HTTP/2規范給到的使用填充的理由是: 填充可以用來混淆幀內容的實際大小,而且減少HTTP中的特殊攻擊。例如,壓縮的內容包含攻擊者控制的明文和秘密數據的攻擊(見 [BREACH]).
填充不會用于圖片文件,因為它已經是壓縮過的格式了,并不包含攻擊者控制的純文本。
**勝出**: SPDY
在Google服務器上看到的較大的響應體是因為在數據幀中使用了填充。盡管,HTTP/2產生了比SPDY大的響應信息,它的加密連接可能會更安全。這可能會是安全和性能權衡折衷的一個地方。
### TCP連接數和SSL握手請求時間
通過將每個域名的最大并發連接數從2個提升到6個甚至更多,瀏覽器在HTTP/1.1實現了明顯的性能提升。增加并發使得網絡帶寬可以更有效的利用,因為它減少了請求塊。
SPDY和HTTP/2通過復用單個連接來允許多個請求一次發送和接收數據來支持在一個TCP和SSL連接中的并發。
增加了‘Connect’和‘SSL Handshake’時間后,SPDY:
**勝出**: 共同勝出: SPDY & HTTP/2.
在SPDY和HTTP/2中增加的復用支持減少了下載頁面時不得不設置的網絡連接的數量。作為附加好處,當HTTP/2使用的更加廣泛時,網絡服務器不用再不得不維護太多的活動TCP連接了。
### 測試#4:頁面加載時間
HttpWatch中的‘Page Load’時間顯示頁面被完全下載并可用的時間。大部分情況下,這是合理的網頁速度的衡量數據。
**勝出**:HTTP/2
原生的HTTPS的加載時間最長的原因可能是缺乏報頭壓縮和額外的TCP連接和SSL握手請求。對于更復雜的頁面來說,SPDY和HTTP/2的優勢可能會更加明顯。
我們也發現HTTP/2通常比SPDY要快,盡管它的響應信息通常更大。這個優勢可能是因為HPACK壓縮減少的更小的GET請求信息。我們的網絡連接,和許多人一樣,是非對稱的——網絡上傳速度比下載速度小很多。這意味著任何節省的上傳數據比節省的等量的下載數據更有價值。
### 結論
HTTP/2看起來能提供明顯的性能優勢,。然而,響應信息中填充的使用會是一個潛在的關于性能和安全的權衡點。
### 參考資料
- [A Simple Performance Comparison of HTTPS, SPDY and HTTP/2](http://blog.httpwatch.com/2015/01/16/a-simple-performance-comparison-of-https-spdy-and-http2/)
- [如何防止網站被電信運營劫持彈廣告](http://dbanotes.net/security/iframekiller_anti_iframe_clicjacking.html)
- [Hypertext Transfer Protocol version 2](https://http2.github.io/http2-spec/)
- [SPDY](http://en.wikipedia.org/wiki/SPDY)
- [HttpWatch](http://www.httpwatch.com/download/)
- 介紹
- 程序員基礎知識
- 字符編碼
- 技術名詞
- 語義化版本
- 命名規范
- 書寫文檔
- 開源協議
- 目錄結構
- 正則表達式
- 平凡之路
- 數據結構與算法
- 堆和棧
- 浮點數類型
- XML和JSON
- 算法學習之路
- 排序算法
- 代碼架構
- 設計模式
- 常用的Javascript設計模式
- 面向對象編程
- 繼承
- 多態
- 封裝
- 面向接口編程
- 代碼評審
- 六種量化你代碼的方式
- 程序員必備的代碼審查(Code Review)清單
- 服務器部署
- AWS簡介
- 網絡知識
- HTTPS, SPDY和 HTTP/2性能的簡單對比
- HTTP狀態碼
- 懂點設計
- 佳作賞析
- 無縫平鋪
- Sketch學習
- 設計與實現的平衡
- 寫點東西
- 使用gitbook
- 合格的PM
- 一個好的產品經理
- 產品經理的技能
- 團隊合作
- 關于招聘
- 培訓新人
- 領導能力
- 獲取知識
- MOOC
- Podcasts
- 英語學習
- 設計學習
- 前端學習
- iOS學習
- 游戲開發
- 關注健康
- 過勞檢測
- 關于睡眠
- 提升效率
- 學會閱讀
- 學會提問
- 善用搜索
- 學會寫作
- 時間管理
- 知識管理
- 文件管理
- 密碼管理
- 制作視頻
- 制作PPT
- 論音樂對效率的影響
- 程序員效率指南
- SOHO
- 創業資源
- Hacker
- 保護隱私
- 關于工作
- 找工作前需要思考的問題
- 原則與技巧
- 關于簡歷
- 其他方面
- 硬件相關
- 常用軟件
- Windows
- 硬件配置
- 系統安裝
- 常用軟件
- Mac
- 通用設置
- 權限問題
- alias設置
- 常用軟件
- 開發環境
- 快捷鍵設置
- 常用終端命令
- dotfiles
- Android
- 常用軟件
- 如何登錄美國區GooglePlay
- 開發工具
- git
- EditorConfig
- node
- shadowsocks
- ST3--Windows篇
- ST3--Mac篇
- gulp
- 字體的選擇
- Emacs
- WebStorm
- tmux
- Sketch
- Sketch中文學習資料
- Trello
- 使用Trello管理項目的經驗
- git進階
- 15分鐘學會使用Git和遠程代碼庫
- GitHub秘籍
- JetBrains
- IDE設置
- 附錄
- 計算機科學與技術
- 網站
- 書籍
- 工具