前言
HTTP/1.1協議為現在網絡提供了20年的支持。從那時起,網站已經從靜態的、文本驅動的文檔發展為交互式的、富媒體的應用程序。在此期間底層協議保持不變這一事實正好說明了它的通用性和能力。但隨着網絡變得越來越大,它的局限性變得更加明顯。我們需要一個替代品,而且我們很快就需要它。 於是HTTP/2誕生了。HTTP/2 於 2015 年初發布,在不改變現有應用程序語義的情況下優化了網站連接。這意味着你可以利用 HTTP/2 的特性,例如更高的性能、更新的錯誤處理、減少延遲和降低開銷,而不需要改動你的您的 Web 應用程序。到目前為止,近 84%的現代瀏覽器和27% 的所有網站都支持 HTTP/2,而且這些數字還在逐漸增加。
❝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/2 的最大變化影響了數據在客戶端和服務器之間的格式化和傳輸方式。
❞
二進制數據格式
HTTP/1.1消息以文本傳輸,都是由起始行,首部和實體正文(可選)組成,各部分之間以文本換行符分隔。這使得請求和響應易於格式化,甚至可以使用數據包分析工具讀取。HTTP/2 使用二進制協議封裝數據,二進制協議的好處是它允許更緊湊、更容易壓縮且不易出錯的傳輸,HTTP/2 將請求和響應數據分割為更小的幀,並且它們采用二進制編碼。HTTP/2 中,同域名下所有通信都在單個連接上完成,該連接可以承載任意數量的雙向數據流。每個數據流都以消息的形式發送,而消息又由一個或多個幀組成。多個幀之間可以亂序發送,根據幀首部的流標識可以重新組裝。
❝❞
- 幀:HTTP/2 數據通信的最小單位消息:指 HTTP/2 中邏輯上的 HTTP 消息。例如請求和響應等,消息由一個或多個幀組成。
- 流:存在於連接中的一個虛擬通道。流可以承載雙向消息,每個流都有一個唯一的整數ID。
二進制差別
持久 TCP 連接
在 HTTP 的早期版本中,必須為每個請求和響應創建一個新的 TCP 連接。HTTP/1.1 引入了持久連接,允許通過單個連接進行多個請求和響應。問題是消息是按順序交換的,Web 服務器拒絕接受新的請求,直到之前的請求得到滿足。
HTTP/2 允許通過單個 TCP 連接同時進行多個下載,從而簡化了這一點。建立連接后,客戶端可以發送新請求,同時接收對先前請求的響應。這不僅減少了建立新連接的延遲,而且服務器不再需要維護到相同客戶端的多個連接。
復用Tcp連接
Tcp多路復用,代替原來的序列和阻塞機制。所有就是請求的都是通過一個 TCP連接並發完成。 HTTP 1.x 中,如果想並發多個請求,必須使用多個 TCP 鏈接,且瀏覽器為了控制資源,還會對單個域名有 6-8個的TCP鏈接請求限制,如下圖,紅色圈出來的請求就因域名鏈接數已超過限制,而被掛起等待了一段時間
多路復用
頭壓縮和重用
在 HTTP/1.1 中,標頭是不可壓縮的,並且對於每個請求都是重復的。隨着請求數量的增加,重復頭信息的數量也在增加。HTTP/2 消除了多余的標頭並壓縮剩余的標頭以顯着減少會話期間重復的數據量。
- HTTP/2在客戶端和服務器端使用“首部表”來跟蹤和存儲之前發送的鍵-值對,對於相同的數據,不再通過每次請求和響應發送;
- 首部表在HTTP/2的連接存續期內始終存在,由客戶端和服務器共同漸進地更新;
- 每個新的首部鍵-值對要么被追加到當前表的末尾,要么替換表中之前的值。
來自於網絡
服務器推送
服務器現在可以推送資源,而不是等待客戶端請求資源。這允許網站搶先向用戶發送內容,最大限度地減少等待時間。
體驗下兩者之間加載速度
spring中如何使用http/2?
您可以使用server.http2.enabled配置屬性在 Spring Boot 應用程序中啟用 HTTP/2 支持 。這種支持取決於所選的 Web 服務器和應用程序環境,因為 JDK8 不支持開箱即用的協議。
❝Spring Boot使用HTTP/2協議必須先配置 SSL。
❞
使用Undertow服務器
從 Undertow 1.4.0+ 開始,支持 HTTP/2,對 JDK8 沒有任何額外要求。
使用Jetty服務器
從 Jetty 9.4.8 開始也支持 HTTP/2 。要使用Http/2,你的應用程序需要有兩個額外的依賴項: org.eclipse.jetty:jetty-alpn-conscrypt-server和org.eclipse.jetty.http2:http2-server.
使用Tomcat服務器
默認情況下,SpringBoot隨Tomcat8.5.x一起提供。對於該版本,只有在主機操作系統上安裝了libtcnative庫及其依賴項時,才支持HTTP/2。庫文件夾必須在JVM庫路徑中可用(如果尚未可用)。可以使用-Djava.library.path=/usr/local/opt/tomcat-native/lib這樣的JVM參數來實現。有關這方面的更多信息,請參閱Tomcat官方文檔。在沒有本機支持的情況下啟動Tomcat 8.5.x會記錄以下錯誤:
ERROR 8787 --- [ main] o.a.coyote.http11.Http11NioProtocol : The upgrade handler [org.apache.coyote.http2.Http2Protocol] for [h2] only supports upgrade via ALPN but has been configured for the ["https-jsse-nio-8443"] connector that does not support ALPN.
這個錯誤不是致命的,應用程序仍然以HTTP/1.1ssl支持啟動。使用tomcat9.0.x和JDK9運行應用程序不需要安裝任何本機庫。要使用Tomcat 9,可以用所選的版本覆蓋Tomcat.version build屬性。
結束
❝識別下方二維碼!回復: 「
❞入群
」 ,掃碼加入我們交流群!
點贊是認可,在看是支持