簡單來講,HTTP/2(超文本傳輸協議第2版,最初命名爲HTTP2.0),是HTTP協議的第二個主要版本。HTTP/2是HTTP協議自1999年HTTP1.1發佈後的首個更新,主要基於SPDY協議。 HTTP2.0的特色是:在不改動HTTP語義、方法、狀態碼、URI及首部字段的狀況下,大幅度提升了web性能。html
先來感覺一下HTTP2.0到底比HTTP1.x快了多少。連接地址前端
SPDY是Speedy的暱音,意爲「更快」。它是Google開發的基於TCP協議的應用層協議。目標是優化HTTP協議的性能,經過壓縮、多路複用和優先級等技術,縮短網頁的加載時間並提升安全性。SPDY協議的核心思想是儘可能減小TCP鏈接數。SPDY並非一種用於替代HTTP的協議,而是對HTTP協議的加強。linux
影響一個網絡請求的因素主要有兩個,帶寬和延遲。今天的網絡基礎建設已經使得帶寬獲得極大的提高,大部分時候都是延遲在影響響應速度。web
鏈接沒法複用會致使每次請求都經歷三次握手和慢啓動。三次握手在高延遲的場景下影響較明顯,慢啓動則對文件類大請求影響較大。算法
隊頭阻塞(Head-of-line blocking或縮寫爲HOL blocking)在計算機網絡的範疇中是一種性能受限的現象。它的緣由是一列的第一個數據包(隊頭)受阻而致使整列數據包受阻。例如它有可能在緩存式輸入的交換機中出現,有可能由於傳輸順序錯亂而出現,亦有可能在HTTP流水線中有多個請求的狀況下出現。segmentfault
Head-of-line blocking會致使帶寬沒法被充分利用,以及後續健康請求被阻塞。瀏覽器
區別於 HTTP1.x 經過文本的方式傳輸數據,HTTP2.0 採用二進制傳輸。緩存
在HTTP2.0中引入了新的編碼機制,全部傳輸的數據都會被分割,並採用二進制格式編碼。安全
爲了保證HTTP不受影響,須要在應用層(HTTP2.0)和傳輸層(TCP or UDP)之間增長一個二進制分幀層。在二進制分幀層上,HTTP2.0會將全部傳輸的信息分爲更小的消息和幀,並採用二進制格式編碼,其中HTTP1.x的首部信息會被封裝到Headers幀,而Request Body則封裝到Data幀。在HTTP1.0中,咱們常常會使用到雪碧圖、使用多個域名等方式來進行優化,都是由於瀏覽器限制了同一個域名下的請求數量,當頁面須要請求不少資源的時候,隊頭阻塞(Head of line blocking)會致使在達到最大請求時,資源須要等待其餘資源請求完成後才能繼續發送。 HTTP2.0中,有兩個概念很是重要:幀(frame)和流(stream)。 幀是最小的數據單位,每一個幀會標識出該幀屬於哪一個流,流是多個幀組成的數據流。 所謂多路複用,即在一個TCP鏈接中存在多個流,便可以同時發送多個請求,對端能夠經過幀中的表示知道該幀屬於哪一個請求。在客戶端,這些幀亂序發送,到對端後再根據每一個幀首部的流標識符從新組裝。經過該技術,能夠避免HTTP舊版本的隊頭阻塞問題,極大提升傳輸性能。服務器
在HTTP1.0中,咱們使用文本的形式傳輸header,在header中攜帶cookie的話,每次都須要重複傳輸幾百到幾千的字節,這着實是一筆不小的開銷。 在HTTP2.0中,咱們使用了HPACK(HTTP2頭部壓縮算法)壓縮格式對傳輸的header進行編碼,減小了header的大小。並在兩端維護了索引表,用於記錄出現過的header,後面在傳輸過程當中就能夠傳輸已經記錄過的header的鍵名,對端收到數據後就能夠經過鍵名找到對應的值。
在HTTP2.0中,服務端能夠在客戶端某個請求後,主動推送其餘資源。 能夠想象一下,某些資源客戶端是必定會請求的,這時就能夠採起服務端push的技術,提早給客戶端推送必要的資源,就能夠相對減小一點延遲時間。在瀏覽器兼容的狀況下也可使用prefetch。
HTTP2.0使用了tls的拓展ALPN作爲協議升級,除此以外,HTTP2.0對tls的安全性作了近一步增強,經過黑名單機制禁用了幾百種再也不安全的加密算法。
在使用以前先來了解一下它的兼容性。
主流瀏覽器基本都支持 HTTP2.0,並且即便不支持,像 Nginx 是能夠自動向下兼容 HTTP 1.1 的。Nginx 配置能夠參考 Nginx 上配置 HTTP/2 簡明教程
由於有了多路複用加持,減小HTTP請求的最佳實踐再也不適用
如合併JS、CSS文件(Concatenation),多個圖片或圖標合併(Spriting),將較小的JS或CSS文件內嵌到HTML中(Inlining),合併HTML文件(Vulcanize)等。
所以在作項目優化時,要根據具體的業務場景來進行,不能一味的追求減小 HTTP 請求而增長單個請求的壓力。
參考文章: