Java 9 和Spring Boot 2.0紛紛宣佈支持的HTTP/2究竟是什麼?

關於HTTP/2,最近你可能沒少聽到過他,首先,若是你瞭解過Java 9的特性,那麼你會發如今Java9中,提供了新的方式來處理HTTP調用,提供了新的HTTP Client,將替代HttpURLConnection,並提供對WebSocket和HTTP/2的支持。還有前兩天剛剛發佈的Spring Boot 2.0 的新特性中,也會看到,Spring Boot 2.0支持的Web容器中Tomcat、Undertow和Jetty均已支持HTTP/2。php

那麼,這篇文章,咱們就來了解下,到底什麼是HTTP/2。html

http2.0

HTTP

超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用於分佈式、協做式和超媒體信息系統的應用層協議。設計HTTP最初的目的是爲了提供一種發佈和接收HTML頁面的方法。經過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。算法

HTTP 協議是以 ASCII 碼傳輸,基於請求與響應模式的、無狀態的,創建在 TCP/IP 協議之上的應用層規範。。它不涉及數據包(packet)傳輸,主要規定了客戶端和服務器之間的通訊格式,默認使用80端口。瀏覽器

http

HTTP協議主要的版本有3個,分別是HTTP/1.0、HTTP/1.1和HTTP/2。HTTPS是另一個協議,簡單講是HTTP的安全版。緩存

HTTP/1.0

1996年5月,HTTP/1.0 版本發佈,爲了提升系統的效率,HTTP/1.0規定瀏覽器與服務器只保持短暫的鏈接,瀏覽器的每次請求都須要與服務器創建一個TCP鏈接,服務器完成請求處理後當即斷開TCP鏈接,服務器不跟蹤每一個客戶也不記錄過去的請求。安全

請注意上面提到的HTTP/1.0中瀏覽器與服務器只保持短暫的鏈接,鏈接沒法複用。也就是說每一個TCP鏈接只能發送一個請求。發送數據完畢,鏈接就關閉,若是還要請求其餘資源,就必須再新建一個鏈接。服務器

咱們知道TCP鏈接的創建須要三次握手,是很耗費時間的一個過程。因此,HTTP/1.0版本的性能比較差。如今,隨便打開一個網頁,上面都會有不少圖片、視頻等資源,HTTP/1.0顯然沒法知足性能要求。網絡

HTTP/1.1

爲了解決HTTP/1.0存在的缺陷,HTTP/1.1於1999年誕生。相比較於HTTP/1.0來講,最主要的改進就是引入了持久鏈接。所謂的持久鏈接就是:在一個TCP鏈接上能夠傳送多個HTTP請求和響應,減小了創建和關閉鏈接的消耗和延遲。tcp

1.0-1.1

引入了持久鏈接以後,在性能方面,HTTP協議有了明顯的提高,基本能夠用於平常使用,這也是這一版本一直延用至今的緣由。固然仍是有些力不從心的,後面會詳細介紹。分佈式

關於HTTP/1.0和HTTP/1.1還有些其餘區別,這裏就不展開介紹了。網上也不少資料,能夠自行查閱。

SPDY

雖然,HTTP/1.1在HTTP/1.0的基礎上提供了持久鏈接,提高了很大的效率,可是,仍是有很大的提高空間。

正所謂時勢造英雄,正是由於HTTP存在着諸多不足,因此,才誕生了SPDY。2009年,谷歌公開了自行研發的 SPDY 協議,主要解決 HTTP/1.1 效率不高的問題。它的設計目標是下降 50% 的頁面加載時間。SPDY主要提供瞭如下功能(後文介紹HTTP2的時候再詳細介紹):

  • 多路複用(multiplexing)。多個請求共享一個tcp鏈接。
  • header壓縮。刪除或者壓縮HTTP頭
  • 服務端推送。提供服務方發起通訊,並向客戶端推送數據的機制。

SPDY位於HTTP之下,TCP和SSL之上,這樣能夠輕鬆兼容老版本的HTTP協議。

spdy

實際上在 HTTP2 提出來以前,SPDY 流行了很長一段時間。當下不少著名的互聯網公司都在本身的網站或 APP 中採用了 SPDY 系列協議(當前最新版本是 SPDY/3.1),由於它對性能的提高是顯而易見的。主流的瀏覽器(谷歌、火狐、Opera)也都早已經支持 SPDY,它已經成爲了工業標準。HTTP Working-Group 最終決定以 SPDY/2 爲基礎,開發 HTTP/2。

HTTP/2

下圖是Akamai 公司創建的一個官方的演示,主要用來講明在性能上HTTP/1.1和HTTP/2在性能升的差異。同時請求 379 張圖片,HTTP/1.1加載用時4.54s,HTTP/2加載用時1.47s。

http2

HTTP/2 是 HTTP 協議自 1999 年 HTTP 1.1 發佈後的首個更新,主要基於 SPDY 協議。由互聯網工程任務組(IETF)的 Hypertext Transfer Protocol Bis(httpbis)工做小組進行開發。該組織於2014年12月將HTTP/2標準提議遞交至IESG進行討論,於2015年2月17日被批准。HTTP/2標準於2015年5月以RFC 7540正式發表。

下面來看下,HTTP/2相對於HTTP/1.1有哪些改進:

二進制分幀

在HTTP/2中,在應用層(HTTP2.0)和傳輸層(TCP或者UDP)之間加了一層:二進制分幀層。這是HTTP2中最大的改變。HTTP2之因此性能會比HTTP1.1有那麼大的提升,很大程度上正是因爲這一層的引入。

frame-layer

在二進制分幀層中, HTTP/2 會將全部傳輸的信息分割爲更小的消息和幀(frame),並對它們採用二進制格式的編碼。

這種單鏈接多資源的方式,減小了服務端的壓力,使得內存佔用更少,鏈接吞吐量更大。並且,TCP鏈接數的減小使得網絡擁塞情況得以改善,同時慢啓動時間的減小,使擁塞和丟包恢復速度更快。

多路複用

多路複用容許同時經過單一的HTTP/2.0鏈接發起多重的請求-響應消息。在HTTP1.1協議中,瀏覽器客戶端在同一時間,針對同一域名下的請求有必定數量的限制,超過了這個限制的請求就會被阻塞。而多路複用容許同時經過單一的 HTTP2.0 鏈接發起多重的「請求-響應」消息。

多路複用

HTTP2的請求的TCP的connection一旦創建,後續請求以stream的方式發送。每一個stream的基本組成單位是frame(二進制幀)。客戶端和服務器能夠把 HTTP 消息分解爲互不依賴的幀,而後亂序發送,最後再在另外一端把它們從新組合起來。

multi

也就是說, HTTP2.0 通訊都在一個鏈接上完成,這個鏈接能夠承載任意數量的雙向數據流。就比如,我請求一個頁面 http://www.hollischuang.com 。頁面上全部的資源請求都是客戶端與服務器上的一條 TCP 上請求和響應的!

header壓縮

HTTP/1.1的header帶有大量信息,並且每次都要重複發送。HTTP/2 爲了減小這部分開銷,採用了HPACK 頭部壓縮算法對Header進行壓縮。

header

服務端推送

簡單來說就是當用戶的瀏覽器和服務器在創建鏈接後,服務器主動將一些資源推送給瀏覽器並緩存起來的機制。有了緩存,當瀏覽器想要訪問已緩存的資源的時候就能夠直接從緩存中讀取了。

push

參考資料

HTTP2.0 的總結 HTTP 1.0/1.1/2.0、HTTPS HTTP2.0,SPDY,HTTPS你應該知道的一些事 HTTP2.0關於多路複用的研究

關注個人公衆號,新鮮文章一手掌握,2000G的Java學習資源免費贈送

相關文章
相關標籤/搜索