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。
目的是在開放互聯網上增長使用加密技術,以提供強有力的保護去遏制主動攻擊。
css
一個網頁加載的時候須要一些數據(css、js、圖片等)這些請求是併發地向服務器發送的,併發的發送過程當中就須要併發地建立TCP鏈接(一個請求對應一個TCP鏈接)。
一方面瀏覽器有併發鏈接數的限制,好比chrome限制一次性最多併發6個請求;若是請求建立TCP鏈接的併發請求一次超過6個,超過的請求就必須等待前面6個請求收到服務器的返回以後才能繼續發送剩餘請求。
這種等待,就算是一種相對串行的傳輸,效率不高;另外一方面:因爲不一樣請求須要創建不一樣的TCP鏈接,同時進行6次TCP的」三次握手」,那麼建立鏈接的開銷是比較大的;
同時對於一個服務器來講,它可建立的TCP鏈接數確定是有上限的,若是每次都要建立6個TCP鏈接會致使服務器的TCP鏈接數很快被消耗完。因此在HTTP/1.1的這種方式下,數據傳輸的效率是受到很大制約的。html
那爲何不直接共用一個TCP鏈接呢?由於在HTTP/1.1裏面發送請求,在同一個TCP鏈接上發送數據必須是等待一個請求發送完成以後,才能發送第二個請求;同時服務器端也是要先把前一個請求的數據所有返回以後,才能返回第二個請求的數據。
若是在服務器中第一個請求處理(執行)特別慢,第二個請求即便比第一個請求先執行完成,也要等待第一個請求返回客戶端後,才能返回。若是在HTTP/1.1中客戶端與服務器端之間複用同一個TCP鏈接,那麼數據傳輸就是一個串行而非並行的過程,效率較低。web
能夠在同一個TCP鏈接中實現客戶端與服務器端之間多個請求的並行發送。chrome
採用分幀傳輸的數據傳輸方式。在分幀的方式中,每一幀都有上下幀的聯繫,意思是傳輸當一個http請求的信息時,並不必定要按照連續的方式進行發送,而是能夠把信息分紅不一樣的幀一塊兒發送。
若是中間的幀先到服務器,沒有關係,等服務器把請求數據所有接收完以後,會根據幀信息裏包含的前後順序,把幀進行組合,獲得一個真正的數據。得益於分幀傳輸與信道複用功能,使得在HTTP/2中,同一個鏈接能夠併發地發送多個不一樣的請求。瀏覽器
服務器能夠主動向客戶端傳輸數據:
以前的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的發送就是並行而非串行,總體的傳輸效率和性能提升了很多。網絡
官方測試網站 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總體性能提高是很是大的。