淺析HTTP3

簡介

很多小夥伴可能還沉浸在HTTP1.1的世界無法自拔,但是時代的洪流已經帶領我們來到瞭HTTP3的世界瞭。是的,你在橋上看風景,而橋邊的房子上有人正在看你。

為瞭不被時代所拋棄,今天給大傢講解一下HTTP3的新特性。

HTTP成長介紹

HTTP的全名叫做超文本傳輸​​協議,是萬維網所基於的應用層傳輸協議。最初的版本是HTTP 0.9,是在80年的後期產生的,後面在1996年升級到瞭1.0.

但是HTTP1.0滿足不瞭日益增長的物質文化需求和對美好世界的向往。所以在1997年出現瞭HTTP1.1,隨後到2014年,HTTP1.1都一直都在更新。

然後到瞭2015年,為瞭適應快速發送的web應用和現代瀏覽器的需求,在Google的SPDY項目基礎上發展出瞭新的HTTP2協議。

又過瞭4年,在2019年,Google又開發出瞭一個新的協議標準QUIC協議,它就是HTTP3的基石,其目的是為瞭提高用戶與網站和API交互的速度和安全性。

不同HTTP協議解決的問題

不同HTTP協議解決的問題也是不同的,HTTP1.1有什麼問題呢?

1.因為HTTP1.1一個連接中數據是順序傳輸的,所以會有Head-of-line Blocking的問題,如果前面是一個大的數據包,則會導致後續數據包的阻塞。

2.HTTP1.1無法對請求頭和cookie進行壓縮,所以傳輸效率會比較低。

3.為瞭保證緩沖區不會溢出,HTTP1.1有一個TCP慢啟動的功能,作為擁塞控制措施,協議反復探測網絡以計算可用容量,但是這樣就會導致多次數據的傳輸,從而導致消息的延時。

對於HTTP2來說,它使用二進制進行消息傳輸,並且將消息拆分成一個個的stream,在stream中又包含瞭多個frame,允許資源通過多路復用使用同一個連接發送,解決瞭行頭阻塞的問題,並且還支持數據包的優先級和服務器推送。

但是HTTP2的服務器推送會導致應用程序變得復雜,TCP級別的頭阻塞的問題在數據包丟失並且必須重新以正確的順序重新發送時,仍然可能發生。

要註意,HTTP/2是HTTP/1.1的擴展,而不是它的替代品。 應用程序語義保持不變,具有相同的HTTP方法、狀態代碼、URI和標頭字段。 所以HTTP/2可以被用在任何使用HTTP/1.1的地方。

HTTP/2在客戶端和服務器之間使用單個TCP連接,該連接在交互期間保持打開狀態。

雖然HTTP/2支持並發,但是過多的並發會導致HTTP/2服務器接收到大批量的請求,從而導致請求超時。

HTTP3和QUIC

HTTP/3的目標是通過解決HTTP/2的傳輸相關問題,在所有形式的設備上提供快速、可靠和安全的Web連接。為此,它使用瞭一種不同的傳輸層網絡協議,稱為QUIC,該協議最初由Google開發的。

感慨一下,雖然最近中國在系統的應用方面有瞭一定的進步,但是看看這些底層的協議,還都是外國人搞出來的。

HTTP/2和HTTP/3的根本區別在於,HTTP/2底層使用的是TCP協議,而HTTP/3使用的是QUIC,而QUIC的底層使用的是UDP協議。

我們看一下HTTP/2和HTTP/3的協議棧對比:

TCP協議主要保證服務的可靠性和有序交付,但是TCP需要同握手來建立連接,這樣做是為瞭確保客戶端和服務器都存在並且他們願意並且能夠交換數據。但是,它也需要一個完整的網絡往返才能完成,然後才能在連接上完成任何其他操作。 如果客戶端和服務器端相距比較遠,那麼就需要花費較多的時間來進行連接。

我們知道UDP是無連接的,所以它要比TCP簡單很多。它不需要TCP這種建立多次連接的步驟,隻需要發送數據包出去就夠瞭。

所以使用QUIC的優點就在於減少瞭系統的延時,適用於可以容忍一些數據丟包的情況,比如在線遊戲、廣告競價、在線視頻、實時流等地方。

