http2到底做了些什么呢?而HTTPbis小組究竟又應(yīng)該把它制定到什么樣的程度呢?
事實(shí)上,http2有著非常嚴(yán)格的邊界,這也給小組成員的創(chuàng)新帶來(lái)了些許限制。
http2必須維持HTTP的范式。畢竟它只是一個(gè)讓客戶端發(fā)送請(qǐng)求到服務(wù)器的基于TCP的協(xié)議。
不能改變 http:// 和 https:// 這樣的URL,也不能對(duì)其添加新的結(jié)構(gòu)。使用這類URL的網(wǎng)站太多了,沒法指望他們?nèi)扛淖儭?/p>
HTTP1的服務(wù)器和客戶端依然會(huì)存在很久,所以我們必須提供HTTP1到http2服務(wù)器的代理。
隨后,我們也要讓這種代理能夠?qū)ttp2的功能一對(duì)一的映射到HTTP 1.1的客戶端。
刪除或者減少協(xié)議里面那些可選的部分。雖然這并不算的上是一個(gè)需求,但是SPDY和Google的團(tuán)隊(duì)都非常喜歡這點(diǎn)。通過讓協(xié)議里所有的內(nèi)容都成為了強(qiáng)制性要求,可以防止人們?cè)趯?shí)現(xiàn)的時(shí)候偷懶,從而規(guī)避一些將來(lái)可能會(huì)發(fā)生的問題。
不再使用小版本號(hào)。服務(wù)器和客戶端都必須確定自己是否完整兼容http2或者徹底不兼容。如果將來(lái)該協(xié)議需要被擴(kuò)充或者變更,那么新的協(xié)議將會(huì)是http3,而不是http 2.x。
如上所述,現(xiàn)有的URI結(jié)構(gòu)正在被HTTP 1.x使用而不能被更換,所以http2也必須沿用該結(jié)構(gòu)。因此不得不找到一種方式將使用的協(xié)議升級(jí)至http2,比如可以要求服務(wù)器讓它作響應(yīng)時(shí)使用http2來(lái)替代舊的協(xié)議。
HTTP 1.1本身就制定過“升級(jí)”的方案:提供一個(gè)首部字段,表示允許服務(wù)器在收到舊協(xié)議請(qǐng)求的同時(shí),可以向客戶端發(fā)送新協(xié)議的響應(yīng)。但這一方案往往需要花費(fèi)一次額外的往返通信來(lái)作為升級(jí)的代價(jià)。
而這一代價(jià)是SPDY團(tuán)隊(duì)不想接受的。因?yàn)樗麄冎粚?shí)現(xiàn)了基于TLS的SPDY,所以他們開發(fā)了一個(gè)TLS的擴(kuò)展去簡(jiǎn)化協(xié)議的協(xié)商。這個(gè)擴(kuò)展被稱作NPN(Next Protocol Negotiation),借助于此,服務(wù)器會(huì)通知客戶端所有它支持的協(xié)議,讓客戶端從中選擇一個(gè)合適的來(lái)進(jìn)行通訊。
有相當(dāng)多的人關(guān)注到了http2可以在TLS上正常的運(yùn)作,而SPDY依賴于TLS,所以按理說(shuō)TLS也應(yīng)成為http2 必需的組件,不過出乎大家意料的是http2將TLS標(biāo)記成了可選。然而,全球兩大瀏覽器領(lǐng)導(dǎo)者 —— Firefox和Chrome都明確地表示,他們只會(huì)實(shí)現(xiàn)基于TLS的http2.
選擇TLS的原因的其中之一是希望保護(hù)以及尊重用戶的隱私,而早期的評(píng)估結(jié)果也表明,在TLS上建立新的協(xié)議更有可能獲得成功。而這其中部分原因是人們普遍認(rèn)為任何來(lái)自80端口的流量都是基于HTTP 1.1亦或者是其某個(gè)變種的,而不是另外一種全新的協(xié)議。
關(guān)于是否應(yīng)該強(qiáng)制使用TLS的主題在郵件組內(nèi)和會(huì)議上引起了不小的爭(zhēng)議 —— 這到底是好是壞呢?不管怎么樣,對(duì)于這種備受爭(zhēng)議的話題還是請(qǐng)謹(jǐn)慎討論,尤其是當(dāng)你面對(duì)一個(gè)HTTPbis小組成員的時(shí)候。
諸如此類,還有一個(gè)激烈而長(zhǎng)期的討論,即:如果選擇了使用TLS,那http2是否應(yīng)該強(qiáng)制規(guī)定密碼列表,也許應(yīng)該建立起一個(gè)黑名單,又或者它根本就不需要從TLS層得到任何東西。不過這個(gè)問題還是留給TLS工作組去解決吧,最后的規(guī)范中指定了TLS最低版本為1.2,并且會(huì)有加密組的限制。
Next Protocol Negotiation (NPN)是一個(gè)用來(lái)在TLS服務(wù)器上協(xié)商SPDY的協(xié)議。IETF將這個(gè)非正式標(biāo)準(zhǔn)進(jìn)行規(guī)范化,從而演變成了ALPN(Application Layer Protocol Negotiation)。ALPN會(huì)隨著http2的應(yīng)用被推廣,而SPDY的客戶端與服務(wù)器則會(huì)繼續(xù)使用NPN。
由于NPN先于ALPN誕生,而ALPN又經(jīng)歷了一些標(biāo)準(zhǔn)化過程,所以許多早期的http2客戶端和服務(wù)器在協(xié)商http2時(shí)會(huì)將這兩者同時(shí)實(shí)現(xiàn)。與此同時(shí),考慮到SPDY會(huì)使用NPN,而許多服務(wù)器又會(huì)同時(shí)提供SPDY以及http2,所以在這些服務(wù)器上同時(shí)支持ALPN以及NPN顯然會(huì)成為最理所當(dāng)然的選擇。
ALPN和NPN的主要區(qū)別在于:誰(shuí)來(lái)決定通信協(xié)議。在ALPN的描述中,是讓客戶端先發(fā)送一個(gè)協(xié)議優(yōu)先級(jí)列表給服務(wù)器,由服務(wù)器最終選擇一個(gè)合適的。而NPN則正好相反,客戶端有著最終的決定權(quán)。
正如我們之前所提到的,對(duì)于純文本的HTTP1.1來(lái)說(shuō),協(xié)商http2的方法就是通過給服務(wù)器發(fā)送一個(gè)帶升級(jí)頭部的報(bào)文。如果服務(wù)器支持http2,它將以“101 Switching”作為回復(fù)的狀態(tài)碼,并從此開始在該連接上使用http2。也許你很容易就發(fā)現(xiàn)這樣一個(gè)升級(jí)的流程會(huì)需要消耗掉一整個(gè)的往返時(shí)延,但好處是http2連接相比HTTP1可以被更大限度地重用和保持。
雖然有些瀏覽器廠商的發(fā)言人宣稱他們不會(huì)實(shí)現(xiàn)這樣的http2會(huì)話方式,但I(xiàn)E團(tuán)隊(duì)已公開表示他們會(huì)實(shí)現(xiàn),與此同時(shí),curl也已經(jīng)支持了這種方式。
更多建議: