HTTP/2那些事兒

HTTP協議是全部協議簇中很是重要的一塊,隨着互聯網的不斷髮展,HTTP協議也在進行不斷的改進完善。大概通過這樣的演變:http0.9--->http1.0--->http1.1--->http2.0。同時,做爲IT行業裏的一員,理解它是很是有必要的。

什麼是HTTP協議

對於此部分,若是你不熟悉,那請繼續閱讀,若是較爲熟悉,可直接跳過該部分進入下一段。瀏覽器

超文本傳輸協議(HTTP)是一種應用層協議,目前是萬維網數據通訊的基礎。
HTTP協議基於客戶端/服務器模型。客戶端/服務器能夠解釋爲兩臺電腦,客戶端(服務接收者)與服務器(服務的提供者)之間經過請求和響應進行通訊。緩存

一個簡單的例子是飯店的客人與服務員。客人(客戶端)向服務員(服務器)點了(發送請求)一頓飯,而後服務員從餐廳廚師那裏獲取飯菜(應用程序邏輯)並將飯菜帶給客人。
這是個很簡單的生活中的例子,但對於理解這個概念是頗有用的。安全

什麼是HTTP/2

在2015年,Internet Engineering Task Force (IETF)發佈了HTTP/2,對於網絡協議HTTP來講,是最爲有用的第二個主要版本。它源自較早的實驗SPDY協議。服務器

開發HTTP/2的主要目的有:網絡

  • 協商機制(協議選擇),列如HTTP1.一、HTTP/2等
  • 與HTTP1.1更高級的兼容性-請求方式、狀態碼、URL、標頭字段等
  • 頁面加載速度的改善
  • 壓縮請求頭
  • 二進制協議
  • 服務器推送
  • 經過單個TCP鏈接請求多路複用
  • 請求管道
  • 頭部阻塞

請求多路複用

HTTP/2能夠經過單個TCP鏈接並行發送多個數據請求。這是HTTP/2協議的最高級功能,由於它容許你從一臺服務器異步下載Web文件。大多數現代瀏覽器將TCP鏈接限制爲一臺服務器。併發

11.png

這樣能夠減小額外的往返時間(RTT),使網站加載速度更快,而無需進行任何優化,而且無需進行域的分片。框架

壓縮請求頭

HTTP/2壓縮大量冗餘標頭幀,它使用HPACK規範做爲標頭壓縮的簡單安全方法。客戶端和服務器均維護先前客戶端-服務器請求中使用的標頭列表。異步

HPACK在將每一個標頭傳輸到服務器以前先壓縮每一個標頭的單獨值,而後服務器在先前傳輸的標頭值列表中查找編碼信息,以重建完整的標頭信息。性能

HPACK

二進制協議

最新的HTTP版本在功能和屬性(例如從文本協議轉換爲二進制協議)方面已經有了重大發展。HTTP1.x用文本命令來處理以完成請求-響應週期HTTP/2將使用二進制命令(分別爲1和0)執行相同的任務。此屬性減輕了框架的複雜性,並簡化了因爲包含文本和可選空格的命令而致使混淆的命令的實現。優化

瀏覽器使用HTTP/2實現其經過網絡傳輸以前,會將相同的文本命令轉換爲二進制命令

二進制協議

這樣作的好處有:

  • 解析數據的開銷低
  • 容錯性強
  • 網絡足跡更輕
  • 有效利用網絡資源
  • 消除了與HTTP1.x的文本性質相關的安全問題,例如響應拆分攻擊
  • 啓用HTTP/2的其餘功能,包括壓縮,複用,優先級劃分,流控制和TLS的有效處理
  • 命令的緊湊呈現,更易於處理和實現
  • 在客戶端和服務器之間的數據處理方面高效而強大
  • 減小網絡延遲並提升吞吐量

HTTP/2服務器推送

