1. 程式人生 > >一文讀懂HTTP/2及HTTP/3特性

一文讀懂HTTP/2及HTTP/3特性

開發十年,就只剩下這套架構體系了! >>>   

摘要: 學習 HTTP/2 與 HTTP/3。

Fundebug經授權轉載,版權歸原作者所有。

前言

HTTP/2 相比於 HTTP/1,可以說是大幅度提高了網頁的效能,只需要升級到該協議就可以減少很多之前需要做的效能優化工作,當然相容問題以及如何優雅降級應該是國內還不普遍使用的原因之一。

雖然 HTTP/2 提高了網頁的效能,但是並不代表它已經是完美的了,HTTP/3 就是為了解決 HTTP/2 所存在的一些問題而被推出來的。

一、HTTP協議

HTTP協議是HyperText Transfer Protocol(超文字傳輸協議)的縮寫,它是網際網路上應用最為廣泛的一種網路協議。所有的WWW檔案都必須遵守這個標準。伴隨著計算機網路和瀏覽器的誕生,HTTP1.0也隨之而來,處於計算機網路中的應用層,HTTP是建立在TCP協議之上,所以HTTP協議的瓶頸及其優化技巧都是基於TCP協議本身的特性,例如tcp建立連線的3次握手和斷開連線的4次揮手以及每次建立連線帶來的RTT延遲時間。

二、HTTP/1.x的缺陷

  • 連線無法複用:連線無法複用會導致每次請求都經歷三次握手和慢啟動。三次握手在高延遲的場景下影響較明顯,慢啟動則對大量小檔案請求影響較大(沒有達到最大視窗請求就被終止)。
    • HTTP/1.0傳輸資料時,每次都需要重新建立連線,增加延遲。
    • HTTP/1.1雖然加入keep-alive可以複用一部分連線,但域名分片等情況下仍然需要建立多個connection,耗費資源,給伺服器帶來效能壓力。
  • Head-Of-Line Blocking(HOLB):導致頻寬無法被充分利用,以及後續健康請求被阻塞。HOLB是指一系列包(package)因為第一個包被阻塞;當頁面中需要請求很多資源的時候,HOLB(隊頭阻塞)會導致在達到最大請求數量時,剩餘的資源需要等待其他資源請求完成後才能發起請求。
    • HTTP 1.0:下個請求必須在前一個請求返回後才能發出,request-response
      對按序發生。顯然,如果某個請求長時間沒有返回,那麼接下來的請求就全部阻塞了。
    • HTTP 1.1:嘗試使用 pipeling 來解決,即瀏覽器可以一次性發出多個請求(同個域名,同一條 TCP 連結)。但 pipeling 要求返回是按序的,那麼前一個請求如果很耗時(比如處理大圖片),那麼後面的請求即使伺服器已經處理完,仍會等待前面的請求處理完才開始按序返回。所以,pipeling 只部分解決了 HOLB。

如上圖所示,紅色圈出來的請求就因域名連結數已超過限制,而被掛起等待了一段時間。

  • 協議開銷大: HTTP1.x在使用時,header裡攜帶的內容過大,在一定程度上增加了傳輸的成本,並且每次請求header基本不怎麼變化,尤其在移動端增加使用者流量。
  • 安全因素:HTTP1.x在傳輸資料時,所有傳輸的內容都是明文,客戶端和伺服器端都無法驗證對方的身份,這在一定程度上無法保證資料的安全性

三、SPDY 協議

因為HTTP/1.x的問題,我們會引入雪碧圖、將小圖內聯、使用多個域名等等的方式來提高效能。不過這些優化都繞開了協議,直到2009年,谷歌公開了自行研發的 SPDY 協議,主要解決HTTP/1.1效率不高的問題。谷歌推出SPDY,才算是正式改造HTTP協議本身。降低延遲,壓縮header等等,SPDY的實踐證明了這些優化的效果,也最終帶來HTTP/2的誕生。

SPDY 協議在Chrome瀏覽器上證明可行以後,就被當作 HTTP/2 的基礎,主要特性都在 HTTP/2 之中得到繼承。

四、HTTP/2 簡介

