鍍金池/ 教程/ Linux/ http2 的世界
后http2時(shí)代
升級(jí)HTTP
擴(kuò)展
擴(kuò)展閱讀
致謝
http2 的世界
curl中的http2
Chromium里的http2
背景
Firefox里的http2
HTTP 的現(xiàn)狀
http2 協(xié)議
http2 的基本概念
那些年,克服延遲之道

http2 的世界

那么當(dāng)http2被廣泛采用的時(shí)候,世界會(huì)成怎么樣呢?或者它會(huì)被廣泛采用嗎?

8.1. http2會(huì)如何影響普通人?

現(xiàn)在http2還沒被大范圍部署使用,我們也無(wú)法確定到底會(huì)發(fā)生什么變化,但至少可以參考SPDY的例子和曾經(jīng)做過的實(shí)驗(yàn)來(lái)進(jìn)行大概估計(jì)。

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

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

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

所有這些加起來(lái),我認(rèn)為頁(yè)面載入時(shí)間和站點(diǎn)相應(yīng)的速度都會(huì)更快。簡(jiǎn)而言之:更好的web體驗(yàn)。

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

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

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

這些解決方案很多是工具和開發(fā)者默認(rèn)使用的,這很可能會(huì)損害到http2的性能,或者至少讓我們沒法真正利用到http2新提供的強(qiáng)大威力。Spriting和內(nèi)聯(lián)應(yīng)該是http2里面最不需要的了。因?yàn)閔ttp2更傾向于使用更少的連接,所以Sharding甚至?xí)Φ絟ttp2的性能。

這里的問題就是:web網(wǎng)站和web開發(fā)們至少在短期內(nèi)需要同時(shí)支持HTTP 1.1和http2的客戶端。否則的話,使所有用戶獲得最好的體驗(yàn)將是一個(gè)挑戰(zhàn)。

考慮到這些問題,我認(rèn)為距離http2的潛力被徹底發(fā)掘還有很長(zhǎng)一段路要走。

8.3. http2的實(shí)現(xiàn)

在這樣一篇文章中詳細(xì)說明每個(gè)實(shí)現(xiàn)細(xì)節(jié)注定乏味且毫無(wú)意義,我將用更廣泛的術(shù)語(yǔ)解釋實(shí)際場(chǎng)景,給大家提供一個(gè)http2的實(shí)現(xiàn)列表作為參考。

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

Firefox一直緊跟最新的協(xié)議,Twitter也緊追不舍提供了基于http2的服務(wù)。2014年4月期間,Google在少數(shù)測(cè)試服務(wù)器上提供http2支持。從同年5月開始,開發(fā)版的Chrome支持http2。Microsoft也在他們的產(chǎn)品預(yù)發(fā)布會(huì)上展示了支持http2的下一代瀏覽器。

curl和libcurl支持未加密的http2,同時(shí)借助某些TLS庫(kù)支持了TLS。

draft-17是當(dāng)前最新的草案版本,它二進(jìn)制兼容draft-14。后者是最近一個(gè)被標(biāo)記為實(shí)現(xiàn)/互操作的草案。但是當(dāng)draft-17 進(jìn)行線上二進(jìn)制兼容的時(shí)候,草案的語(yǔ)言的改變也造成了他們的些許不同。

8.3.1. 缺失的實(shí)現(xiàn)

現(xiàn)有的實(shí)現(xiàn)列表中仍然有明星品牌缺席。目前尚未聽到Apple官方有讓Safari支持http2的計(jì)劃。Apache HTTPD和Nginx這兩大流行的服務(wù)器都提供SPDY的支持,但卻沒有對(duì)提供http2的支持進(jìn)行任何表態(tài)。

Nginx表示“我們計(jì)劃于2015年末發(fā)布帶有HTTP/2支持的nginx和NGINX Plus”。而Apache已經(jīng)有一個(gè)非常早期的HTTP/2模塊,叫作mod_h2。

8.4. 對(duì)http2的常見批評(píng)

在制定協(xié)議的討論過程中有許多充滿爭(zhēng)議的地方,甚至?xí)胁簧偃苏J(rèn)為這樣的協(xié)議最終會(huì)以失敗告終。這里我想提一些對(duì)協(xié)議常見的批評(píng)和我的解釋:

8.4.1. “這個(gè)協(xié)議是Google設(shè)計(jì)制定的”

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

Google公開聲明了他們會(huì)在2016年移除Chrome里對(duì)SPDY和NPN的支持,并且極力推動(dòng)服務(wù)器遷移至HTTP/2。

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

在某種程度上,這是對(duì)的。開發(fā)http2的一個(gè)主要?jiǎng)訖C(jī)就是修復(fù)HTTP pipelining。如果在你的應(yīng)用場(chǎng)景里本來(lái)就不需要pipelining,那么確實(shí)很有可能http2對(duì)你沒有太大幫助。雖然這并不是唯一的提升,但顯然這是非常重要的一個(gè)。

