HTTP/2 學習

HTTP/2 是什麼?

HTTP/2 就是 HTTP 協議的新版本,於 2015 年發佈。目前主流瀏覽器基本都支持該協議,而不少網站也已經遷移到了 HTTP/2 上。javascript

HTTP/2 的前身是由 Google 與 2009 年發佈的實驗性協議 SPDY,其主要目標是 「經過解決 HTTP/1.1 中廣爲人知的一些性能限制來減小網頁的加載延遲」css

現有的 HTTP/1.1 的主要性能問題包括:html

  • HTTP/1.x 客戶端須要使用多個鏈接才能實現併發和縮短延遲
  • HTTP/1.x 不會壓縮請求和響應標頭,從而致使沒必要要的網絡流量
  • HTTP/1.x 不支持有效的資源優先級,導致底層 TCP 鏈接的利用率低下
  • ...

注:摘自「HTTP/2 簡介」java

爲提升性能,而且保持現有的 HTTP 語義和功能不變(這樣先後端能夠不作更改就能利用 HTTP/2 提供的性能優化),HTTP/2 進行了如下主要優化:git

  • 多路複用的單一長鏈接:提升吞吐量
  • 頭部壓縮和二進制格式:減小傳輸量
  • 服務端推送Server Push:提早獲取資源

注:參考「HTTP 2 的新特性你 get 了嗎? - 知乎github

詳細介紹請閱讀這篇文章:web

HTTP/2 簡介 - Google Developers

這篇文章圖文並茂,講得也很是全面,完整的英文版在這:npm

HTTP/2 - High Performance Browser Networking
做者 Ilya Grigorik

瀏覽器與服務器是怎樣創建 HTTP/2 鏈接的呢?

瀏覽器與服務器並不肯定對方必定支持 HTTP/2,因此會有一個「協商」的過程。後端

HTTP/1.1 引入了 Update 機制,使得客戶端和服務器能夠協商升級到其餘協議,例如 WebSocket 協議。固然,也能夠採用這種機制來升級到 HTTP/2。瀏覽器

不過 HTTP/2 和 HTTPS 一般是一塊兒使用的,其中一個好處就是,HTTPS 創建鏈接過程當中,本就有協商的過程,因此能夠在這個過程當中加入 HTTP 協議的協商。

Google 在 SPDY 協議中開發了 NPN 的 TLS 擴展,隨着 SPDY 被 HTTP/2 取代,NPN 也被官方修訂爲 ALPN(Application Layer Protocol Negotiation,應用層協議協商)。

ALPN 的目的就是在創建 HTTPS 鏈接過程當中,順便進行協議的協商,好比升級到 HTTP/2。

固然,須要客戶端和服務器端都支持 ALPN,不支持的話仍是能夠經過 HTTP Upgrade 進行協議升級。

詳細內容請閱讀:

談談 HTTP/2 的協議協商機制 - Jerry Qu

實踐

Node.js 從 v8.4.0 開始支持 HTTP/2,一個簡化的 HTTP/2 server push 示例:

const http2 = require('http2')

http2.createSecureServer({
  key: fs.readFileSync('localhost-private.pem'),
  cert: fs.readFileSync('localhost-cert.pem')
})

h2server.on('stream', (stream, headers) => {
  const path = headers[':path']

  if (path === '/') {
    stream.pushStream({':path': '/index.css'}, (pushStream) => {
      stream.respondWithFile('index.css', {
        'content-type': 'text/css'
      })
    })

    stream.respondWithFile('index.html', {
      'content-type': 'text/html'
    })
  }
})

http2.listen(443)

試着寫了一個簡單的 HTTP/2 DEMO,能夠本地運行後驗證下 HTTP/2 的一些特性:

http2-demo - github

下載到本地後,執行:

npm start

而後訪問本地的 https://localhost:8001/https://localhost:8002/ 就能夠分別查看 DEMO 頁面的 HTTP/1 和 HTTP/2 版本了。

注意:須要 Node.js 高於 v8.4.0 的版本。
相關文章
相關標籤/搜索