Java 9 和Spring Boot 2.0紛紛宣佈支援的HTTP/2到底是什麼?

HollisChuang發表於2018-03-25

關於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。

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

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請求和響應,減少了建立和關閉連線的消耗和延遲。

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學習資源免費贈送

Java 9 和Spring Boot 2.0紛紛宣佈支援的HTTP/2到底是什麼?

相關文章