你該用HTTP2了

更多內容,歡迎關注微信公衆號:全菜工程師小輝。公衆號回覆關鍵詞,領取免費學習資料。css

HTTP版本簡史

  • HTTP/0.9:
    (1991年)基於GET請求的文本傳輸協議
  • HTTPS:
    (1994年)安全的HTTP傳輸協議
  • HTTP/1.0:
    (1996年)增長HTTP頭、擴展PUT、POST等方法
  • HTTP/1.1:
    (1999年)長鏈接、流水線支持,最普遍使用的HTTP傳輸協議
  • SPDY:
    (2012年)針對HTTP的加強,工做在SSL層之上、HTTP層之下
  • HTTP/2:
    (2015年)二進制格式、多路複用、服務器「推送」、頭部壓縮

HTTP/2的開發基於SPDY進行躍進式改進在諸多修改中,最顯著的改進在於,HTTP/2使用了一份通過定製的壓縮算法,基於霍夫曼編碼,以此替代了SPDY的動態流壓縮算法,以免對協議的Oracle攻擊——這一類攻擊以CRIME爲表明。此外,HTTP/2禁用了諸多加密包,以保證基於TLS的鏈接的前向安全(參考Wiki)html

> 2015年9月,Google宣佈了移除對SPDY的支持,擁抱 HTTP/2,並將在Chrome 51中生效。算法

HTTP/2和HTTP/1.1的速度對比,能夠點擊查看下面兩個網頁:瀏覽器

https://http2.akamai.com/demo緩存

http://http2.cdnpe.com/index.html安全

速度對比

相比HTTP/1.1的改進

1. 解決串行的文件傳輸和隊頭阻塞問題

在HTTP/1.1中,當請求a文件時,b文件只能等待,等待a鏈接到服務器、服務器處理文件、服務器返回文件,這三個步驟。咱們假設這三步用時都是1秒,那麼a文件用時爲3秒,b文件傳輸完成用時爲6秒,依此類推。服務器

> 此項計算有一個前提條件,就是瀏覽器和服務器是單通道傳輸微信

在HTTP/1.1的協議中,因爲傳輸的request和response都是基本於文本的,這樣就會引起一個問題:全部的數據必須按順序傳輸,好比須要傳輸:hello,只能從h到o一個一個的傳輸,不能並行傳輸,由於接收端並不知道這些字符的順序,因此並行傳輸在HTTP1.1是不能實現的。併發

此外,隊頭阻塞問題在HTTP/2終於獲得解決。
隊頭阻塞問題:每一個 TCP 鏈接同時只能處理一個請求 - 響應,瀏覽器按 FIFO 原則處理請求,若是上一個響應沒返回,後續請求 - 響應都會受阻。爲了解決此問題,出現了 管線化 - pipelining 技術,可是管線化存在諸多問題,好比第一個響應慢仍是會阻塞後續響應、服務器爲了按序返回相應須要緩存多個響應占用更多資源、瀏覽器中途斷連重試服務器可能得從新處理多個請求、還有必須客戶端 - 代理 - 服務器都支持管線化。高併發

解決方案

HTTP/2引入二進制數據幀和流的概念,其中幀對數據進行順序標識,這樣瀏覽器收到數據以後,就能夠按照序列對數據進行合併,而不會出現合併後數據錯亂的狀況。一樣是由於有了序列,服務器就能夠並行的傳輸數據,這就是流所作的事情。

此外,HTTP/2裏的每一個stream均可以設置依賴 (Dependency)和權重,能夠按依賴樹分配優先級,解決了關鍵請求被阻塞的問題

二進制流

2. 解決鏈接數過多。

咱們假設Apache設置了最大併發數爲300,由於瀏覽器限制,瀏覽器發起的最大請求數爲6,也就是服務器能承載的最高併發爲50,當第51我的訪問時,就須要等待前面某個請求處理完成。

解決方案

咱們來看一下,HTTP/2的多路複用是如何解決的。 HTTP/2對同一域名下全部請求都是基於流,也就是說同一域名無論訪問多少文件,也只創建一路鏈接。一樣Apache的最大鏈接數爲300,由於有了這個新特性,最大的併發就能夠提高到300,比原來提高了6倍!

此外,HTTP/2支持服務器推送。 瀏覽器發送一個請求,服務器主動向瀏覽器推送與這個請求相關的資源,這樣瀏覽器就不用發起後續請求。 這主要是針對資源內聯作出的優化,相較於HTTP/1.1 資源內聯的優點:

  • 客戶端能夠緩存推送的資源
  • 客戶端能夠拒收推送過來的資源
  • 推送資源能夠由不一樣頁面共享
  • 服務器能夠按照優先級推送資源

服務器推送

3. Header內容冗餘問題。

Header內容內容多,並且每次請求Header不會變化太多,沒有相應的壓縮傳輸優化方案

解決方案

使用HPACK算法來壓縮首部內容。

二進制流

升級以後能夠節省的成本

  1. JS文件的合併
    咱們如今優化的一個主要方向就是儘可能的減小HTTP的請求數, 對咱們工程中的代碼,研發時分模塊開發,上線時咱們會把全部的代碼進行壓縮合並,合併成一個文件,這樣無論多少模塊,都請求一個文件,減小了HTTP的請求數。可是這樣作有一個很是嚴重的問題:文件的緩存。當咱們有100個模塊時,有一個模塊改了東西,按照以前的方式,整個文件瀏覽器都須要從新下載,不能被緩存。如今咱們有了HTTP/2了,模塊就能夠單獨的壓縮上線,而不影響其餘沒有修改的模塊。根據上面講的原理,咱們儘量將資源細粒化,文件分解地儘量散,不用擔憂請求數多

> 雪碧圖,文件合併同理能夠棄用

  1. 多域名提升瀏覽器的下載速度
    以前咱們有一個優化就是把css文件和js文件放到2個域名下面,這樣瀏覽器就能夠對這兩個類型的文件進行同時下載,避免了瀏覽器6個通道的限制,這樣作的缺點也是明顯的:
    1.DNS的解析時間會變長。
    2.增長了服務器的壓力。
    有了HTTP/2以後,請不要使用域名分片。

更多內容,歡迎關注微信公衆號:全菜工程師小輝。公衆號回覆關鍵詞,領取免費學習資料。

哎呀,若是個人名片丟了。微信搜索「全菜工程師小輝」,依然能夠找到我

相關文章
相關標籤/搜索