2015年,HTTP/2 釋出。HTTP/2是現行HTTP協議(HTTP/1.x)的替代,但它不是重寫,HTTP方法/狀態碼/語義都與HTTP/1.x一樣。HTTP/2基於SPDY3,專注於效能,最大的一個目標是在使用者和網站間只用一個連線(connection)。

HTTP/2由兩個規範(Specification)組成:

  1. Hypertext Transfer Protocol version 2 - RFC7540
  2. HPACK - Header Compression for HTTP/2 - RFC7541

五、HTTP/2 新特性

1. 二進位制傳輸

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

接下來我們介紹幾個重要的概念:

  • 流:流是連線中的一個虛擬通道,可以承載雙向的訊息;每個流都有一個唯一的整數識別符號(1、2…N);
  • 訊息:是指邏輯上的 HTTP 訊息,比如請求、響應等,由一或多個幀組成。
  • 幀:HTTP 2.0 通訊的最小單位,每個幀包含幀首部,至少也會標識出當前幀所屬的流,承載著特定型別的資料,如 HTTP 首部、負荷,等等

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

2. 多路複用

在 HTTP/2 中引入了多路複用的技術。多路複用很好的解決了瀏覽器限制同一個域名下的請求數量的問題,同時也接更容易實現全速傳輸,畢竟新開一個 TCP 連線都需要慢慢提升傳輸速度。

大家可以通過 該連結 直觀感受下 HTTP/2 比 HTTP/1 到底快了多少。

在 HTTP/2 中,有了二進位制分幀之後,HTTP /2 不再依賴 TCP 連結去實現多流並行了,在 HTTP/2中:

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

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

  • 同個域名只需要佔用一個 TCP 連線,使用一個連線並行傳送多個請求和響應,消除了因多個 TCP 連線而帶來的延時和記憶體消耗。
  • 並行交錯地傳送多個請求,請求之間互不影響。
  • 並行交錯地傳送多個響應,響應之間互不干擾。
  • 在HTTP/2中,每個請求都可以帶一個31bit的優先值,0表示最高優先順序, 數值越大優先順序越低。有了這個優先值,客戶端和伺服器就可以在處理不同的流時採取不同的策略,以最優的方式傳送流、訊息和幀。

如上圖所示,多路複用的技術可以只通過一個 TCP 連線就可以傳輸所有的請求資料。

3. Header 壓縮

在 HTTP/1 中,我們使用文字的形式傳輸 header,在 header 攜帶 cookie 的情況下,可能每次都需要重複傳輸幾百到幾千的位元組。

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

  • HTTP/2在客戶端和伺服器端使用“首部表”來跟蹤和儲存之前傳送的鍵-值對,對於相同的資料,不再通過每次請求和響應傳送;
  • 首部表在HTTP/2的連線存續期內始終存在,由客戶端和伺服器共同漸進地更新;
  • 每個新的首部鍵-值對要麼被追加到當前表的末尾,要麼替換表中之前的值

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

4. Server Push

Server Push即服務端能通過push的方式將客戶端需要的內容預先推送過去,也叫“cache push”。

可以想象以下情況,某些資源客戶端是一定會請求的,這時就可以採取服務端 push 的技術,提前給客戶端推送必要的資源,這樣就可以相對減少一點延遲時間。當然在瀏覽器相容的情況下你也可以使用 prefetch。 例如服務端可以主動把JS和CSS檔案推送給客戶端,而不需要客戶端解析HTML時再發送這些請求。

服務端可以主動推送,客戶端也有權利選擇是否接收。如果服務端推送的資源已經被瀏覽器快取過,瀏覽器可以通過傳送RST_STREAM幀來拒收。主動推送也遵守同源策略,換句話說,伺服器不能隨便將第三方資源推送給客戶端,而必須是經過雙方確認才行。

六、HTTP/3 新特性

1. HTTP/3簡介

雖然 HTTP/2 解決了很多之前舊版本的問題,但是它還是存在一個巨大的問題,主要是底層支撐的 TCP 協議造成的。

上文提到 HTTP/2 使用了多路複用,一般來說同一域名下只需要使用一個 TCP 連線。但當這個連線中出現了丟包的情況,那就會導致 HTTP/2 的表現情況反倒不如 HTTP/1 了。

