隨着web技術的飛速發展,1999年制定的HTTP 1.1已經沒法知足你們對性能的要求,Google推出協議SPDY,旨在解決HTTP 1.1中廣爲人知的性能問題。SPDY獲得了Chrome、Firefox和Opera的支持,不少大型網站(如谷歌、Twitter、Facebook、淘寶)都對兼容客戶端使用SPDY。SPDY在被行業採用並證實可以大幅提高性能以後,已經具有了成爲一個標準的條件。html
HTTP工做組採用了SPDY v2草案做爲制定HTTP 2.0標準的起點,2014年12月將HTTP/2標準提議遞交至IESG進行討論,於2015年2月17日被批准。HTTP/2標準於2015年5月以RFC 7540正式發表。至此,SPDY完成了歷史的使命,即將退出歷史的舞臺,HTTP/2粉墨登場。git
在HTTP的語義、HTTP方法、狀態碼、URI和首部字段等核心概念不變的狀況下,HTTP/2實現了性能優化,HTTP/2具體有哪些變化呢?下面一一解答 O(∩_∩)O~github
HTTP1.x以換行符做爲純文本的分隔符。web
HTTP/2將全部傳輸的信息分割爲更小的消息和幀,並對它們採用二進制格式的編碼,咱們先了解幾個概念:瀏覽器
在HTTP/2中,數據流以消息的形式發送,而消息由一個或多個幀組成,幀能夠在數據流上亂序發送,而後再根據每一個幀首部的流標識符從新組裝。二進制分幀是HTTP/2的基石,其餘優化都是在這一基礎上來實現的。緩存
HTTP1.x中,若是想併發多個請求,必須使用多個TCP連接,且瀏覽器爲了控制資源,還會對單個域名有6-8的個數限制,以下圖,紅色圈出來的請求就因域名連接數已超過限制,而被掛起等待了一段時間:
![]()
針對這一問題,咱們作了不少優化,例如合併請求、圖片精靈、散列域名等性能優化
在 HTTP/2 中,有了二進制分幀以後,HTTP 2.0再也不依賴TCP連接去實現多流並行了,在HTTP/2:服務器
這一特性,性能會有極大的提高,由於:cookie
在HTTP/2中,每一個請求均可以帶一個31bit的優先值,0表示最高優先級, 數值越大優先級越低。有了這個優先值,客戶端和服務器就能夠在處理不一樣的流時採起不一樣的策略,以最優的方式發送流、消息和幀。併發
Server push是HTTP/2中一個很強大的功能:
有了這一特性,咱們能夠作什麼?
HTTP每一次通訊都會攜帶一組頭部,用於描述此次通訊的的資源、瀏覽器屬性、cookie等,例如
在HTTP 1.x中,這些信息都是以純文本協議發送的,給每一個請求增長了不小的負荷。
爲了減小這塊的開銷並提高性能, HTTP/2會壓縮這些首部:
例如:下圖中的兩個請求, 請求一發送了全部的頭部字段,第二個請求則只須要發送差別數據,這樣能夠減小冗餘數據,下降開銷。
咱們來看一個實際的例子,下面是用WireShark抓取的訪問google首頁的包:
上圖是是訪問https://www.google.com/抓到的第一個請求的頭部,能夠看到頭部的內容,總共佔用了437 bytes,咱們選中頭部的cookie,能夠看到cookie總共佔用了118 bytes。接下來咱們看看第二個請求的頭部:
從上圖能夠看到,得益於頭部壓縮,第二個請求中cookie只佔用了1個字節,咱們來看看變化了的Accept字段:
因爲Accept字段與請求一中的內容不一樣,須要發送給服務器,因此佔用了29 bytes。
客戶端、服務器都須要升級才能支持HTTP 2.0,升級過程當中就存在HTTP1.一、HTTP 2.0並存的狀況,然而他們都使用的80端口,那麼如何來選擇使用什麼協議通訊呢?
APLN就是爲了解決這個問題的,經過協商來選擇通訊的協議:
GET /page HTTP/1.1
Host: server.example.com
Connection: Upgrade, HTTP2-Settings
Upgrade: HTTP/2.0
HTTP2-Settings: (SETTINGS payload)
HTTP/1.1 200 OK
Content-length: 243
Content-type: text/html
(... HTTP 1.1 response ...)
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: HTTP/2.0
(... HTTP 2.0 response ...)
使用協議協商,不管是哪種狀況,都不須要額外的往返,若是客戶端經過記錄或者其餘方式,知道服務器支持HTTP/2,則直接使用HTTP/2通訊,無需再協議協商。
最後,簡而概之,HTTP/2的經過支持請求與響應的多路複用來減小延遲,經過壓縮HTTP首部字段將協議開銷降至最低,同時增長對請求優先級和服務器端推送的支持。
HTTP/2性能獲得了極大的提高,咱們在HTTP 1.1時代作的有些優化反而成了雞肋,在升級過程當中,如何讓HTTP/2 和 HTTP 1.1的用戶都能獲得最優的性能,這是對於咱們的另一大挑戰。
參考資料: