1. 程式人生 > >HTTP/2簡介

HTTP/2簡介

1.HTTP/2的定義:


HTTP/2即超文字傳輸協議2.0,是HTTP/1.1下一代的協議。是由網際網路工程任務組(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小組進行開發。
是自1999年HTTP/1.1釋出後的首個更新。HTTP/2.0在2013年8月進行首次合作共事性測試。在開放網際網路上HTTP/2.0將只用於"https://" 網址,而 "http://" 網址將繼續使用HTTP/1。
目的是在開放網際網路上增加使用加密技術,以提供強有力的保護去遏制主動攻擊。

2.HTTP/1.1的不足:


一個網頁載入的時候需要一些資料(css、js、圖片等)這些請求是併發地向伺服器傳送的,併發的傳送過程中就需要併發地建立TCP連線(一個請求對應一個TCP連線)。
一方面瀏覽器有併發連線數的限制,比如chrome限制一次性最多併發6個請求;如果請求建立TCP連線的併發請求一次超過6個,超過的請求就必須等待前面6個請求收到伺服器的返回之後才能繼續傳送剩餘請求。
這種等待,就算是一種相對序列的傳輸,效率不高;另一方面:由於不同請求需要建立不同的TCP連線,同時進行6次TCP的”三次握手”,那麼建立連線的開銷是比較大的;
同時對於一個伺服器來說,它可建立的TCP連線數肯定是有上限的,如果每次都要建立6個TCP連線會導致伺服器的TCP連線數很快被消耗完。所以在HTTP/1.1的這種方式下,資料傳輸的效率是受到很大制約的。

那為什麼不直接共用一個TCP連線呢?因為在HTTP/1.1裡面傳送請求,在同一個TCP連線上傳送資料必須是等待一個請求傳送完成之後,才能傳送第二個請求;同時伺服器端也是要先把前一個請求的資料全部返回之後,才能返回第二個請求的資料。
如果在伺服器中第一個請求處理(執行)特別慢,第二個請求即使比第一個請求先執行完成,也要等待第一個請求返回客戶端後,才能返回。如果在HTTP/1.1中客戶端與伺服器端之間複用同一個TCP連線,那麼資料傳輸就是一個序列而非並行的過程,效率較低。

3.HTTP/2的優勢:


通道複用

可以在同一個TCP連線中實現客戶端與伺服器端之間多個請求的並行傳送。

分幀傳輸

採用分幀傳輸的資料傳輸方式。在分幀的方式中,每一幀都有上下幀的聯絡,意思是傳輸當一個http請求的資訊時,並不一定要按照連續的方式進行傳送,而是可以把資訊分成不同的幀一起傳送。
如果中間的幀先到伺服器,沒有關係,等伺服器把請求資料全部接收完之後,會根據幀資訊裡包含的先後順序,把幀進行組合,得到一個真正的資料。得益於分幀傳輸與通道複用功能,使得在HTTP/2中,同一個連線可以併發地傳送多個不同的請求。

Sever Push

伺服器可以主動向客戶端傳輸資料:

之前的HTTP版本伺服器只能接收客戶端傳送的請求,並根據請求返回資料。而不能主動地自發地向客戶端傳送資料,但是HTTP/2實現。


總的來說:在HTTP/2中,得益於通道複用與分幀傳輸的好處,網站開啟HTTP/2之後,每一個使用者訪問一個網站(網站會向伺服器請求各種網頁資源)的時候,永遠只需要在瀏覽器(客戶端)和伺服器之間建立一個TCP連線。
因為在HTTP/2中一個TCP連線上完全可以實現資料的併發傳送與返回,沒有阻塞等待的過程,而且伺服器端還能根據需求主動地向客戶端(瀏覽器)推送一些資訊,這就是HTTP2的優勢。

舉個例子:我們知道一個web頁面載入會要求一些html、css、js等檔案,它們都是以連結的形式在html文本里面顯示的,通過瀏覽器解析了html裡面的內容之後,再根據連結裡面包含的URL地址再去請求對應的css和js檔案。
在HTTP/2之前,這裡個傳輸過程會存在一個順序問題。需要先請求到html的文字然後在瀏覽器裡面執行解析了這個文字之後,我們才能去傳送css的請求和js的請求。
HTTP/2中有了推送(Sever Push)功能之後,在請求html的同時,伺服器端可以主動把html裡面所引用到的css和js檔案通過同一個TCP連線並行地推送到瀏覽器(客戶端)。
這樣html、css和js的傳送就是並行而非序列,整體的傳輸效率和效能提高了不少。

4.HTTP/2效能測試:


官方測試網站 https://http2.akamai.com/demo/http2-lab.html
官網提供了多種版本的對比測試有HTTP1.1與HTTP2的比較,還有伺服器端推送(server-push)不同個數之間的比較:(由於網路延遲不同,測試結果或有差異)

  • HTTP1.1與HTTP2的對比:Compare HTTP1.1 (HTTP) vs HTTP2 (HTTPS):

    可以看到分別使用HTTP/1.1和HTTP/2載入同一張由多張小圖片組成的大圖片:HTTP/1.1用了39.45s,而HTTP/2只用了5.56s。HTTP2比HTTP/1.1快了將近7倍。
    因為為了載入這張大圖,需要請求許多的小圖,HTTP/1.1採用的是序列地請求,所以速度要比採用並行請求的HTTP/2要慢上許多。

  • HTTP2中伺服器端發出推送(server-push)個數不同的比較:Compare HTTP2 vs HTTP2 server-push (30 objects pushed):

    可以看到同是HTTP/2,不使用Server Push的用時44.36s,使用Server Push的用時35.14s。使用Server Push與否對HTTP/2效能的影響不大。HTTP/2整體的效能提升主要在於整體的通道複用和分幀傳輸的設計上。
    這使得客戶端與伺服器之間只需要一個TCP連線併發地傳送資料了。所以整體來說,對比於HTTP/1.1整體效能提升是非常大的。


這就是HTTP/2:For Faster and Safer Internet 通道複用和分幀傳輸提升了速度,以HTTPS為前提提供了安全