http2的世界 · http2講解

2018-06-30 19:21 更新

8. http2的世界

那么當http2被廣泛采用的時候,世界將會成什么樣呢?或者說,它會被真正的采用嗎?

+

8.1. http2會如何影響普通人?

到目前為止,http2還沒被大范圍部署使用,我們也無法確定到底會發(fā)生什么變化,但至少可以參考SPDY的例子和曾經(jīng)做過的實驗來進行大概的估計。

+

http2減少了網(wǎng)絡往返傳輸?shù)臄?shù)量,并且用多路復用和快速丟棄不需要的流的辦法來完全避免了head of line blocking(線頭阻塞)的困擾。

+

它也支持大量并行流,所以即使網(wǎng)站的數(shù)據(jù)分發(fā)在各處也不是問題。

+

合理利用流的優(yōu)先級,可以讓客戶端盡可能優(yōu)先收到更重要的數(shù)據(jù)。

+

所有這些加起來,我認為頁面載入時間和站點的響應速度都會更快。簡而言之,它們都代表著更好的web體驗。

+

但到底能變得多快,到底提升有多大呢?我認為目前很難說清楚。畢竟這些技術(shù)依然在早期階段,我們還無法看見客戶端和服務器實現(xiàn)這些并真正受益于它所提供的強大功能。

+

8.2. http2會如何影響web開發(fā)?

近年來,web開發(fā)者、web開發(fā)環(huán)境為HTTP 1.1存在的一些問題提供了一部分臨時的解決方案。其中的一部分我已在上文中簡單的介紹了,不妨簡單的回憶一下。

+

很多工具和開發(fā)者可能會默認使用這些方案,但它們其中的一部分也許會損害到http2的性能,或者至少讓我們無法真正利用到http2新提供的強大威力。Spriting和內(nèi)聯(lián)應該是http2里面最不需要的了。因為http2更傾向于使用更少的連接,所以Sharding甚至會傷害到http2的性能。

+

這里的問題在于:對于網(wǎng)站的開發(fā)者而言,在短期內(nèi)開發(fā)和部署同一套前端來支持HTTP 1.1和http2的客戶端訪問并獲得最大性能將會是一個挑戰(zhàn)。

+

考慮到這些問題,我認為徹底發(fā)掘http2的潛力還有很長一段路要走。

+

8.3. http2的各種實現(xiàn)

在這樣一篇文章中詳細說明每個實現(xiàn)細節(jié)注定乏味且毫無意義,我將用更通用的術(shù)語來解釋實際的場景,并在此給大家提供一個http2的實現(xiàn)列表作為參考。

+

在http2的早期就已經(jīng)有大量的實現(xiàn)。并且在http2標準化工作期間,這個數(shù)量還持續(xù)增長。截至我寫這篇文檔的時候,共有40種實現(xiàn)已記錄在案,他們中的大多數(shù)都實現(xiàn)了最新的草案。

+

8.3.1. 瀏覽器

Firefox一直緊跟最新的協(xié)議,Twitter也緊追不舍提供了基于http2的服務。2014年4月期間,Google在少數(shù)測試服務器上提供http2支持。從同年5月開始,開發(fā)版的Chrome支持http2。Microsoft也在他們的產(chǎn)品預發(fā)布會上展示了支持http2的下一代瀏覽器。Safari (iOS 9 以及 Mac OS X El Capitan) 和 Opera也都表態(tài)它們將會支持http2。

+

8.3.2 服務器

事實上,已經(jīng)有不少的服務器實現(xiàn)了http2。

+

時下最流行的Nginx自1.9.5(發(fā)布于2015年9月22號)版本后提供了對http2的支持并且取締了原來的SPYD模塊(因此SPYD和http2無法同時運行在同一個Nginx服務器實例中)。

+

而Apache HTTPD服務器也實現(xiàn)了一個名為mod_http2的http2模塊,并與2015年10月9號在2.4.17的版本中發(fā)布。

+

此外,H2O, Apache Traffic Server, nghttp2, Caddy 以及 LiteSpeed 也都發(fā)布了可以工作于http2下的服務器。