另外因為UDP支持廣播,所以HTTP3還適用於廣播應用中,如精確時間協議和路由信息協議等。

另外HTTP3還可以用在物聯網、大數據和VR等方面。

既然HTTP3使用的是QUIC協議,那麼QUIC到底是什麼呢?

通常來說QUIC是一種通用傳輸協議,與TCP非常相似。為什麼要打造一套新的協議呢?這是因為現有的TCP協議擴展起來非常困難,因為已經有太多太多的設備使用瞭各種不同的TCP協議的版本,如果想直接在現有的TCP協議上進行擴展非常困難,因為需要給這麼多臺設備進行升級幾乎是不可能完成的任務。

所以QUIC在選擇在UDP協議之上進行構建。QUIC使用UDP,主要是因為希望能讓HTTP/3更容易部署,因為它已經被互聯網上的所有設備所知並已實現.

QUIC實際上就是在UDP基礎上重寫瞭TCP的功能,但是又比TCP更加智能,更高效的實現瞭TCP的核心功能。

接下來我們看下QUIC具體有哪些特征。

TLS1.3

TLS主要用來保證客戶端和服務器端在數據傳輸過程的數據安全性,可以對明文數據進行加密傳輸。TLS1.3是TLS協議的最新版本,在舊的版本如TLS1.2中,客戶端和服務器端的握手至少需要兩次網絡往返,但是在TLS1.3中,將其減少到隻有一次往返。

雖然在HTTP/2中是支持無加密傳輸模式,但是默認情況下所有的現代瀏覽器都不支持這種模式,所以HTTP/2必須配合HTTPS一起使用。長遠看來HTTPS肯定是未來的趨勢,所以在QUIC中,直接就使用瞭TLS 1.3協議。QUIC本身就封裝瞭TLS1.3。

這樣做的好處就是QUIC沒辦法運行明文,所以更加的安全。並且QUIC內置瞭加密協議,將傳輸和加密握手合二為一,節省瞭往返。

因為QUIC是全程加密的,所以對於某些ISP和中間網絡來說,無法再對網絡數據進行分析和統計,所以可能會限制它的使用。並且因為QUIC是單獨對每個數據包進行加密的,在高並發的情況下,可能會造成性能問題。

解決HoL阻塞

傳統的HTTP1.1和HTTP2底層協議是TCP,雖然HTTP2在應用層可以將不同文件的數據拆分成一個個的stream放在同一個連接中進行傳輸。但是對於TCP本身來說,它並不知道這些stream屬於不同的文件,它會將其當成同一個文件。所以如果發送數據丟包的情況,TCP會重新發送所有的文件包。從而導致HOL阻塞的問題。

而QUIC更加細粒度一點,它可以在每個流的基礎上執行丟包檢測和恢復邏輯。從而隻會重發失敗的流,而不是整個文件。

連接的遷移

在TCP中,如果我想要建立客戶端和服務器端的連接,需要知道這4個元素:客戶端IP地址 + 客戶端端口 + 服務器IP地址 + 服務器端口。

如果這4個元素中有一個發送瞭變化,則需要重新建立TCP連接。並且需要根據應用程序級協議,重新啟動進程中的操作。

比如你正在下載一個大的文件,但是網絡地址突然發生瞭變化,則可能需要重新請求該文件。

為瞭解決這個問題,QUIC引入瞭一個名為連接標識符(CID)的概念 。 每個連接都在上述4個元素中額外分配一個編號,用於標記客戶端和服務器端的唯一連接。

因為這個CID是由QUIC定義的,所以不會隨著網絡遷移的變化而變化。從而不需要新的握手,這種情況被稱為連接遷移 。

總結

好瞭,今天的HTTP/3和QUIC就介紹到這裡,雖然我們沒有涉及到底層的更多細節,但是相信大傢應該都聽得明白瞭,再總結一下,QUIC實際上行就是在UDP協議之上,再造瞭一個更加高級有效的TCP協議。

到此這篇關於淺析HTTP3的文章就介紹到這瞭,更多相關HTTP3內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: