
前言
HTTP/3 即 QUIC(發音同Quick),通過發音我們就知道 HTTP/3 又可以讓網站的速度更上一層樓。 HTTP/2 提速很重要的一點是使用了多路複用,一般來說同一域名下隻需要一個 TCP 連接配接。但是如果當這個連接配接中出現了丢包的情況,那就會導緻 HTTP/2 的表現情況反倒不如 HTTP/1.1 了。
如果出現丢包的情況下,整個 TCP 便會要開始等待重傳,導緻了後面所有資料都阻塞了。但是對于 HTTP/1.1 來說,因為可以開啟多個 TCP 連接配接,是以出現這種情況反到也就隻影響其中你們一個連接配接而已,剩餘的 TCP 連接配接還可以正常傳輸資料。
好嘛,有問題我們就解決問題,因為我們已經見識到了多路複用的好處,是以我們就去修改 TCP 協定,不過這已經是一件不可能完成的任務了。TCP 真的是太元老了,對 TCP 進行更新意味着要從作業系統上入手,那麼整個協定将不會被所有的老系統所支援,新系統的推廣何其艱難。
是以谷歌就更起爐竈搞了一個基于 UDP 協定的 QUIC 協定,因為 UDP 不需要三次握手,2016年,IETF開始緻力于協定的标準化。 将QUIC拆分為基于傳輸層的和應用層的協定。應用層協定被稱為
HTTP-over-QUIC
在2018年11月,IETF宣布 HTTP-over-QUIC 被正式命名為HTTP / 3。
如果上面大段背景介紹覺得煩,我們直接看下文即可:
- QUIC 協定有哪些優點,如何實作 0-RTT?
- QUIC 協定在傳輸層就支援多路複用,避免了隊頭阻塞問題。
- QUIC 協定基于 UDP,更自由更高效
- QUIC 協定借鑒了 TFO 的思想,支援會話上下文緩存,友善恢複,具備實作 0-RTT 的可能
- 傳統的 HTTP2 + SSL + TCP 協定棧有哪些缺點?
- SSL 的會話恢複依然需要一個 RTT,而且難以合并到 TCP 層
- TCP 的滑動視窗存在隊頭阻塞問題
- TCP 的重傳糾錯會浪費一個 RTT
- 為什麼 Google 要另起爐竈,基于 UDP 去做?
- TCP 由作業系統實作,很難更新
- UDP 非常高效,幾乎沒有性能負擔
- 将 QUIC 嵌入到 Chrome 中可以友善後續的更新疊代
- QUIC的特性究竟有哪些?
- 利用緩存,顯著減少連接配接建立時間
- 改善擁塞控制,擁塞控制從核心空間到使用者空間
- 沒有 head of line 阻塞的多路複用
- 前向糾錯,減少重傳
- 連接配接平滑遷移,網絡狀态的變更不會影響連接配接斷線。
改編自
全棧養成計劃和
冰霜之地實作
目前支援 QUIC 的 Web 服務軟體主要是 LiteSpeed 和 Caddy,Nginx 尚不支援現有教程都是通過 Docker 結合 Nginx+Caddy 來實作,穩定性和可靠性都得打上問号。
是以我就比較推薦基于 LiteSpeed 的來實作了,LiteSpeed 是一款企業級商業 Web 服務,相比開源社群軟體會有着更好的穩定性和可靠性。值得一提的是 HTTP/2 也是由 Lite Speed 率先實作的。
簡單介紹:
LiteSpeed 即 LiteSpeed Web Server(簡稱 LSWS),是一款企業級商用 Web 服務軟體,可以完美的 Apache HTTPD 相容體驗,.htaccess 規則可以直接相容而不像 Nginx 需要重寫,并相容常用的mod擴充。得益于基于事件的架構優勢,靜态内容比Apache Httpd 快 5 倍 ,動态内容更是快 40 倍,HTTPS 通路快 3 倍并可以應用硬體加速器。
更多介紹請看:
https://www.llstack.com/zh/LiteSpeed/安裝
這裡我推薦通過 LLStack 一鍵包進行 Lite Speed 的安裝。 安裝教程:
https://www.llstack.com/zh/install/一、篇幅限制,這裡以安裝簡單的輕量版為例。在 SSH 終端中輸入:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ivmm/LLStack/master/install.sh)" 2>&1 | tee llstack-all.log
我們安裝完成:
二、開始設定虛拟主機,運作腳本:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ivmm/LLStack/master/vhost.sh)"
詳細講解請看文檔:
建立虛拟主機-步驟詳解三、在第五步确認是否要開啟HTTPS,輸入
y
無論是 HTTP/2 還是 HTTP/3 都依賴于 HTTPS。
四、第六步然後會讓我們輸入 密鑰檔案(.Key)和證書檔案(.crt)的路徑,不一定馬上就要存在,我們可以後續等建立完虛拟主機後再放到對應的路徑上(會有報錯,但是可以忽略)。
五、第七步詢問是否開啟 HTTP/3 功能,輸入
y
為開啟
六、然後我們輸入任意鍵即可開始自動配置,
CTRL+C
為取消
七、然後就可以看到輸出了。
八、因為 HTTP/3 依賴于 UDP,而我們往往隻是會開啟 TCP 協定,是以我們還需要打開防火牆和安全組(沒有就忽略)的UDP 443 端口。
- 輕量版使用 Firewall 防火牆 在終端中運作:
firewall-cmd --zone=public --add-port=443/udp --permanent
firewall-cmd --reload
- 面闆版在 防火牆 - 開放網絡端口 中,端口輸入
協定選擇443
,點選确定後點選重載。UDP
更詳細的防火牆設定教程請看:
防火牆設定- 伺服器安全組以阿裡雲為例: 協定類型選擇
,端口範圍自定義UDP
,授權對象443/443
0.0.0./0
九、更詳細的 QUIC 設定,可以在 LiteSpeed 圖形化控制台中導航至 Configuare - Server - Tuning ,對 QUIC 進行配置,一般來說新手建議預設,打開
Enable QUIC
即可
調試
截至發稿浏覽器僅有 Chrome 支援,Firefox 和 Safari 可能得等 HTTP/3 正式發稿後會獲得支援。
一、Chrome 浏覽器進入
chrome://flags/
也沒,将
Experimental QUIC protocol
設定 Enable 然後重新開機浏覽器。
二、 打開網站,再打開開發者工具,在 Protocol 就可以看到了,HTTP/2 + QUIC 就是 HTTP/3:
來自:
https://www.mf8.biz/use-http-3/