+

8.3.3 其他

curl和libcurl支持未加密的http2并借助某些TLS庫支持了TLS版本。

+

Wireshark同樣支持了http2, 所以用它來分析http2網(wǎng)絡數(shù)據(jù)流著實是再好不過的了。

+

8.4. 對http2的常見批評

在制定協(xié)議的討論過程中往往存在許多爭議,甚至會有不少人認為這樣的協(xié)議最終會以失敗告終。這里我想提一些常見的對協(xié)議的批評以及我的解釋:

+

8.4.1. “這個協(xié)議是Google設計制定的”

江湖上有太多傳言暗示著這個世界越來越被Google所控制,但事實顯然并非如此。這個協(xié)議是IETF制定的,就跟過去30年間很多其他協(xié)議一樣。但不得不承認,SPDY是Google非常出色的成果。它不僅僅證明了開發(fā)一個新協(xié)議的可行性,還充分展現(xiàn)了新協(xié)議所能帶來的好處。

+

而Google也公開的聲明了他們會在2016年移除Chrome里對SPDY和NPN的支持,并且極力推動服務器遷移至HTTP/2。

+

8.4.2. “這個協(xié)議只在瀏覽器上有用”

在一定意義上,這是對的。開發(fā)http2的其中一個主要原因就是修復HTTP pipelining。如果在你的應用場景里本來就不需要pipelining,那么確實很有可能http2對你沒有太大幫助。雖然這并不是唯一的提升,但顯然這是非常重要的一個。

+

一旦當某些服務意識到在一個連接上建立多路復用流的強大威力時,我認為會有越來越多的程序采用http2。

+

小規(guī)模的REST API和采用HTTP 1.x的簡單程序可能并不會從遷移到http2中獲得多大的收益。但至少,遷移至http2對絕大部分用戶來講幾乎是沒有壞處的。

+

8.4.3. “這個協(xié)議只對大型網(wǎng)站有用”

完全不是這樣。因為缺乏內(nèi)容分發(fā)網(wǎng)絡,小網(wǎng)站的網(wǎng)絡延遲往往較高,而多路復用的能力可以極大的改善在高網(wǎng)絡延遲下的體驗。大型網(wǎng)站往往已經(jīng)將內(nèi)容分發(fā)到各處,所以速度其實已經(jīng)非??炝?。

+

8.4.4. “TLS讓速度變得更慢”

這個評價在某種程度上是對的。雖然TLS的握手確實增加了額外的開銷,但也有越來越多的方案提出來減少TLS往返的時間。使用TLS而不是純文本帶來的開銷是顯著的,有可觀證據(jù)表明,和傳輸同樣的流量相比,TLS會消耗更多的CPU和其他資源。具體影響有多大以及怎么影響是一個和具體測量有關(guān)的課題。更多的例子可以參看istlsfastyet.com。

+

Telecom和一些其他網(wǎng)絡服務商,例如ATIS開放網(wǎng)絡聯(lián)盟,表示為了為衛(wèi)星、飛機等提供的快速網(wǎng)絡體驗,他們需要一些不加密的流量來提供caching,壓縮和其他技術(shù)。

+

由于http2并不強制要求使用TLS,所以我們不應該為此擔心。

+

如今,很多互聯(lián)網(wǎng)使用者都希望TLS能被更廣泛的使用來保護用戶隱私。

+

實驗也證明了通過使用TLS能比用在80端口實現(xiàn)一個新的基于文本的協(xié)議更容易成功。因為當前已經(jīng)有太多中間商使用該方案,所以凡是基于80端口的協(xié)議,都很可能被理所當然的當作HTTP 1.1。

+

最后,得益于http2可以在單一連接上提供多路復用的流,正常使用普通瀏覽器也可以減少TLS握手的次數(shù),所以使用HTTPS仍然會比HTTP 1.1更快。

+

8.4.5. “不基于ASCII是沒法忍受的”

是的,如果我們可以直接讀出協(xié)議內(nèi)容,那么調(diào)試和追蹤都會變得更為簡單。但是基于文本的協(xié)議更容易產(chǎn)生錯誤,造成更多解析的問題。

