一文讀懂 HTTP 2 特性

2022-02-04 11:46:24 字數 2216 閱讀 7185

http/2 是 http 協議自 1999 年 http 1.1 發布後的首個更新,主要基於 spdy 協議。由網際網路工程任務組(ietf)的 hypertext transfer protocol bis(httpbis)工作小組進行開發。該組織於2023年12月將http/2標準提議遞交至iesg進行討論,於2023年2月17日被批准。http/2標準於2023年5月以rfc 7540正式發表。

那 http/2 到底有哪些具體變化呢?

先來理解幾個概念:

幀:http/2 資料通訊的最小單位訊息:指 http/2 中邏輯上的 http 訊息。例如請求和響應等,訊息由乙個或多個幀組成。

流:存在於連線中的乙個虛擬通道。流可以承載雙向訊息,每個流都有乙個唯一的整數id。

http/2 採用二進位制格式傳輸資料,而非 http 1.x 的文字格式,二進位制協議解析起來更高效。 http / 1 的請求和響應報文,都是由起始行,首部和實體正文(可選)組成,各部分之間以文字換行符分隔。http/2 將請求和響應資料分割為更小的幀,並且它們採用二進位制編碼。

http/2 中,同網域名稱下所有通訊都在單個連線上完成,該連線可以承載任意數量的雙向資料流。每個資料流都以訊息的形式傳送,而訊息又由乙個或多個幀組成。多個幀之間可以亂序傳送,根據幀首部的流標識可以重新組裝。

這一特性,使效能有了極大提公升:

服務端可以在傳送頁面html時主動推送其它資源,而不用等到瀏覽器解析到相應位置,發起請求再響應。例如服務端可以主動把js和css檔案推送給客戶端,而不需要客戶端解析html時再傳送這些請求。

服務端可以主動推送,客戶端也有權利選擇是否接收。如果服務端推送的資源已經被瀏覽器快取過,瀏覽器可以通過傳送rst_stream幀來拒收。主動推送也遵守同源策略,伺服器不會隨便推送第三方資源給客戶端。

http 1.1請求的大小變得越來越大,有時甚至會大於tcp視窗的初始大小,因為它們需要等待帶著ack的響應回來以後才能繼續被傳送。http/2對訊息頭採用hpack(專為http/2頭部設計的壓縮格式)進行壓縮傳輸,能夠節省訊息頭占用的網路的流量。而http/1.x每次請求,都會攜帶大量冗餘頭資訊,浪費了很多頻寬資源。

http每一次通訊都會攜帶一組頭部,用於描述這次通訊的的資源、瀏覽器屬性、cookie等,例如

為了減少這塊的資源消耗並提公升效能, http/2對這些首部採取了壓縮策略:

例如:下圖中的兩個請求, 請求一傳送了所有的頭部字段,第二個請求則只需要傳送差異資料,這樣可以減少冗餘資料,降低開銷。

我們來看乙個實際的例子,下面是用wireshark抓取的訪問google首頁的包: 

上圖是是訪問 

抓到的第乙個請求的頭部,可以看到頭部的內容,總共占用了437 bytes,我們選中頭部的cookie,可以看到cookie總共占用了118 bytes。接下來我們看看第二個請求的頭部:

從上圖可以看到,得益於頭部壓縮,第二個請求中cookie只占用了1個位元組,我們來看看變化了的accept欄位: 

由於accept欄位與請求一中的內容不同,需要傳送給伺服器,所以占用了29 bytes。

瀏覽器和網路服務支援情況:http2支援清單

如何快速啟用http2: 又拍雲文件中心

http/2 和 http/1 速度對比:http/2: the future of the internet

結語

http/2的通過支援請求與響應的多路復用來減少延遲,通過壓縮http首部欄位將協議開銷降至最低,同時增加對請求優先順序和伺服器端推送的支援。

一文讀懂Nginx

問 nginx的負載均衡演算法有什麼?預設是什麼演算法?答 1 輪詢 按請求的時間輪詢查空閒的後端伺服器 2 指定輪詢機率 機率的原因是後端伺服器的效能不均勻,好的多分點,差的少分點 3 固定ip繫結固定伺服器 預設是加權輪詢,就是優先訪問權重高的伺服器 問 nginx是單執行緒的嗎?答 是單執行緒...

一文讀懂SpringMVC

主要講的是dispatcherservlet這個類 ioc其實是乙個map,工程啟動後掃瞄路徑,根據類的全限定名建立bean 問 怎麼根據路徑找到方法?map還存key為 aaa value為該controller例項 問 autowired原理?自定義註解,在載入的時候,掃瞄controller層...

堆疊 一文讀懂

堆疊 stack 是一種先進後出的 操作受限的線性表,也可以直接稱為棧。可以把棧想象成乙個桶一樣,往這個桶裡面一層一層的放東西,先放進去的在裡面,後放進去的東西依次在外面。但取東西的時候就是先取靠近外面的,再依次一層層取裡面的。這就是 後進先出 last in first out 的原則。因此 棧 ...