陳振波(武漢郵電科學研究院,湖北武漢,430074)
QUIC協議研究
陳振波
(武漢郵電科學研究院,湖北武漢,430074)
為了解決當前TCP傳輸存在的兩個主要問題:(1)建立連接、斷開連接的耗時傳輸機制;(2)前序包阻塞(Head-of-line blocking, HOL)問題,本文介紹一種基于UDP作為底層傳輸的全新協議(Quick UDP Internet Connections,QUIC),通過采用UDP為傳輸層協議,避免建立連接、斷開連接的耗時問題和前序包阻塞問題,并且通過一種巧妙的機制保證可靠性傳輸,克服UDP傳輸存在的問題。
TCP;前序包阻塞;UDP;QUIC
建立在TCP基礎之上的HTTP是互聯網上應用最為廣泛的一種網絡協議,誕生之初,主要就是為了將超文本標記語言(HTML)文檔從Web服務器傳送到客戶端的瀏覽器。但是到了Web 2.0時代,HTML頁面變得越來越復雜,不僅僅單純的是一些簡單的文字和圖片,同時有了層疊樣式表(Cascading Style Sheets,CSS),JavaScript(一種直譯式腳本語言)來豐富頁面展示,隨著Ajax(一種創建交互式網頁應用的網頁開發技術,英文全稱:Asynchronous JavaScript And XML)的出現,客戶端又多了一種向服務器端獲取數據的方法,這些其實都是基于HTTP協議的。同樣到了移動互聯網時代,頁面可以在手機端瀏覽器里顯示,但是和電腦端相比,手機端的網絡情況更加復雜,經常涉及到蜂窩網絡與無線局域網之間的切換,因此需要對HTTP進行深入理解并不斷優化。SPDY(發音如英語:speedy)及QUIC就是在這樣的背景下相繼出現,接下來先分別介紹HTTP及SPDY的發展、QUIC的特點,然后進行對比分析。
1.1 HTTP 1.X
HTTP/0.9是一個過時的協議,它只接受GET一種請求方法,沒有在網絡傳輸中指定版本號,且不支持請求頭。由于該版本不支持POST方法,因此客戶端無法向服務器傳遞太多信息。
隨后提出的HTTP/1.0是第一個指定版本號的HTTP協議版本,早期只是使用在一些較為簡單的網頁和網絡請求上,而今主要是在代理服務器中使用。
HTTP/1.1在1999年開始廣泛應用于現在的各大瀏覽器網絡請求中,同時也是當前使用最為廣泛的HTTP協議。HTTP/1.1與HTTP/1.0的主要區別為:
(1)緩存處理。在HTTP/1.0中主要使用header里的If-Modified-Since, Expires作為緩存判斷的標準,HTTP/1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
(2)帶寬優化及網絡連接的使用。HTTP/1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象傳過來了,并且不支持斷點續傳功能,HTTP/1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便于充分利用帶寬和連接。
(3)錯誤通知的管理。在HTTP/1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除。
(4)Host頭處理。在HTTP/1.0中認為每臺服務器都綁定一個唯一的IP地址,因此請求消息中的URL并沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),并且它們共享一個IP地址。HTTP/1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
(5)長連接。HTTP/1.1支持長連接(Persistent Connection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP/1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP/1.0每次請求都要創建連接的缺點。
盡管HTTP/1.1相比于HTTP/1.0有了很大的優化,但仍存在不少問題。
(1)需要很多TCP連接來實現并發請求與響應,且在傳輸數據時每次都需要重新建立連接,這增加了大量的延遲時間并可能引起網絡擁塞和高數據包丟失,導致更差的網絡性能。
(2)在傳輸數據時,所有傳輸的內容都是明文,客戶端和服務器端都無法驗證對方的身份,這在一定程度上無法保證數據的安全性。
(3)頭部信息(header)里攜帶的內容過大,在一定程度上增加了傳輸的成本,并且每次請求header基本不怎么變化,尤其在移動端環境下容易增加用戶流量。
(4)雖然HTTP/1.1支持了keep-alive,來彌補多次創建連接產生的延遲,但是keep-alive使用多了同樣會給服務端帶來大量的性能壓力。
(5)HTTP請求嚴格由客戶端發起,在網頁加載很多嵌入對象時會嚴重影響性能,因為服務器只能在客戶端發出請求后才能傳輸數據。
1.2 SPDY與HTTP/2
SPDY是一種基于TCP的開放網絡傳輸應用層協議,由Google開發,用來發送網頁內容。設計SPDY的目的在于降低網頁的加載時間,與HTTP/1.1相比,它在以下幾方面作了改進。
(1)降低延遲。針對HTTP高延遲的問題,SPDY采取了多路復用(multiplexing)。多路復用通過多個請求流共享一個TCP連接的方式,同時服務端也可通過一個連接發出多個應答流,提高了服務端性能。多路復用技術可以減少網絡擁塞、降低延遲,同時提高了帶寬的利用率。
(2)請求優先級。多路復用帶來一個新的問題是,在連接共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個請求設置優先級,這樣重要的請求就會優先得到響應。比如瀏覽器加載首頁,首頁的html內容應該優先展示,之后才是各種靜態資源文件,腳本文件等加載,這樣可以保證用戶能第一時間看到網頁內容。
(3)header壓縮。HTTP 1.x的header很多時候都是重復多余的。選擇合適的壓縮算法可以減小包的大小和數量,降低延遲。
(4)基于HTTPS的加密協議傳輸,大大提高了傳輸數據的可靠性。SPDY中廣泛應用了安全傳輸層協議(Transport Layer Security,TLS)加密,傳輸內容也均以gzip或DEFLATE格式壓縮。
(5)服務端推送。采用了SPDY的網頁,在客戶端發出一個資源請求時,服務端會把相關的資源主動推送到客戶端而避免等待客戶端再發出請求后響應。這可以減少頁面加載時間。
需要說明的是,SPDY并不用于替換HTTP,它只是修改了HTTP的請求與應答在網絡上傳輸的方式;這意味著只需增加一個SPDY傳輸層,現有的所有服務端應用均不用做任何修改。當使用SPDY的方式傳輸時,HTTP請求會被處理、標記簡化和壓縮。比如,每一個SPDY端點會持續跟蹤每一個在之前的請求中已經發送的HTTP報文頭部,從而避免重復發送還未改變的頭部。而還未發送的報文的數據部分將在被壓縮后被發送。SPDY的構成如圖1所示。

圖1 SPDY構成圖
2015年推出的HTTP/2大部分基于SPDY實現,主要區別為:
(1)HTTP/2支持明文 HTTP 傳輸,而 SPDY 強制使用HTTPS。
(2)HTTP/2消息頭(header)的壓縮算法采用 HPACK,而非SPDY 采用的 DEFLATE。
由于HTTP/2推出時間不長,相較于HTTP/1.1應用范圍還不廣,但是未來肯定會逐漸取代HTTP/1.1。
2.1 HTTP/2的局限性
除了QUIC是基于UDP實現,前面幾種協議都是基于TCP。TCP因其面向連接、可靠傳輸等特點而被廣泛采用,但在如今帶寬越來越大的網絡環境下,TCP的局限性也制約了HTTP/2的性能,主要表現為以下兩點。
(1)數據傳輸前TCP先要進行“三次握手”,建立連接后才開始傳輸應用數據,這無疑增加了網絡延時;在采用TLS協議時需要交換密鑰,這又增加了一次往返時延(Round-Trip Time,RTT)。
(2)HOL(Head-of-line)blocking,前序包阻塞。TCP保證有序傳輸,所以當一個數據包丟失時,其他所有的包都要等它重傳整理后才會交給應用層,對于多路復用共享一個TCP連接的SPDY和HTTP/2來說,這無疑影響更大。
2.2 QUIC的特點
QUIC最主要的目標是減小網絡傳輸延遲,所以選擇了UDP作為傳輸層協議,它的主要優點有:
(1)QUIC協議在創建連接握手時,只需要1到2個數據包即可。參考TCP+TLS協議的傳輸方式,QUIC設計了類似DTLS(Datagram Transport Layer Security,數據報傳輸安全層)的傳輸模型。這個模型大大簡化了建立連接的過程,使得創建連接握手時只需1到2個數據包。對于無線網絡來說,客戶端和服務器之間的延時通常在100ms以上。傳統TCP+TLS協議的傳輸方式,在創建連接時的4個數據包和QUIC協議的1個數據包相比,連接創建上就會多耗時300ms以上。圖2、圖3分別為TCP+TLS、QUIC的握手示意圖。
(2)避免前序包阻塞。SPDY和HTTP/2支持將頁面的多個數據(如音頻、圖片等)通過一個TCP連接進行傳輸。該特性能夠加快頁面組件的傳輸速度,但是對于TCP協議來說,這會遇到前序包阻塞的問題。因此,即使邏輯上一個TCP連接上并行的在進行多路數據傳輸,其他毫無關聯的數據也會因此阻塞。由于UDP協議沒有嚴格的順序,當一個數據包遇到問題需要重傳時,只會影響該數據包對應的資源,其他獨立的資源(如其他CSS、JavaScript文件)不會受到影響。QUIC協議直接通過底層使用UDP協議天然的避免了該問題。

圖2 TCP+TLS握手示意圖

圖3 QUIC握手示意圖
(3)QUIC協議有一個非常獨特的特性,稱為向前糾錯(Forward Error Correction,FEC),每個數據包除了它本身的內容之外,還包括了部分其他數據包的數據,因此少量的丟包可以通過其他包的冗余數據直接組裝而無需重傳。向前糾錯犧牲了每個數據包可以發送數據的上限,但是減少了因為丟包導致的數據重傳,因為數據重傳將會消耗更多的時間(包括確認數據包丟失、請求重傳、等待新數據包等步驟的時間消耗)。
(4) 底層協議切換到UDP協議之后的另一大好處是,連接不再依賴于來源IP。對于TCP協議來說,標識一個TCP連接需要4個參數,即來源IP、來源端口、目的IP和目的端口。其中的任一參數改變,TCP連接就需要重新創建。這對于傳統網絡來說影響不大,因為來源和目的IP相對固定。但是在無線網絡中,情況就大不相同了。設備在移動過程中,可能會因為網絡切換(如從WIFI網絡切換到4G網絡環境),導致TCP連接需要重新創建。QUIC協議使用了UDP協議,不再需要這四組參數。同時QUIC協議實現了自己的會話標記方式,稱為連接ID。當設備網絡環境切換時,連接ID不會發生變化,因此無需重新進行握手。該特性除了可以減少無謂的連接重連之外,還可以充分利用設備的不同網絡接口,進行資源的并行下載。因為雖然這些網絡接口有不同的IP,但只要他們能夠共享連接ID,就能夠并行的從服務器下載數據。
QUIC協議內置了TLS棧,實現了自己的傳輸加密層,同時QUIC還包含了部分HTTP/2的實現,底層通過UDP協議替代了TCP,上層只需要一層用于和遠程服務器交互的HTTP/2 API。這是因為QUIC協議已經包含了多路復用和連接管理,HTTP API只需要完成HTTP協議的解析即可。圖4為協議層次對比圖。

圖4 協議層次對比圖
QUIC通過一次(通信雙方從未建立連接)甚至不需要往返握手就可建立連接,這大大降低了網絡傳輸延遲。同時采用UDP底層協議避免了HTTP/2基于TCP的HOL(前序包阻塞)問題。今天,大多數人都會隨身帶著諸如智能手機等移動設備,在TCP中當網絡環境發生變化時需要重新分配IP地址、建立連接,在未來這顯然太慢了。QUIC通過一個64 bit的GUID(Globally Unique Identifier,全球唯一標識符)來標記傳輸包,服務器可以通過它來區分來源端口,并且在QUIC連接斷開后不需要往返握手來建立連接。
所有這些都使QUIC有著強大的吸引力和應用前景,或許會在某一天取代TCP、HTTP,更有可能的是它們互相吸收對方的長處,共同發展。
[1]Megyesi P, Kr?mer Z, Molnár S. How quick is QUIC[C]// Communications (ICC), 2016 IEEE International Conference on. IEEE, 2016: 1-6.
[2]Biswal P, Gnawali O. Does QUIC make the Web faster[C]// Global Communications Conference (GLOBECOM), 2016 IEEE. IEEE, 2016: 1-6.
[3]Gratzer F. QUIC-Quick UDP Internet Connections[J]. Future Internet (FI) and Innovative Internet Technologies and Mobile Communications (IITM), 2016, 39.
[4]Carlucci G, De Cicco L, Mascolo S. HTTP over UDP: an Experimental Investigation of QUIC[C]//Proceedings of the 30th Annual ACM Symposium on Applied Computing. ACM, 2015: 609-614.
Research on QUIC Protocol
Chen Zhenbo
(Wuhan Research Institute of Post and Telecommunications,Wuhan Hubei,430074)
In order to solve the two main problems of TCP transmission: (1) the time-consuming transmission mechanism of connection and disconnection; (2) Head-of-line blocking (HOL), this paper introduces a new protocol called QUIC, which is based on UDP, uses UDP as the transport layer protocol, avoids the problem of time-consuming and HOL, and ensures the reliability of transmission, overcomes the existing problems of UDP transmission through a clever mechanism .
TCP; HOL; UDP; QUIC