因為在出現丟包的情況下,整個 TCP 都要開始等待重傳,也就導致了後面的所有資料都被阻塞了。但是對於 HTTP/1.1 來說,可以開啟多個 TCP 連線,出現這種情況反到只會影響其中一個連線,剩餘的 TCP 連線還可以正常傳輸資料。

那麼可能就會有人考慮到去修改 TCP 協議,其實這已經是一件不可能完成的任務了。因為 TCP 存在的時間實在太長,已經充斥在各種裝置中,並且這個協議是由作業系統實現的,更新起來不大現實。

基於這個原因,Google 就更起爐灶搞了一個基於 UDP 協議的 QUIC 協議,並且使用在了 HTTP/3 上,HTTP/3 之前名為 HTTP-over-QUIC,從這個名字中我們也可以發現,HTTP/3 最大的改造就是使用了 QUIC。

QUIC 雖然基於 UDP,但是在原本的基礎上新增了很多功能,接下來我們重點介紹幾個QUIC新功能。

2. QUIC新功能

  • 0-RTT

通過使用類似 TCP 快速開啟的技術,快取當前會話的上下文,在下次恢復會話的時候,只需要將之前的快取傳遞給服務端驗證通過就可以進行傳輸了。0RTT 建連可以說是 QUIC 相比 HTTP2 最大的效能優勢。那什麼是 0RTT 建連呢?

這裡面有兩層含義:

  • 傳輸層 0RTT 就能建立連線。
  • 加密層 0RTT 就能建立加密連線。

上圖左邊是 HTTPS 的一次完全握手的建連過程,需要 3 個 RTT。就算是會話複用也需要至少 2 個 RTT。

而 QUIC 呢?由於建立在 UDP 的基礎上,同時又實現了 0RTT 的安全握手,所以在大部分情況下,只需要 0 個 RTT 就能實現資料傳送,在實現前向加密的基礎上,並且 0RTT 的成功率相比 TLS 的會話記錄單要高很多。

  • 多路複用

雖然 HTTP/2 支援了多路複用,但是 TCP 協議終究是沒有這個功能的。QUIC 原生就實現了這個功能,並且傳輸的單個數據流可以保證有序交付且不會影響其他的資料流,這樣的技術就解決了之前 TCP 存在的問題。

同HTTP2.0一樣,同一條 QUIC連線上可以建立多個stream,來發送多個HTTP請求,但是,QUIC是基於UDP的,一個連線上的多個stream之間沒有依賴。比如下圖中stream2丟了一個UDP包,不會影響後面跟著 Stream3 和 Stream4,不存在 TCP 隊頭阻塞。雖然stream2的那個包需要重新傳,但是stream3、stream4的包無需等待,就可以發給使用者。

另外QUIC 在移動端的表現也會比 TCP 好。因為 TCP 是基於 IP 和埠去識別連線的,這種方式在多變的移動端網路環境下是很脆弱的。但是 QUIC 是通過 ID 的方式去識別一個連線,不管你網路環境如何變化,只要 ID 不變,就能迅速重連上。

  • 加密認證的報文

TCP 協議頭部沒有經過任何加密和認證,所以在傳輸過程中很容易被中間網路裝置篡改,注入和竊聽。比如修改序列號、滑動視窗。這些行為有可能是出於效能優化,也有可能是主動攻擊。

但是 QUIC 的 packet 可以說是武裝到了牙齒。除了個別報文比如 PUBLIC_RESET 和 CHLO,所有報文頭部都是經過認證的,報文 Body 都是經過加密的。

這樣只要對 QUIC 報文任何修改,接收端都能夠及時發現,有效地降低了安全風險。

如上圖所示,紅色部分是 Stream Frame 的報文頭部,有認證。綠色部分是報文內容,全部經過加密。

  • 向前糾錯機制

QUIC協議有一個非常獨特的特性,稱為向前糾錯 (Forward Error Correction,FEC),每個資料包除了它本身的內容之外,還包括了部分其他資料包的資料,因此少量的丟包可以通過其他包的冗餘資料直接組裝而無需重傳。向前糾錯犧牲了每個資料包可以傳送資料的上限,但是減少了因為丟包導致的資料重傳,因為資料重傳將會消耗更多的時間(包括確認資料包丟失、請求重傳、等待新資料包等步驟的時間消耗)

