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。
那么,這篇文章,我們就來了解下,到底什么是HTTP/2。
HTTP
超文本傳輸協議(英文:HyperText Transfer Protocol,縮寫:HTTP)是一種用于分布式、協作式和超媒體信息系統的應用層協議。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。通過HTTP或者HTTPS協議請求的資源由統一資源標識符(Uniform Resource Identifiers,URI)來標識。
HTTP 協議是以 ASCII 碼傳輸,基于請求與響應模式的、無狀態的,建立在 TCP/IP 協議之上的應用層規范。它不涉及數據包(packet)傳輸,主要規定了客戶端和服務器之間的通信格式,默認使用80端口。
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請求和響應,減少了建立和關閉連接的消耗和延遲。
引入了持久連接之后,在性能方面,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協議。
實際上在 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。
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有那么大的提高,很大程度上正是由于這一層的引入。
在二進制分幀層中, HTTP/2 會將所有傳輸的信息分割為更小的消息和幀(frame),并對它們采用二進制格式的編碼。
這種單連接多資源的方式,減少了服務端的壓力,使得內存占用更少,連接吞吐量更大。而且,TCP連接數的減少使得網絡擁塞狀況得以改善,同時慢啟動時間的減少,使擁塞和丟包恢復速度更快。
多路復用允許同時通過單一的HTTP/2.0連接發起多重的請求-響應消息。在HTTP1.1協議中,瀏覽器客戶端在同一時間,針對同一域名下的請求有一定數量的限制,超過了這個限制的請求就會被阻塞。而多路復用允許同時通過單一的 HTTP2.0 連接發起多重的“請求-響應”消息。
HTTP2的請求的TCP的connection一旦建立,后續請求以stream的方式發送。每個stream的基本組成單位是frame(二進制幀)。客戶端和服務器可以把 HTTP 消息分解為互不依賴的幀,然后亂序發送,最后再在另一端把它們重新組合起來。
也就是說, HTTP2.0 通信都在一個連接上完成,這個連接可以承載任意數量的雙向數據流。就好比,我請求一個頁面 http://www.hollischuang.com 。頁面上所有的資源請求都是客戶端與服務器上的一條 TCP 上請求和響應的!
HTTP/1.1的header帶有大量信息,而且每次都要重復發送。HTTP/2 為了減少這部分開銷,采用了HPACK 頭部壓縮算法對Header進行壓縮。
簡單來講就是當用戶的瀏覽器和服務器在建立連接后,服務器主動將一些資源推送給瀏覽器并緩存起來的機制。有了緩存,當瀏覽器想要訪問已緩存的資源的時候就可以直接從緩存中讀取了。
推薦一個阿里P9專家的架構師課程,?掃描文末二維碼即可報名:
這個專欄共 50期,從 4月 28日開始,每周二四六更新,形式為圖文 +音頻,中間會穿插專門的答疑和直播板塊。
現在他們在做活動,一方面報名便宜一些,另一方面如果你報名后可以生產我這樣的邀請 碼,邀請一個人給提成24元,也就是說你有可能會免費學習這門課程,算是福利送給大家把。
HTTP Java Spring
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。