此功能使服務器能夠向客戶端發送未請求但在未來的請求中能夠預期的其餘可緩存信息。若是客戶端請求資源X,而且能夠理解請求的文件引用了資源Y,則服務器能夠選擇將Y與X一塊兒推送,而不是等待適當的客戶端請求。

服務器推送

那麼服務器推送都有哪些好處呢?

  • 客戶端將推送的資源保存在緩存中
  • 客戶端能夠跨不一樣頁面重用這些緩存的資源
  • 服務器能夠在同一TCP鏈接中將推送的資源與原始請求的信息進行多路複用
  • 服務器能夠肯定推送資源的優先級-HTTP/2與HTTP1的關鍵性能差別
  • 客戶端能夠拒絕推送資源以維護有效的緩存資源存儲庫,或者徹底禁用服務器推送
  • 客戶端還能夠限制併發多路複用的推送流的數量

對於HTTP/1.1和HTTP/2協議,略有不一樣。繼續以上面客人到餐廳吃飯的例子爲例。想象一下,服務員是TCP鏈接,你想點餐和一瓶水。對於HTTP/1.1來講,你想服務員請求了餐點和一瓶水,所以你將分配到兩個TCP鏈接。對於HTTP/2,這意味着你只要求兩個服務,同一個服務員。但服務員將它們分開攜帶。你僅分配一個TCP鏈接,這已經致使較低的服務器負載,另外,服務器還將爲下一個客戶端(客人)準備一個額外的空閒鏈接(服務員)。

做爲這些機制的簡單展現,我作了一個簡單的頁面示例。

服務器推送

咱們這裏是一個簡單的頁面,其中包含100張勾選圖像,我將用它們來演示HTTP/1.1,HTTP/2和HTTP/2服務器推送。

上圖中須要注意的重要一點是請求數,加載時間,協議列,發起器欄和瀑布圖自己(很遺憾,咱們能夠看到如何經過批處理髮出請求,可是很難從中看到其餘數據和內容下載時間;例如資源調度和鏈接開始時間)。

對於HTTP/1.1

HTTP1.1服務器推送

請求數:102
加載時間:12.97秒
協議:"HTTP/1.1"
發起器欄:第一個發起者是用戶/客戶端,其他請求由對客戶端的響應發起,客戶端意識到客戶端須要其餘資源(在這種狀況下爲圖像)
瀑布圖:咱們能夠看到如何經過多個批次(TCP鏈接)發出請求

對於HTTP/2

HTTP2服務器推送

請求數:102
加載時間:11.19秒
協議:「h2」 (HTTP/2)
發起器欄:第一個發起者是用戶/客戶端,其他請求則由對客戶端的響應發起,客戶端意識到本身須要其餘資源(在這種狀況下爲圖像)
瀑布圖:咱們能夠看到如何經過2個批次(TCP鏈接)發出請求

注意加載時間。在這種狀況下,它比HTTP/1.1示例的加載時間要短一些,但沒必要老是如此。此示例顯示了客戶端請求的多路複用。

對於HTTP2服務器推送

HTTP2

請求數:102
加載時間:3.17秒
協議:「h2」 (HTTP/2)
發起器欄:第一個發起者是用戶/客戶端,其他請求經過服務器的推送來發起(其實是一個請求/響應週期)
瀑布圖:咱們能夠看到如何經過1個批處理(1個TCP鏈接)發出請求。

瀏覽器兼容性

瀏覽器兼容

大多數現代瀏覽器徹底支持HTTP/2協議,但Opera mini(全部版本)和Android的UC瀏覽器除外(紅色)。也有部分支持的產品(淺綠色),例如IE11。

寫在後面

ps:各位在深圳工做的同行朋友們,若是大家所在的公司缺產品經理崗,尤爲是南山或者福田區的,還請麻煩各位小夥伴私信我下,一位好友最近在找產品崗的工做,謝謝。

相關文章
相關標籤/搜索