假如說這次我要傳送三個包,那麼協議會算出這三個包的異或值並單獨發出一個校驗包,也就是總共發出了四個包。當出現其中的非校驗包丟包的情況時,可以通過另外三個包計算出丟失的資料包的內容。當然這種技術只能使用在丟失一個包的情況下,如果出現丟失多個包就不能使用糾錯機制了,只能使用重傳的方式了

七、總結

  • HTTP/1.x 有連線無法複用、隊頭阻塞、協議開銷大和安全因素等多個缺陷
  • HTTP/2 通過多路複用、二進位制流、Header 壓縮等等技術,極大地提高了效能,但是還是存在著問題的
  • QUIC 基於 UDP 實現,是 HTTP/3 中的底層支撐協議,該協議基於 UDP,又取了 TCP 中的精華,實現了即快又可靠的協議

參考文章

關於Fundebug

Fundebug專注於JavaScript、微信小程式、微信小遊戲、支付寶小程式、React Native、Node.js和Java線上應用實時BUG監控。 自從2016年雙十一正式上線,Fundebug累計處理了10億+錯誤事件,付費客戶有Google、360、金山軟體、百姓網等眾多品牌企業。歡迎大家免費試用

相關推薦

大資料大資料產業

隨著“雲端計算”、“網際網路”、“物聯網”的快速發展,大資料(Big Data)也吸引了越來越多的人關注,成為社會熱點之一。大街小巷不論是技術人員、諮詢人士以及各行各業的精英達人都在探討著“大資料”,“大資料”顯然已經成為新一代“網紅”。   一、大資料是如何成為網紅? &nb

Salesforce學習之路-developer篇(五)Aura原理實戰案例分析

很喜歡曾經看到的一句話:以輸出倒逼輸入。以輸出的形式強制自己學習,確實是高效的學習方式,真的很棒。以下僅為個人學習理解,如有錯誤,歡迎指出,共同學習。   1. 什麼是Lightning Component框架?  Lightning Component框架是一個UI框架,用於為移動和

對抗生成網路的3種模型

https://www.toutiao.com/i6635851641293636109/   2018-12-17 14:53:28     基於對抗生成網路技術的線上工具edges2cats, 可以為簡筆畫塗色 前言 在GAN系

HTTP/2HTTP/3特性

開發十年,就只剩下這套架構體系了! >>>   

HTTP/0.9到HTTP/2HTTP協議的歷史演變和設計思路

eight 結果 key 視頻 this sso單點登陸 會有 研究 patch 本文原作者阮一峰,作者博客:ruanyifeng.com。 1、引言 HTTP 協議是最重要的互聯網基礎協議之一,它從最初的僅為瀏覽網頁的目的進化到現在,已經是短連接通信的事實工業標準,最新版

充電寶usb接口電路制作原理詳細

合規 其它 註意 pan 排列 ron 充電寶 需要 資料 轉自:http://www.elecfans.com/dianlutu/dianyuandianlu/20180511675801.html USB充電器套件,又名MP3/MP4充電器,輸入AC160-240V,5

低功耗藍芽BLE4.2 資料包