一旦當(dāng)某些服務(wù)意識(shí)到在一個(gè)連接上建立多路復(fù)用流的強(qiáng)大威力時(shí),我認(rèn)為會(huì)有越來(lái)越多的程序采用http2。

小規(guī)模的REST API和采用HTTP 1.x的簡(jiǎn)單程序可能不會(huì)認(rèn)為遷移到http2能有多大的優(yōu)勢(shì)。但至少http2對(duì)絕大部分用戶來(lái)講,是幾乎沒有壞處的。

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

完全不是這樣。因?yàn)槿狈?nèi)容分發(fā)網(wǎng)絡(luò),小網(wǎng)站的網(wǎng)絡(luò)延遲往往較高,而多路復(fù)用的能力可以極大的改善在高網(wǎng)絡(luò)延遲下的體驗(yàn)。大型網(wǎng)站往往已經(jīng)將內(nèi)容分發(fā)到各處,所以速度其實(shí)更快。

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

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

Telecom和一些其他網(wǎng)絡(luò)服務(wù)商,例如ATIS開放網(wǎng)絡(luò)聯(lián)盟,表示為了為衛(wèi)星、飛機(jī)等提供的快速網(wǎng)絡(luò)體驗(yàn),他們需要一些[不加密的流量](http://www.atis.org/openweballiance/docs/OWAKickoffSlides051414.pdf )來(lái)提供caching,壓縮和其他技術(shù)。

http2并不強(qiáng)制要求使用TLS,所以我們不應(yīng)該為此擔(dān)心。

如今,很多互聯(lián)網(wǎng)使用者已經(jīng)更希望TLS能被更廣泛的使用來(lái)保護(hù)用戶隱私。

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

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

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

雖然當(dāng)我們可以直接讀出協(xié)議內(nèi)容的時(shí)候,調(diào)試和追蹤都會(huì)變得更簡(jiǎn)單。但基于文本的協(xié)議更容易產(chǎn)生錯(cuò)誤,造成更多解析的問題。

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

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

當(dāng)然,到底該如何定義和測(cè)量“快”就是另外一個(gè)話題了,但在SPDY的時(shí)代,已經(jīng)有一些實(shí)驗(yàn)證明了該協(xié)議會(huì)讓瀏覽器載入頁(yè)面更快(例如華盛頓大學(xué)的“SPDY有多快?”和Hervé Servy的“評(píng)估啟用SPDY的Web服務(wù)器性能”),同樣這些實(shí)驗(yàn)也被用來(lái)證明http2。我期待能有越來(lái)越多的測(cè)試實(shí)驗(yàn)發(fā)布。httpwatch.com也有進(jìn)行一個(gè)簡(jiǎn)單的測(cè)試來(lái)證明HTTP/2名副其實(shí)。

http2在很多的場(chǎng)景下都證明了自己更快,尤其是在包含非常多資源的高延遲的連接上。而正如之前的章節(jié)中提到,目前的趨勢(shì)就是每個(gè)網(wǎng)站包含越來(lái)越多的資源和數(shù)據(jù)。

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

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

8.4.8. “它并沒有修復(fù)很多HTTP/1.1的問題”

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

8.5. http2會(huì)被廣泛部署嗎?

現(xiàn)在還言之尚早,但我仍然要在這里做出我的預(yù)估。

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

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

我認(rèn)為建立在SPDY的基本范式之上的http2會(huì)被更廣泛的部署,畢竟它是IETF制定的協(xié)議。而SPDY因?yàn)楸池?fù)了“它是Google的協(xié)議”這個(gè)惡名,導(dǎo)致它的發(fā)展總是畏首畏腳。

在它首次發(fā)布的幕后有很多大型瀏覽器支持。來(lái)自Freifox,Chrome和IE的代表宣布了他們會(huì)發(fā)布支持http2特性的瀏覽器,并且他們已經(jīng)演示了一些能正常運(yùn)作的實(shí)現(xiàn)。

也有很多像Google,Twitter和Facebook這樣的大公司希望盡快支持http2,所以我們可以期待著很快能有支持http2的服務(wù)器(例如Apache HTTP Server和nginx)。H2o作為一個(gè)極有潛力的新生HTTP服務(wù)器,也同樣支持http2。

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

我也相信一旦規(guī)范被RFC批準(zhǔn),會(huì)有更多的實(shí)現(xiàn)雨后春筍般的涌現(xiàn)出來(lái)。

在2015年1月下旬,默認(rèn)啟用HTTP/2的Firefox 35發(fā)布后,Google也宣布Chrome 40對(duì)2%的用戶啟用了該功能。雖然他沒有告訴我們具體的數(shù)字,但HTTP/2已經(jīng)差不多占到了他們?nèi)蛄髁康?%。與此同時(shí),F(xiàn)irefox 35記錄到了9%的相應(yīng)都是HTTP/2。