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

http2 的基本概念

http2到底做了些什么呢?到多遠(yuǎn)才是HTTPbis小組工作的界限?

事實上,http2的界定非常嚴(yán)格,讓小組的工作頗為掣肘。

  • [X] 它必須維持HTTP的范式。畢竟它只是一個讓客戶端發(fā)送請求到服務(wù)器的基于TCP的協(xié)議。

  • [X] 不能改變http://https://這樣的URL,也不能對其添加新的結(jié)構(gòu)。使用這類URL的網(wǎng)站太多了,沒法指望他們?nèi)扛淖儭?/p>

  • [X] HTTP1的服務(wù)器和客戶端依然會存在很久,所以我們必須提供HTTP1到http2服務(wù)器的代理。

  • [X] 隨后,我們也要讓這種代理能夠?qū)ttp2的功能一對一的映射到HTTP 1.1的客戶端。

  • [X] 刪除或者減少協(xié)議里面那些可選的部分。雖然這并不是一個大的需求,但是SPDY和Google的團(tuán)隊會非常喜歡這點。讓協(xié)議里所有部分都成為強(qiáng)制要求的,就能防止人們在實現(xiàn)的時候偷懶,從而避免將來的問題。

  • [X] 不再使用小版本號。服務(wù)器和客戶端都必須確定自己是否完整兼容http2或者徹底不兼容。如果將來該協(xié)議需要被擴(kuò)充更變,那么新的協(xié)議將會是http3,而不是http 2.x。

5.1. http2和現(xiàn)有的URI結(jié)構(gòu)

如前所述,現(xiàn)有的URI結(jié)構(gòu)正在被HTTP 1.x使用而不能改變,所以http2也必須沿用該結(jié)構(gòu)。正因如此我們才必須找到一種方式將協(xié)議升級至http2,或者讓服務(wù)器使用http2來徹底替代舊的協(xié)議。

HTTP 1.1本身就有制定“升級”的方案:提供一個頭,讓服務(wù)器在收到舊協(xié)議請求的時候,向客戶端發(fā)送新協(xié)議的響應(yīng)。這樣做的代價是需要一次往返通信。

這個往返通信的代價是SPDY團(tuán)隊不能接受的。因為他們只實現(xiàn)了基于TLS的SPDY,所以他們也只開發(fā)了一個TLS的擴(kuò)展來簡化協(xié)議的協(xié)商。這個擴(kuò)展被稱作NPN(Next Protocol Negotiation),通過它,服務(wù)器通知客戶端所有他支持的協(xié)議,從而讓客戶端從中選擇一個合適的。

5.2. 為https://所準(zhǔn)備的http2

足夠的關(guān)注使得http2在TLS上得以正常運作,SPDY只支持TLS,所以按理說TLS也應(yīng)成為http2 必需的組件,但出乎意料的是http2僅將TLS作為可選部分。然而,全球兩大瀏覽器領(lǐng)導(dǎo)者 - Firefox和Chrome明確地表示,他們只實現(xiàn)基于TLS的http2.

只選擇TLS的原因包括了保護(hù)用戶隱私,早期的評估結(jié)果表明,將新的協(xié)議建立在TLS上更可能成功。這也是因為所有來自80端口的流量都會被當(dāng)作HTTP 1.1或者是其某個變種,而不是另外一個種全新的協(xié)議。

關(guān)于是否該強(qiáng)制使用TLS的主題在郵件組和會議上引起了不小的爭議 - 這到底是好是壞呢?不管怎么樣,對于這種備受爭議的話題請謹(jǐn)慎討論,尤其是當(dāng)你面對一個HTTPbis小組成員的時候。

類似地,還有一個激烈而長期的辯論,即當(dāng)使用TLS時http2是否應(yīng)該強(qiáng)制規(guī)定密碼列表,或者應(yīng)該建立一個黑名單,或者它根本就不需要從TLS層得到任何東西,而由TLS工作組來解決。最后規(guī)范指定TLS最低版本是1.2,并且有加密組的限制。

5.3 基于TLS之上的http2協(xié)商

Next Protocol Negotiation (NPN)是一個用來在TLS服務(wù)器上協(xié)商SPDY的協(xié)議。IETF將這個非正式標(biāo)準(zhǔn)進(jìn)行規(guī)范,從而變成了ALPN(Application Layer Protocol Negotiation)。ALPN被推廣用于http2,而SPDY客戶端和服務(wù)器仍然使用NPN。

由于NPN先誕生,而ALPN還經(jīng)歷了一些標(biāo)準(zhǔn)化過程。所以許多早期的http2客戶端和服務(wù)器在協(xié)商http2時同時實現(xiàn)了這兩者的擴(kuò)展。并且,由于SPDY使用NPN,不少服務(wù)器同時提供SPDY和http2來支持NPN和APLN。

ALPN和NPN的主要區(qū)別在于誰持有會話協(xié)議的決定權(quán),ALPN是由客戶端給服務(wù)器發(fā)送一個協(xié)議優(yōu)先級列表,由服務(wù)器最終選擇一個合適的。而NPN則正好相反,是客戶端有最終決定權(quán)。

5.4 為http://所準(zhǔn)備的http2

如前所述,對于純文本的HTTP1.1來說,協(xié)商http2的方法就是給服務(wù)器發(fā)送一個帶升級頭部的報文。如果服務(wù)器支持http2,它將回復(fù)“101 Switching”狀態(tài)碼,并從此開始在該連接上使用http2。也許你很容易就發(fā)現(xiàn)這個升級流程會造成一個完整的往返時延開銷,但好處是http2連接相比HTTP1可以被更大限度地重用和保持。

雖然有些瀏覽器廠商的發(fā)言人宣稱他們不會實現(xiàn)這種http2會話方式,但I(xiàn)E團(tuán)隊已公開表示他們會實現(xiàn),與此同時,curl已經(jīng)支持該方式。