隨著今年 5 月 14 日 HTTP/2 協(xié)議正式版的發(fā)布,越來越多的網(wǎng)站開始部署 HTTP/2 了。我對 HTTP 協(xié)議一直都比較有興趣,本文匯總一些關(guān)于 HTTP/2 的資料以及我寫過的文章,會持續(xù)更新。如果大家有任何問題,歡迎留言交流探討。
協(xié)議
HTTP/2 協(xié)議由以下兩個 RFC 組成:
- RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)
- RFC 7541 - HPACK: Header Compression for HTTP/2
網(wǎng)上有一份由百度 FEX 翻譯的「h2-13 中文版」,更新于一年前,也可以看看。h2-13 說明這是協(xié)議的第 13 版草案,HTTP/2 一共經(jīng)歷了 00~17 共 18 版草案才正式發(fā)布。
很多支持 HTTP/2 的 Web 服務(wù)器和客戶端,都會標(biāo)注出自己支持的具體版本,例如 h2、h2-14,分別表示自己支持正式版、第 14 版草案。有時候還會看到某個軟件寫著支持 h2c,這是指它支持運行于非加密通道之上的 HTTP/2(HTTP/2 Cleartext)。
HTTP/2 協(xié)議是從 SPDY 演變而來,SPDY 已經(jīng)完成了使命并很快就會退出歷史舞臺(例如 Chrome 將在「2016 年初結(jié)束對 SPDY 的支持」;Nginx 在今年年底正式支持 HTTP/2 后,也不再支持 SPDY),故本文不再討論 SPDY。
在「HTTP/2 官網(wǎng)」可以找到更多有關(guān) HTTP/2 協(xié)議的資料。
部署
根據(jù) caniuse 的統(tǒng)計,目前支持 HTTP/2 的瀏覽器有 Chrome 41+、Firefox 36+、Safari 9+、Windows 10 上的 IE 11 和 Edge。服務(wù)器方面則有 F5、H2O、nghttp2 等數(shù)十種選擇,各種語言實現(xiàn)的都有。Nginx 則相對謹(jǐn)慎一些,在「本月初才提供對 HTTP/2 的實驗性支持」,年底才會正式支持。這里有一份「HTTP/2 服務(wù)器及客戶端」的完整清單。
「Akamai 這個頁面」提供了 HTTP/1 和 HTTP/2 的對比,大家可以用自己的瀏覽器測試一下。
HTTP/2 協(xié)議本身并沒有要求必須基于 TLS 部署,但是 Chrome 和 Firefox 這兩大瀏覽器均表示只支持 HTTP/2 Over TLS。這樣做一方面更安全,另一方面利用 TLS 的加密機制可以更好地穿透網(wǎng)絡(luò)中間節(jié)點。
所以如果要部署 HTTP/2,首先需要將網(wǎng)站升級為 HTTPS。這個過程涉及到購買證書、生成證書和配置 Web 服務(wù)器等幾個步驟,網(wǎng)上很多教程,這里略過。有兩點需要注意:1)選擇層級少的證書(點擊 Chrome 地址欄的綠色小鎖,查看證書信息就可以看到層級);2)一定不要使用 SHA1 算法的證書。
本博客先后使用過 H2O 和 Nginx 這兩個服務(wù)器提供 HTTP/2 服務(wù),下面是具體的介紹:
如果你在使用 Apache,可以參考這篇文章啟用 HTTP/2。
另外,現(xiàn)在國外一些 CDN 也開始支持 HTTP/2 了,例如 KeyCDN,可以根據(jù)自己實際需要選用。KeyCDN 寫過一篇描述自家和全球 HTTP/2 部署情況統(tǒng)計的文章:HTTP/2 Statistics: KeyCDN Report on HTTP/2 Distribution。
HTTP/2 協(xié)議中對 TLS 有了更嚴(yán)格的限制:例如 HTTP/2 中只能使用 TLSv1.2+,還禁用了幾百種 CipherSuite。如果你遇到了啟用 HTTP/2 導(dǎo)致網(wǎng)站打不開的問題,請參考這篇文章。
優(yōu)化
將網(wǎng)站升級為 HTTPS 之后,多了 TLS 握手過程,之后的全部流量都會加密,如果沒有做好優(yōu)化肯定會比之前更慢。實際上,現(xiàn)在 TLS 已經(jīng)很快了,這里有一個性能專家 igrigorik 建立的網(wǎng)站:Is TLS Fast Yet?,可以關(guān)注下。
下面幾篇對 Nginx 的配置心得,是我在本博客實踐之后寫的,可以先看看:
HTTP/2 究竟會給 WPO(Web Performance Optimization)帶來什么,我也寫了一系列文章來介紹:
在 Velocity 2015 · SC 會議上,來自 Google 的 Ilya Grigorik 分享了「HTTP/2 is here, let's optimize! - Yesterday's perf best-practices are today's HTTP/2 anti-patterns」話題,重點講述 HTTP/2 與 HTTP/1 關(guān)于 WPO 的相同和不同之處,值得推薦。
HTTP/2 中的 Server Push,可以減少網(wǎng)絡(luò)延遲對性能帶來的影響,優(yōu)化首次訪問速度。但它可能造成流量浪費,具體細(xì)節(jié)請看我的這兩篇文章:
HTTP/2 中的頭部壓縮,可以減少頭部體積,提高傳輸效率。有關(guān)這項技術(shù)原理和實現(xiàn)的詳細(xì)介紹,請看我的這篇文章:
目前我沒有找到只針對 HTTP/2 的性能測試工具,下面在線工具的結(jié)果可以作為參考:
- Qualys SSL Server Test,用于測試 SSL 服務(wù)端;
- WebPagetest,老牌網(wǎng)站性能測試工具;
- GTmetrix,使用 PageSpeed、YSlow 和其他工具全面測試網(wǎng)站性能;
下面這個工具可以給出一個網(wǎng)站分別在 HTTP/1 和 HTTP/2 下的加載速度對比(當(dāng)然,待測試網(wǎng)站必須同時支持 HTTP/1 和 HTTP/2):
調(diào)試
不同于 HTTP/1 的文本格式報文,HTTP/2 傳輸?shù)亩际嵌M制幀,調(diào)試起來要麻煩一些。
首先,要辨別某個網(wǎng)站是否啟用了 HTTP/2,可以通過瀏覽器開發(fā)工具的「網(wǎng)絡(luò)」面板中的 Protocol 字段查看。也可以通過擴展在瀏覽器地址欄顯示當(dāng)前的協(xié)議類型,HTTP/2 指示器擴展:Chrome 版、Firefox 版。
在 Chrome 地址欄輸入chrome://net-internals/#http2
,打開 Chrome 自帶的 HTTP/2 查看工具,可以很方便地查看 HTTP/2 幀信息。
新版 Wireshark(dev 1.99)也可以調(diào)試 HTTP/2,詳細(xì)介紹請查看「官網(wǎng) Wiki」和我的這篇文章:調(diào)試 HTTP/2 流量。
更多調(diào)試工具可以在 CloudFlare 這篇文章里找到:Tools for debugging, testing and using HTTP/2。
書籍
以下書籍都有可供免費閱讀的電子版:
- NGINX HTTP2 White Paper V4(Nginx 編寫的 HTTP/2 白皮書)
- http2 explained(中文翻譯見這里)
- HTTP/2: A New Excerpt from High Performance Browser Networking(即「High Performance Browser Networking」第十二章,Ilya Grigorik 編寫)
最近發(fā)現(xiàn)一個 HTTP/2 日文網(wǎng)站:http2.info,有大量非常有用的資料,可惜看不懂日語,不知道有人愿意牽頭做 HTTP/2 的中文本地化工作不?
最后放上我最近做的一個關(guān)于 HTTP/2 的分享:《HTTP/2:新的機遇與挑戰(zhàn)》。
本文鏈接:https://imququ.com/post/http2-resource.html,參與評論。
--EOF--
發(fā)表于2015-08-31 00:50:46,并被添加「HTTP2」標(biāo)簽,最后修改于2015-09-26 10:22:57。