# 8. http2的世界
那么當http2被廣泛采用的時候,世界會成怎么樣呢?或者它會被廣泛采用嗎?
## 8.1. http2會如何影響普通人?
現在http2還沒被大范圍部署使用,我們也無法確定到底會發生什么變化,但至少可以參考SPDY的例子和曾經做過的實驗來進行大概估計。
http2減少了網絡往返傳輸的數量,并且用多路復用和快速丟棄不需要的流的辦法來完全避免了head of line blocking的困擾。
它也支持大量并行流,所以即使網站的數據分發在各處也不是問題。
合理利用流的優先級,可以讓客戶端盡可能優先收到更重要的數據。
所有這些加起來,我認為頁面載入時間和站點相應的速度都會更快。簡而言之:更好的web體驗。
但到底能變得多快,到底提升有多大呢?我認為目前很難說清楚。畢竟這些技術依然在早期,我們還沒法看見客戶端和服務器實現這些并真正受益于新協議所提供的強大功能。
## 8.2. http2會如何影響web開發?
近年來,web開發者、web開發環境為一些HTTP 1.1的問題提供了臨時解決方案。不妨回憶一下,其中一些我已在上文中簡單的介紹了。
這些解決方案很多是工具和開發者默認使用的,這很可能會損害到http2的性能,或者至少讓我們沒法真正利用到http2新提供的強大威力。Spriting和內聯應該是http2里面最不需要的了。因為http2更傾向于使用更少的連接,所以Sharding甚至會傷害到http2的性能。
這里的問題就是:web網站和web開發們至少在短期內需要同時支持HTTP 1.1和http2的客戶端。否則的話,使所有用戶獲得最好的體驗將是一個挑戰。
考慮到這些問題,我認為距離http2的潛力被徹底發掘還有很長一段路要走。
## 8.3. http2的實現
在這樣一篇文章中詳細說明每個實現細節注定乏味且毫無意義,我將用更廣泛的術語解釋實際場景,給大家提供一個http2的[實現列表](https://github.com/http2/http2-spec/wiki/Implementations)作為參考。
在http2的早期就已經有大量的實現。并且在http2標準化工作期間,這個數量還持續增長。截至我寫這篇文檔的時候,共有30種實現記錄在案,他們中的大多數都實現了最新的草案。
Firefox一直緊跟最新的協議,Twitter也緊追不舍提供了基于http2的服務。2014年4月期間,Google在少數測試服務器上提供http2支持。從同年5月開始,開發版的Chrome支持http2。Microsoft也在他們的產品預發布會上展示了支持http2的下一代瀏覽器。
curl和libcurl支持未加密的http2,同時借助某些TLS庫支持了TLS。
draft-17是當前最新的草案版本,它二進制兼容draft-14。后者是最近一個被標記為實現/互操作的草案。但是當draft-17 進行線上二進制兼容的時候,草案的語言的改變也造成了他們的些許不同。
**8.3.1. 缺失的實現**
現有的實現列表中仍然有明星品牌缺席。目前尚未聽到Apple官方有讓Safari支持http2的計劃。Apache HTTPD和Nginx這兩大流行的服務器都提供SPDY的支持,但卻沒有對提供http2的支持進行任何表態。
Nginx表示“我們計劃于2015年末發布帶有HTTP/2支持的nginx和NGINX Plus”。而Apache已經有一個非常早期的HTTP/2模塊,叫作[mod_h2](https://icing.github.io/mod_h2/)。
## 8.4. 對http2的常見批評
在制定協議的討論過程中有許多充滿爭議的地方,甚至會有不少人認為這樣的協議最終會以失敗告終。這里我想提一些對協議常見的批評和我的解釋:
**8.4.1. “這個協議是Google設計制定的”**
江湖上有太多傳言暗示著這個世界越來越被Google所控制,但事實顯然不是這樣。這個協議是IETF制定的,就跟過去30年間很多其他協議一樣。但不得不承認,SPDY是Google非常出色的成果。它不僅僅證明了開發一個新協議的可行性,還充分展現了新協議能帶來的好處。
Google公開[聲明](http://blog.chromium.org/2015/02/hello-http2-goodbye-spdy-http-is_9.html)了他們會在2016年移除Chrome里對SPDY和NPN的支持,并且極力推動服務器遷移至HTTP/2。
**8.4.2. “這個協議只在瀏覽器上有用”**
在某種程度上,這是對的。開發http2的一個主要動機就是修復HTTP pipelining。如果在你的應用場景里本來就不需要pipelining,那么確實很有可能http2對你沒有太大幫助。雖然這并不是唯一的提升,但顯然這是非常重要的一個。
一旦當某些服務意識到在一個連接上建立多路復用流的強大威力時,我認為會有越來越多的程序采用http2。
小規模的REST API和采用HTTP 1.x的簡單程序可能不會認為遷移到http2能有多大的優勢。但至少http2對絕大部分用戶來講,是幾乎沒有壞處的。
**8.4.3. “這個協議只對大型網站有用”**
完全不是這樣。因為缺乏內容分發網絡,小網站的網絡延遲往往較高,而多路復用的能力可以極大的改善在高網絡延遲下的體驗。大型網站往往已經將內容分發到各處,所以速度其實更快。
**8.4.4. “TLS讓速度變得更慢”**
這個評價在某種程度上是對的。雖然TLS的握手確實增加了額外的開銷,但也有越來越多的方案來減少TLS往返的時間。使用TLS而不是純文本帶來的開銷是顯著的,有可觀證據表明,和傳輸同樣的流量相比,TLS會消耗更多的CPU和其他資源。具體影響有多大以及怎么影響是一個和具體測量有關的課題。更多的例子可以參看[istlsfastyet.com](http://istlsfastyet.com)。
Telecom和一些其他網絡服務商,例如ATIS開放網絡聯盟,表示為了為衛星、飛機等提供的快速網絡體驗,他們需要一些[不加密的流量](http://www.atis.org/openweballiance/docs/OWAKickoffSlides051414.pdf)來提供caching,壓縮和其他技術。
http2并不強制要求使用TLS,所以我們不應該為此擔心。
如今,很多互聯網使用者已經更希望TLS能被更廣泛的使用來保護用戶隱私。
實驗也證明了通過使用TLS能比用在80端口實現一個新的基于文本的協議更容易成功。因為當前已經有太多中間商使用該方案,所以凡是基于80端口的協議,都很可能被理所當然的當作HTTP 1.1。
最后,得益于http2在單一連接上提供的多路復用流,普通瀏覽器的正常使用也可以減少TLS握手的次數,所以使用HTTPS仍然會比HTTP 1.1更快。
**8.4.5. “不基于ASCII是沒法忍受的”**
雖然當我們可以直接讀出協議內容的時候,調試和追蹤都會變得更簡單。但基于文本的協議更容易產生錯誤,造成更多解析的問題。
如果你真的無法接受二進制協議,那么你也無法在HTTP 1.x中處理TLS和壓縮。而這些技術其實已經被使用了很久了。
**8.4.6. “它根本沒有比HTTP/1.1快”**
當然,到底該如何定義和測量“快”就是另外一個話題了,但在SPDY的時代,已經有一些實驗證明了該協議會讓瀏覽器載入頁面更快(例如華盛頓大學的“[SPDY有多快?](https://www.usenix.org/system/files/conference/nsdi14/nsdi14-paper-wang_xiao_sophia.pdf)”和Hervé Servy的“[評估啟用SPDY的Web服務器性能](http://www.neotys.com/blog/performance-of-spdy-enabled-web-servers/)”),同樣這些實驗也被用來證明http2。我期待能有越來越多的測試實驗發布。[httpwatch.com](http://blog.httpwatch.com/2015/01/16/a-simple-performance-comparison-of-https-spdy-and-http2/)也有進行一個簡單的測試來證明HTTP/2名副其實。
http2在很多的場景下都證明了自己更快,尤其是在包含非常多資源的高延遲的連接上。而正如之前的章節中提到,目前的趨勢就是每個網站包含越來越多的資源和數據。
**8.4.7. “它違反了網絡分層”**
你確定這也是反對的理由么?網絡分層并不是不可侵犯的。如果我們在制定http2的時候已經踏入了灰色地帶,那我們當然可以嘗試在限制內制定出更好更高效的協議。
**8.4.8. “它并沒有修復很多HTTP/1.1的問題”**
確實是這樣。兼容HTTP/1.1的范式是我們的目標之一,所以一些老的HTTP功能仍然被保留。例如一些常用的協議頭、可怕的cookies、驗證頭等等。但保留這些范式的好處就是我們在升級到新協議的時候少掉很多工作,也不需要重寫很多底層的東西。Http2其實只是一個新的幀層。
## 8.5. http2會被廣泛部署嗎?
現在還言之尚早,但我仍然要在這里做出我的預估。
很多懷疑論者會以“看看IPv6現在的德性”為讓我們回想起這個經歷了10多年才開始慢慢被采用的協議。但http2畢竟不是IPv6。他是一個建立在TCP之上的使用HTTP更新機制、端口號和TLS等的協議。大部分路由器或者防火墻不需要為此而進行更改。
Google向世界展示了他們的SPDY,證明了像這樣的新協議也能在足夠短的時間內擁有多種實現,并且能被瀏覽器和服務所采用。雖然如今支持SPDY服務器端數量在1%以內,但通過這些服務器所交換的數據卻要大很多。很多非常流行的網站現在也有提供SPDY支持。
我認為建立在SPDY的基本范式之上的http2會被更廣泛的部署,畢竟它是IETF制定的協議。而SPDY因為背負了“它是Google的協議”這個惡名,導致它的發展總是畏首畏腳。
在它首次發布的幕后有很多大型瀏覽器支持。來自Freifox,Chrome和IE的代表宣布了他們會發布支持http2特性的瀏覽器,并且他們已經演示了一些能正常運作的實現。
也有很多像Google,Twitter和Facebook這樣的大公司希望盡快支持http2,所以我們可以期待著很快能有支持http2的服務器(例如Apache HTTP Server和nginx)。[H2o](https://github.com/h2o/h2o)作為一個極有潛力的新生HTTP服務器,也同樣支持http2。
那些大型代理程序開發者,例如HAProxy、Squid和Varnish也表示出了他們對支持http2的興趣。
我也相信一旦規范被RFC批準,會有更多的實現雨后春筍般的涌現出來。
在2015年1月下旬,默認啟用HTTP/2的Firefox 35發布后,Google也宣布Chrome 40對2%的用戶啟用了該功能。雖然他沒有告訴我們具體的數字,但HTTP/2已經差不多占到了他們全球流量的5%。與此同時,Firefox 35記錄到了9%的相應都是HTTP/2。