一、前言

聽到 HTTP/3 竟然要放棄 TCP 改用 UDP,相信不少人應該都感到很驚訝。在過往教課書及老師都告訴我們「UDP 不可靠,所以 HTTP 使用比較可靠的 TCP」,從來沒有想過這知識有一天竟然會被推翻,因此在震驚之餘,也來研究了一下 HTTP/3 內容及 HTTP 的過去、現在和未來。

2018 年 11 月,官方 (IETF) 批准,認可 HTTP-over-QUIC 實驗性協議重新命名為 HTTP/3,並成為 HTTP 的第三個正式版本。

2019 年, Cloudflare、Chrome、Firefox 陸陸續續的支援了 HTTP/3,並共同合作來推行這項協定。

目前逐漸成為主流的 HTTP/2 ,其相比 HTTP/1 大幅提升了性能,使網站只需要升級到新版協議即可享受性能所帶來的提升。當然其中也有許多問題,其中兼容性的問題也使得 HTTP/2 難以快速普及。

既然 HTTP/2 有許多不完美之處,因此新的 HTTP/3 被推出來,為了解決 HTTP/2 所存在的問題。

接下來我會從基礎的 HTTP/1 講起,省略掉一些複雜的細節,簡單的帶大家了解 HTTP 的過去、現在和未來。

二、發展歷史

HTTP 是 HyperText Transfer Protocol(超文本傳輸協定)的縮寫,是目前網際網路上應用最廣泛的網路協定。

從 1996 年發布的 HTTP/1.0 到後來的 HTTP/2.0,它們都建立在 TCP 上,屬於電腦網路中的應用層,因此 HTTP 的瓶頸及優化方式都是基於 TCP 本身的特性。

1. HTTP/1

HTTP/1.0 是第一個在通訊中指定版本號的 HTTP 版本,至今仍被廣泛採用,特別是在代理伺服器中。

不過隨著 HTTP/1.0 的快速成長,許多缺點也隨之暴露出來。在 HTTP/1.0 中,客戶端和伺服器之間交換的每個請求/回應都會建立一個新的 TCP 連接,這也意味著所有 TCP/TLS 握手均要在每個請求之前完成,因此所有請求都會產生延遲。

更糟糕的是,TCP 不是在建立連接後儘快發送所有未完成的資料,而需要“慢啟動”的預熱時間,這使 “TCP 擁塞控制”能夠隨時確定可以傳輸的資料量,防止網路路徑發生擁塞,並避免將無法處理的封包都堆到網路中。但是,由於新連接必須經過緩慢的啟動過程,因此它們無法立即使用所有可用的網路帶寬。

因此 HTTP/1.1 根據 HTTP/1.0 的一些問題做了優化。最重要改變是持久連接被預設採用以及HTTP 管線化持久連接使客戶端能重複使用同一個 TCP 連接,從而分攤建立多個請求所花費的時間成本;HTTP 管線化使 HTTP 能同時傳送多個請求,以降負載,提高傳輸速度。但其因為必須按照客戶端傳送的請求順序來回覆請求,因此同時還是只能處理一個請求/回應。

除此之外 HTTP/1.1 也做了一些改進如下:

  • 快取處理
  • 頻寬最佳化及網路連接的使用
  • 錯誤通知的管理
  • 訊息在網路中的傳送
  • 網際網路位址的維護
  • 安全性及完整性

2. SPDY & HTTP/2

隨著網際網路發展日趨蓬勃,網站所需資源及規模不斷增長,HTTP/1 已無法滿足需求,因此 SPDY & HTTP/2 也隨之而來。

SPDY 協定

2009 年,Google 為了解決 HTTP/1.1 效率不高的問題,設計了 SPDY 協定。SPDY 協定通過 header 壓縮、多路復用和優先級等來縮短載入時間。

HTTP/2

2015 年,繼承 SPDY 的 HTTP/2 協定發布。HTTP/2 基於 SPDY,專注於性能,最大的一個目標是在用戶和網站間只用一個連接。

HTTP/2 特性:

  • 二進位傳輸:HTTP/2 採用了二進位而非明文來打包。
  • 多路復用:很好地解決了瀏覽器限制同一個域名下的請求數量的問題,同時也更容易實現全速傳輸。
  • Header 壓縮:引入 HPACK 演算法,用於對 HTTP 頭部做壓縮。
  • 伺服器推播:使伺服器可以預先將客戶端需要的內容傳送過去,而不需要等待頁面的解析。

3. HTTP/3

雖然 HTTP/2 解決了許多舊版本的問題,但因其基於 TCP 上,所以還是存在一個巨大的問題。

在丟包的情況下,TCP 會整個重新傳送,間接造成後面的數據被阻塞,導致 HTTP/2 的表現不如 HTTP/1。這是 TCP 本身的問題,但因 TCP 是由作業系統實現的協定,想要修改是一件不可能完成的任務。

基於這個原因,Google 設計了一個基於 UDP 的 QUIC 協定,並使用在 HTTP 上。最初其被命名為 HTTP-over-QUIC,後來經過官方批准後,改名為 HTTP/3。

與 TCP 相比,UDP 提供了更大的靈活性,並且使 QUIC 實現完全存在於用戶空間,使其脫離作業系統的依賴,讓使用者只要更新到支援 QUIC 的瀏覽器版本,使用者即可享受到 HTTP/3 所帶來的提升。

以往我們認為 UDP 雖然實現簡單且傳輸效率高,但它安全低且可能有調包的風險。不過所幸基於 UDP 所設計的 QUIC 解決了以上問題,讓我們享受 HTTP/2 所有優點的同時,也解決了隊頭阻塞的問題。

QUIC 還結合了典型的 3 向交握和 TLS 1.3 的握手。結合這些步驟意味著加密和身份驗證能夠默認提供,並且還可以更快地建立連接。

三、總結

  • HTTP/1:有連接無法復用、隊頭阻塞、協定開銷大和安全因素等多種缺陷。
  • HTTP/2:通過多路復用、二進制流與 Header 壓縮等技術,極大地提高了性能,但是還是存在一些問題。
  • HTTP/3:拋棄 TCP,以全新的視角重新設計 HTTP。其底層支撐是 QUIC 協議,該協議基於 UDP,有 UDP 特有的優勢,同時它又取了 TCP 中的精華,實現了即快又可靠的協議。

從 HTTP/1 到 HTTP/3 經過不斷的更新及優化,底層協定也從 TCP 改成 UDP,許多以往我們所認定的觀念也跟著被推翻,這其中有許多事情值得我們細細思考。

四、參考資料