BLE = BTLE = Bluetooth Low Energy (低功耗藍芽) 1. 怎樣抓取(偵聽)BLE4.2 空中資料包 (全頻道抓取:37,38,39 同時)    * 硬體:           1) 一臺BLE4.2 裝置 (如: Nordic 52832,

進階 | 大資料分析挖掘技術

隨著大資料時代的到來,在大資料觀念不斷提出的今天,加強資料大資料探勘及時的應用已成為大勢所趨。 什麼是大資料探勘? 資料探勘(Data Mining)是從大量的、不完全的、有噪聲的、模糊的、隨機的資料中提取隱含在其中的、人們事先不知道的、但又是潛在有用的資

JDK7,8,JD9的HashMap,HashTable,ConcurrentHashMap他們的區別

內容和標題一樣長哦,人家寫了好久的。如無特別指明,內容對應的原始碼是jdk1.7(後面會和1.8對比) 1:hashmap簡介(如下,陣列-連結串列形式) HashMap的儲存結構       圖中,紫色部分即代表雜湊表,也稱為雜湊陣列(預設陣列大小是16,每對

分享實錄|區塊鏈整體架構應用方向

1 區塊鏈概念及特徵 1、區塊鏈的定義 相較於區塊鏈,大家似乎更瞭解比特幣。區塊鏈是一種技術,支撐和保障整個比特幣的貨幣機制在這樣一個分散式網路中執行,包括產生、流通、交易等等。 簡單來說它就是一個賬本,在整個交易過程中,每產生一筆交易,大家

MySQL的事務隔離級別MVCC機制

回顧前文: [一文學會MySQL的explain工具](https://www.cnblogs.com/itwild/p/13424113.html) [一文讀懂MySQL的索引結構及查詢優化](https://www.cnblogs.com/itwild/p/13703259.html)

TKE Kubernetes 訪問許可權控制

> 你有了解過Kubernetes的認證授權鏈路嗎?是否對TKE的許可權控制CAM策略、服務角色傻傻分不清楚?本文將會向你介紹`騰訊雲TKE平臺側的訪問控制`、`Kubernetes訪問控制鏈路`,以及演示如何將平臺側賬號對接到Kubernetes內。 當你在使用騰訊雲容器服務TKE(Tencent

大數據計算框架與平臺

ddr 不同 失敗 克服 可定制 同時 數據庫引擎 後處理 alc  1.前言   計算機的基本工作就是處理數據,包括磁盤文件中的數據,通過網絡傳輸的數據流或數據包,數據庫中的結構化數據等。隨著互聯網、物聯網等技術得到越來越廣泛的應用,數據規模不斷增加,TB、PB量級成為常

超簡單的 structured stream 源碼解讀

ket exec res exce bus sin imp += work 為了讓大家理解structured stream的運行流程,我將根據一個代碼例子,講述structured stream的基本運行流程和原理。 下面是一段簡單的代碼: 1 val spark =

Spring Boot、微服務架構和大數據治理之間的故事

Springboot微服務架構 微服務的誕生並非偶然,它是在互聯網高速發展,技術日新月異的變化以及傳統架構無法適應快速變化等多重因素的推動下誕生的產物。互聯網時代的產品通常有兩類特點:需求變化快和用戶群體龐大,在這種情況下,如何從系統架構的角度出發,構建靈活、易擴展的系統,快速應對需求的變化;同時,隨著用戶的

阻塞、非阻塞、同步、異步IO

UC max register class 掃描 基本 角度 cloud 問題: 介紹 在談及網絡IO的時候總避不開阻塞、非阻塞、同步、異步、IO多路復用、select、poll、epoll等這幾個詞語。在面試的時候也會被經常問到這幾個的區別。本文就來講一下這幾個詞

架構師都不知道的isinstance檢查機制

Python起步通過內建方法 isinstance(object, classinfo) 可以判斷一個對象是否是某個類的實例。但你是否想過關於鴨子協議的對象是如何進行判斷的呢? 比如 list 類的父類是繼 object 類的,但通過 isinstance([], typing.Iterable) 返回的卻是

【深度學習】機器學習常用損失函數(Loss Function)

back and 們的 wiki 導出 歐氏距離 classes 自變量 關於 最近太忙已經好久沒有寫博客了,今天整理分享一篇關於損失函數的文章吧,以前對損失函數的理解不夠深入,沒有真正理解每個損失函數的特點以及應用範圍,如果文中有任何錯誤,請各位朋友指教,謝謝~

以太坊代幣合約

規則 sta ini class 2015年 交易 存在 部分 生活 本文首發自 https://www.secpulse.com/archives/73696.html ,轉載請註明出處。 工欲善其事,必先利其器。要想挖掘和分析智能合約的漏洞,你必須要先學會看

什麽是音視頻直播雲服務 ?

type 限制 推流 數據 優缺點 視頻通訊系統 最終 通訊 地理 說到音視頻雲服務,大多數人可能聯想到的是網絡直播應用場景,實際上,硬件對音視頻雲服務的需求也在逐漸提升。而這樣的市場需求也推動了整個行業的發展,目前,阿裏雲、騰訊雲和網易雲等巨頭都已入局,除此之外還有即構科