官术网_书友最值得收藏!

2.5 從HTTP/1.1到HTTP/2

在1999年HTTP/1.1走上歷史舞臺之后,HTTP并沒有真正發生改變。在2014年發布的RFC(Request for Comments,意見征集稿)中,再次澄清了此規范,但這個版本的規范更多的是一個文檔記錄,并沒有對協議做什么變更。工作組曾經展開過新版本的工作(HTTP-NG),該工作本應對HTTP的工作方式做完全的重新設計,但是1999年該工作被中止了。人們普遍感覺這些變化太復雜,無法推廣。

2.5.1 SPDY

2009年,Google的Mike Belshe和Robert Peon宣布,他們在開發一個叫作SPDY(發音同“speedy”,不是一個縮寫)的新協議。他們已經在實驗環境中驗證了這個協議,結果很好,頁面加載時間改善了65%。他們是在排名前25的網站的復制版本上測試的,不是虛構網站。

SPDY基于HTTP構建,沒有從根本上改變協議。就像HTTPS封裝了HTTP,但是不改變它的底層機制。HTTP方法(GETPOST等)和HTTP首部的概念在SPDY中依然存在。SPDY工作在更低的層面,并且對開發者、服務器管理員和(最重要的)用戶來說,SPDY幾乎是透明的。所有的HTTP請求簡單地被轉換為SPDY請求,發向服務器,然后再轉換回來。對于更高層的應用(像JavaScript應用)來說,SPDY請求和其他的HTTP請求一樣。另外,SPDY的實現只基于加密的HTTP(即HTTPS)。HTTPS使得在客戶端和服務器間中轉消息的網絡設施無法查看消息的結構和格式。所以,所有現存的網絡設備,如路由、交換機和其他基礎設施,不用做任何改變就能處理SPDY消息,甚至不用知道它們在處理SPDY消息還是HTTP/1消息。SPDY本質上是向后兼容的,帶來的風險和改動較少,這也是它能獲得成功而HTTP-NG失敗的一個決定性原因。

HTTP-NG嘗試解決HTTP/1的多種問題,而SPDY的主要目標是解決HTTP/1.1的性能問題。它引入了一些關鍵的概念來解決HTTP/1.1的問題:

? 流多路利用 —— 請求和響應使用單個TCP連接傳輸數據,它們被分成不同的數據包,以流的方式分組。

? 請求優先級 —— 在同時發送所有請求時,為了避免引入新的性能問題,引入了請求優先級的概念。

? HTTP首部壓縮 —— HTTP體早就可以壓縮了,現在首部也可以壓縮了。

如果像HTTP一樣,SPDY是一個基于文本的請求-響應協議,這些功能就不可能實現,所以SPDY變成了一個二進制協議。這個改動使得我們可以在一個連接上處理較小的消息,然后將它們合并為較大的HTTP消息,這跟TCP將HTTP消息拆分為TCP數據包的模式非常像,而且這種拆分對于大多數HTTP實現來說是透明的。SPDY在HTTP層實現了TCP的相關概念,所以它可以同時傳輸不同的HTTP消息。

像服務器推送這種高級功能,允許服務器返回額外的資源。如果你請求主頁面,服務器可以在主頁面的請求中推送所需要的CSS文件內容。這種方式可以節省瀏覽器再次發送CSS請求的時間,也能避免將critical CSS變為行內樣式帶來的復雜度。

Google地位超然,既擁有一個主流瀏覽器(Chrome),又手握一些流行的網站(如www.google.com),所以它可以在服務器和瀏覽器端實現新的協議,并在線上做更大規模的實驗。2010年9月,Chrome開始支持SPDY,到2011年,所有的Google服務都添加了對SPDY的支持[18]——無論從哪方面看,這個過程都堪稱迅速。

SPDY幾乎在一夜之間獲得了成功,其他瀏覽器和服務器迅速添加了對它的支持。Firefox和Opera在2012年添加了支持。在服務端,Jetty首先支持SPDY,其他像Apache和Nginx也很快添加了支持。支持SPDY的絕大多數網站都運行在后兩個Web服務器上。使用SPDY的網站(包括Twitter、Facebook和WordPress)獲得了與Google相同的性能提升。除了建立連接的性能以外,其他的性能幾乎沒有下降。據w3techs.com稱,支持SPDY的網站已經占總數的9.1%[19],但是HTTP/2問世之后,一些瀏覽器開始取消對SPDY的支持。自2018年初以來,SPDY的使用率急劇下降,如圖2.17所示。

圖2.17 自HTTP/2發布以來,SPDY的支持率下降

2.5.2 HTTP/2

SPDY證明了一件事,HTTP/1.1可以優化,這不僅僅是理論上的證明,而且有現實中大型網站的案例。2012年,IETF的HTTP工作組注意到SPDY的成功,并開始征集下一版本HTTP的提案[20]。SPDY自然成為了下一版本的基礎,因為相較于接受新的提案,它已經過現實的考驗,雖然工作組避諱這樣說(有些人會對這一立場提出異議,見第10章)。

不久(考慮新的提案)之后,2012年11月,基于SPDY發布了HTTP/2初稿[21]。在接下來的兩年內,人們對此稿進行了一些細節上的改善(特別是關于流和壓縮的使用)。在第4、5、7、8章,我們會詳細介紹其中的技術細節,這里只簡單介紹。

在2014年底,HTTP/2規范作為互聯網的標準被提出,而在2015年5月,被正式通過,這就是RFC 7450[22]。HTTP/2很快獲得了支持,主要因為它很大程度上是基于SPDY實現的,而很多瀏覽器和服務器已經實現了相關的技術。Firefox從2015年2月開始支持HTTP/2,Chrome和Opera在同年3月也添加了對它的支持。IE 11、Edge和Safari也在同年晚些時候添加了支持。

Web服務器也很快就添加了對HTTP/2的支持,而且在協議標準化的過程中產生了一些中間版本,很多服務器同時也支持這些版本。LiteSpeed[23]和H2O[24]是首批支持HTTP/2的Web服務器。到2015年底,被絕大多數互聯網用戶所使用的三大主要Web服務器(Apache、IIS和Nginx)添加了對HTTP/2的支持,盡管在默認情況下只作為實驗功能,并未開啟。

在2018年9月,根據w3tech.com的數據,已經有30.1%的網站支持HTTP/2[25]。能取得這個成果,主要是因為CDN廠商以及主流網站的支持,但是對于一個只發布三年的技術來講,已經足夠引人注目。就像第3章要講的,在服務端支持HTTP/2還需要付出一些努力。如果不是這個原因,HTTP/2的使用率還會更高。

我想要強調的是,HTTP/2已經向你走來,請盡情使用它。它已經在實際應用中得到驗證,可以顯著提高性能,而且它解決了本章中描述的HTTP/1.1的問題。

主站蜘蛛池模板: 嘉义县| 治县。| 洪泽县| 玛纳斯县| 灵山县| 阳曲县| 麻栗坡县| 高邮市| 昭觉县| 静宁县| 兴海县| 新民市| 泌阳县| 琼海市| 疏勒县| 平凉市| 廊坊市| 新郑市| 宁明县| 邵阳市| 右玉县| 玉山县| 满洲里市| 桂林市| 临夏县| 开平市| 遂平县| 恩平市| 苗栗市| 山阳县| 湖口县| 晋城| 平塘县| 洛阳市| 保定市| 称多县| 庆云县| 娱乐| 大渡口区| 沂源县| 简阳市|