+

假如你真的無法接受二進制協(xié)議,那么你也很難在HTTP 1.x中處理TLS和壓縮。因為其實這些技術(shù)已經(jīng)被使用了很久了。

+

8.4.6. “它根本沒有比HTTP/1.1快”

當然,到底該如何定義和衡量“快”就是另外一個話題了,但在SPDY的時代,已經(jīng)有很多實驗證明了該協(xié)議會讓瀏覽器載入頁面變得更快(例如華盛頓大學的“SPDY有多快?”和Hervé Servy的“評估啟用SPDY后的Web服務器的性能”),同樣這些實驗也可以被用來證明http2。我期待能有越來越多的諸如此類的測試實驗結(jié)果發(fā)布。而這篇文章httpwatch.com的一個簡單測試亦能證明HTTP/2名副其實。

+

8.4.7. “它違反了網(wǎng)絡分層”

你確定這也是反對的理由么?網(wǎng)絡分層并不是不可侵犯的。如果我們在制定http2的時候已經(jīng)踏入了灰色地帶,那我們當然可以嘗試在限制內(nèi)制定出更好更高效的協(xié)議。

+

8.4.8. “它并沒有修復很多HTTP/1.1的短板”

確實是這樣。兼容HTTP/1.1的范式是我們的目標之一,所以一些老的HTTP功能仍然被保留。例如一些常用的協(xié)議頭、可怕的cookies、驗證頭等等。但保留這些范式的好處就是我們在升級到新協(xié)議的時候少掉很多工作,也不需要重寫很多底層的東西。Http2其實只是一個新的幀層。

+

8.5. http2會被廣泛部署嗎?

現(xiàn)在討論這個議題還言之尚早,但我仍然要在這里做出我的預估。

+

很多懷疑論者會以“看看IPv6現(xiàn)在的德性”為讓我們回想起這個經(jīng)歷了10多年才開始慢慢被采用的協(xié)議。但http2畢竟不是IPv6。它是一個建立在TCP之上的使用基于原有HTTP協(xié)議升級過后的機制、端口號和TLS等的協(xié)議。大部分路由器或者防火墻不需要為此而進行更改。

+

Google向世界展示了他們的SPDY,證明了像這樣的新協(xié)議也能在足夠短的時間內(nèi)擁有多種實現(xiàn),并且能被瀏覽器和服務所采用。雖然如今支持SPDY服務器端數(shù)量在1%以內(nèi),但通過這些服務器所交換的數(shù)據(jù)卻要大很多。很多非常流行的網(wǎng)站現(xiàn)在也有提供SPDY支持。

+

我認為建立在SPDY的基本范式之上的http2會被更廣泛的部署,其中一個主要的原因是:它是一個IETF制定的協(xié)議。而SPDY則因為背負了“它是Google的協(xié)議”這個惡名,導致它的發(fā)展總是畏首畏腳。

+

在它首次發(fā)布的幕后有很多大型瀏覽器支持。來自Firefox,Chrome,Safari,Internet Explorer和Opera的代表宣布了他們會發(fā)布支持http2特性的瀏覽器,并且他們已經(jīng)演示了一些能正常運作的實現(xiàn)。

+

也有很多像Google,Twitter和Facebook這樣的服務器運營者希望盡快支持http2,也同樣希望可以快點在主流服務器實現(xiàn)中出現(xiàn)對http2的支持(例如Apache HTTP Server和nginx)。而H2o作為一個極具潛力的新生HTTP服務器,已經(jīng)支持了http2。

+

那些大型代理程序開發(fā)者,例如HAProxy、Squid和Varnish也表示出了他們對支持http2的興趣。

+

縱觀2015年,http2的流量正在逐步上升。9月初,F(xiàn)irefox 40中http2流量占據(jù)了所有HTTP流量中的13%,HTTPS中的27%。與此同時,Google表示約有18%的流量來自HTTP/2。值得注意的是,Google同時也在實驗其他協(xié)議(參見12.1中的QUIC),這也使得http2的使用量暫時比正常值低一些。

+

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號