HTTP/2有三大特性:頭部壓縮、Server Push、多路複用。前兩個特性意思比較明確,也好理解,惟有多路複用不太好理解,尤爲是和HTTP1.1進行對比的時候,這個問題我想了很長時間,也對比了很長時間,如今把思考的結果分享出來,但願對你們有幫忙。css
在沒有Keep-Alive
前,咱們與服務器請求數據的流程是這樣:nginx
//static.mtime.cn/a.js
-->解析域名-->HTTP鏈接-->服務器處理文件-->返回數據-->瀏覽器解析、渲染文件//static.mtime.cn/b.js
-->解析域名-->HTTP鏈接-->服務器處理文件-->返回數據-->瀏覽器解析、渲染文件這個流程最大的問題就是:每次請求都會創建一次HTTP鏈接,也就是咱們常說的3次握手4次揮手,這個過程在一次請求過程當中佔用了至關長的時間,並且邏輯上是非必需的,由於不間斷的請求數據,第一次創建鏈接是正常的,之後就佔用這個通道,下載其餘文件,這樣效率多高啊!你猜對了,這就是Keep-Alive
。瀏覽器
Keep-Alive
解決的問題Keep-Alive
解決的核心問題:必定時間內,同一域名屢次請求數據,只創建一次HTTP請求,其餘請求可複用每一次創建的鏈接通道,以達到提升請求效率的問題。這裏面所說的必定時間是能夠配置的,無論你用的是Apache
仍是nginx
。緩存
HTTP1.1
仍是存在效率問題如上面所說,在HTTP1.1
中是默認開啓了Keep-Alive
,他解決了屢次鏈接的問題,可是依然有兩個效率上的問題:性能優化
Apache
設置了最大併發數爲300,由於瀏覽器限制,瀏覽器發起的最大請求數爲6,也就是服務器能承載的最高併發爲50,當第51我的訪問時,就須要等待前面某個請求處理完成。HTTP/2的多路複用就是爲了解決上述的兩個性能問題,咱們來看一下,他是如何解決的。服務器
HTTP1.1
的協議中,咱們傳輸的request
和response
都是基本於文本的,這樣就會引起一個問題:全部的數據必須按順序傳輸,好比須要傳輸:hello world
,只能從h
到d
一個一個的傳輸,不能並行傳輸,由於接收端並不知道這些字符的順序,因此並行傳輸在HTTP1.1
是不能實現的。HTTP/2
引入二進制數據幀
和流
的概念,其中幀對數據進行順序標識,以下圖所示,這樣瀏覽器收到數據以後,就能夠按照序列對數據進行合併,而不會出現合併後數據錯亂的狀況。一樣是由於有了序列,服務器就能夠並行的傳輸數據,這就是流
所作的事情。併發
HTTP/2
對同一域名下全部請求都是基於流
,也就是說同一域名無論訪問多少文件,也只創建一路鏈接。一樣Apache
的最大鏈接數爲300,由於有了這個新特性,最大的併發就能夠提高到300,比原來提高了6倍!HTTP/2
了HTTP/2
了,模塊就能夠單獨的壓縮上線,而不影響其餘沒有修改的模塊。HTTP/2
以後,根據上面講的原理,咱們就不用這麼搞了,成本會更低。