【快速入門系列】一篇文章讓你入門HTTP2.0

引言

秋招來臨,在面試過程當中不只會問到前端知識、算法問題,網絡相關的內容也會多少涉及,被問的最多的就是「你瞭解HTTP2.0嗎?」因爲這個問題並不能很完美的回答出來,所以特意查閱了相關資料、博客,最終整理出一份通俗易懂的HTTP2.0入門文章,也算是學習筆記,但願能給看到該文章的你帶來一些收穫。html

什麼是HTTP2.0

想要了解一個事物,首先就要知道它是什麼。前端

簡單來講,HTTP/2(超文本傳輸協議第2版,最初命名爲HTTP2.0),是HTTP協議的第二個主要版本。HTTP/2是HTTP協議自1999年HTTP1.1發佈後的首個更新,主要基於SPDY協議。
HTTP2.0的特色是:在不改動HTTP語義、方法、狀態碼、URI及首部字段的狀況下,大幅度提升了web性能。程序員

什麼是SPDY協議

剛剛對HTTP2.0的介紹中引出了一個名詞 —— SPDY協議,這又是什麼呢?web

SPDY是Speedy的暱音,意爲「更快」。它是Google開發的基於TCP協議的應用層協議。目標是優化HTTP協議的性能,經過壓縮、多路複用和優先級等技術,縮短網頁的加載時間並提升安全性。SPDY協議的核心思想是儘可能減小TCP鏈接數。SPDY並非一種用於替代HTTP的協議,而是對HTTP協議的加強。面試

HTTP1.x的缺點

任何事物的更新都是爲了彌補或修復上個版本的某些問題,那麼咱們來看看HTTP1.x都有哪些缺點以致於咱們要使用HTTP2.0。算法

HTTP1.x有如下幾個主要缺點:瀏覽器

  1. HTTP/1.0一次只容許在一個TCP鏈接上發起一個請求,HTTP/1.1使用的流水線技術也只能部分處理請求併發,仍然會存在隊列頭阻塞問題,所以客戶端在須要發起屢次請求時,一般會採用創建多鏈接來減小延遲。
  2. 單向請求,只能由客戶端發起。
  3. 請求報文與響應報文首部信息冗餘量大。
  4. 數據未壓縮,致使數據的傳輸量大。

咱們能夠經過一個連接來對比一下HTTP2.0到底比HTTP1.x快了多少。連接地址安全

HTTP2.0特色

經過以上內容,你應該已經對HTTP2.0有了初步認識,而且瞭解了HTTP1.x的缺點。那麼下面咱們就來了解一下HTTP2.0的特色。服務器

二進制傳輸

HTTP2.0中全部增強性能的核心是二進制傳輸,在HTTP1.x中,咱們是經過文本的方式傳輸數據。基於文本的方式傳輸數據存在不少缺陷,文本的表現形式有多樣性,所以要作到健壯性考慮的場景必然有不少,可是二進制則不一樣,只有0和1的組合,所以選擇了二進制傳輸,實現方便且健壯。
在HTTP2.0中引入了新的編碼機制,全部傳輸的數據都會被分割,並採用二進制格式編碼。
圖片描述
爲了保證HTTP不受影響,那就須要在應用層(HTTP2.0)和傳輸層(TCP or UDP)之間增長一個二進制分幀層。在二進制分幀層上,HTTP2.0會將全部傳輸的信息分爲更小的消息和幀,並採用二進制格式編碼,其中HTTP1.x的首部信息會被封裝到Headers幀,而Request Body則封裝到Data幀。cookie

多路複用

在HTTP1.0中,咱們常常會使用到雪碧圖、使用多個域名等方式來進行優化,都是由於瀏覽器限制了同一個域名下的請求數量,當頁面須要請求不少資源的時候,隊頭阻塞(Head of line blocking)會致使在達到最大請求時,資源須要等待其餘資源請求完成後才能繼續發送。
HTTP2.0中,有兩個概念很是重要:幀(frame)和流(stream)。
幀是最小的數據單位,每一個幀會標識出該幀屬於哪一個流,流是多個幀組成的數據流。
所謂多路複用,即在一個TCP鏈接中存在多個流,便可以同時發送多個請求,對端能夠經過幀中的表示知道該幀屬於哪一個請求。在客戶端,這些幀亂序發送,到對端後再根據每一個幀首部的流標識符從新組裝。經過該技術,能夠避免HTTP舊版本的隊頭阻塞問題,極大提升傳輸性能。
圖片描述

Header壓縮

在HTTP1.0中,咱們使用文本的形式傳輸header,在header中攜帶cookie的話,每次都須要重複傳輸幾百到幾千的字節,這着實是一筆不小的開銷。
在HTTP2.0中,咱們使用了HPACK(HTTP2頭部壓縮算法)壓縮格式對傳輸的header進行編碼,減小了header的大小。並在兩端維護了索引表,用於記錄出現過的header,後面在傳輸過程當中就能夠傳輸已經記錄過的header的鍵名,對端收到數據後就能夠經過鍵名找到對應的值。

服務器Push

在HTTP2.0中,服務端能夠在客戶端某個請求後,主動推送其餘資源。
能夠想象一下,某些資源客戶端是必定會請求的,這時就能夠採起服務端push的技術,提早給客戶端推送必要的資源,就能夠相對減小一點延遲時間。在瀏覽器兼容的狀況下也可使用prefetch。

更安全

HTTP2.0使用了tls的拓展ALPN作爲協議升級,除此以外,HTTP2.0對tls的安全性作了近一步增強,經過黑名單機制禁用了幾百種再也不安全的加密算法。

額外補充:QUIC

這裏額外給你們介紹一個協議,是由Google基於UDP實現的同爲傳輸層的協議,目標是但願替代TCP協議。
該協議支持多路複用,雖說HTTP2.0也支持多路複用,可是下層仍然是TCP,由於TCP的重傳機制,只要一個包丟失就得判斷丟包而且重傳,致使發生隊頭阻塞的問題,可是UDP沒有這個限制。除此以外,它還有以下特色:

  1. 實現了本身的加密協議,經過相似TCP的TFO機制實現0-RTT,固然TLS1.3已經實現了0-RTT。
  2. 支持重傳和糾錯機制,在只丟失一個包的狀況下不須要重傳,使用糾錯機制恢復丟失的包。

    • 糾錯機制:經過異或的方式,算出發出去的數據的異或值並單獨發出一個包,服務端在發現有一個包丟失的狀況下,經過其餘數據包的異或值包算出丟失包。
    • 在丟失兩個包及以上的狀況就是用重傳機制,由於算不出來了。

結束語

以上內容是我在查閱了大量相關資料後總結的一些關於HTTP2.0的基本知識,若是還想了解更深的內容能夠去作進一步的學習。

參考資料:
InterviewMap
程序員面試必考題(二十五)---SPDY與HTTP/2協議
Http 1.x弊端與Http 2.0比較
HTTP 2.0與HTTP 1.1區別
HTTP2.0性能加強的核心:二進制分幀
相關文章
相關標籤/搜索