HTTP/2 相比于 HTTP/1,可以說是大幅度提高了網頁的性能。
在 HTTP/1 中,為了性能考慮,我們會引入雪碧圖、將小圖內聯、使用多個域名等等的方式。這一切都是因為瀏覽器限制了同一個域名下的請求數量(Chrome 下一般是限制六個連接),當頁面中需要請求很多資源的時候,隊頭阻塞(Head of line blocking)會導致在達到最大請求數量時,剩余的資源需要等待其他資源請求完成后才能發起請求。
在 HTTP/2 中引入了多路復用的技術,這個技術可以只通過一個 TCP 連接就可以傳輸所有的請求數據。多路復用很好的解決了瀏覽器限制同一個域名下的請求數量的問題,同時也接更容易實現全速傳輸,畢竟新開一個 TCP 連接都需要慢慢提升傳輸速度。
大家可以通過 [該鏈接](https://link.juejin.im/?target=https%3A%2F%2Fhttp2.akamai.com%2Fdemo) 感受下 HTTP/2 比 HTTP/1 到底快了多少。

在 HTTP/1 中,因為隊頭阻塞的原因,你會發現發送請求是長這樣的

在 HTTP/2 中,因為可以復用同一個 TCP 連接,你會發現發送請求是長這樣的

## 二進制傳輸
HTTP/2 中所有加強性能的核心點在于此。在之前的 HTTP 版本中,我們是通過文本的方式傳輸數據。在 HTTP/2 中引入了新的編碼機制,所有傳輸的數據都會被分割,并采用二進制格式編碼。

## 多路復用
在 HTTP/2 中,有兩個非常重要的概念,分別是幀(frame)和流(stream)。
幀代表著最小的數據單位,每個幀會標識出該幀屬于哪個流,流也就是多個幀組成的數據流。
多路復用,就是在一個 TCP 連接中可以存在多條流。換句話說,也就是可以發送多個請求,對端可以通過幀中的標識知道屬于哪個請求。通過這個技術,可以避免 HTTP 舊版本中的隊頭阻塞問題,極大的提高傳輸性能。

## Header 壓縮
在 HTTP/1 中,我們使用文本的形式傳輸 header,在 header 攜帶 cookie 的情況下,可能每次都需要重復傳輸幾百到幾千的字節。
在 HTTP /2 中,使用了 HPACK 壓縮格式對傳輸的 header 進行編碼,減少了 header 的大小。并在兩端維護了索引表,用于記錄出現過的 header ,后面在傳輸過程中就可以傳輸已經記錄過的 header 的鍵名,對端收到數據后就可以通過鍵名找到對應的值。
## 服務端 Push
在 HTTP/2 中,服務端可以在客戶端某個請求后,主動推送其他資源。
可以想象以下情況,某些資源客戶端是一定會請求的,這時就可以采取服務端 push 的技術,提前給客戶端推送必要的資源,這樣就可以相對減少一點延遲時間。當然在瀏覽器兼容的情況下你也可以使用 prefetch 。