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用了7.41s,而HTTP/2只用了1.47s。HTTP2比HTTP/1.1快了將近5倍。
因為為了加載這張大圖,需要請求許多的小圖,HTTP/1.1采用的是串行地請求,所以速度要比采用並行請求的HTTP/2要慢上許多。 -
HTTP2中服務器端發出推送(server-push)個數不同的比較:Compare HTTP2 vs HTTP2 server-push (30 objects pushed):
可以看到同是HTTP/2,不使用Server Push的用時1.43s,使用Server Push的用時1.40s。使用Server Push與否對HTTP/2性能的影響不大。HTTP/2整體的性能提升主要在於整體的信道復用和分幀傳輸的設計上。
這使得客戶端與服務器之間只需要一個TCP連接並發地發送數據了。所以整體來說,對比於HTTP/1.1整體性能提升是非常大的。