QUIC簡介
QUIC的全稱是 Quick UDP Internet Connection,叫做快速UDP網路連接,是Google提出的一個基于UDP的可靠的安全的傳輸協議,
QUIC的改進
相較于HTTP2+TCP+TLS,QUIC有以下優點:
1、 QUIC減少了TCP+TLS的握手時間
2、 QUIC減少了TCP的隊頭阻塞
3、 QUIC支持連接轉移
4、 QUIC支持改進版的擁塞控制
5、 QUIC有著更精確的RTT時間
QUIC報文結構
一個QUIC的基本單位為packet,也就是包,

QUIC頭部
1、 Flags占8個位元組,里面記錄了報文的型別、ConnectionID的長度、Version的長度、Packet Number的長度,
2、 Connection ID:一個QUIC連接對應著一個Connection ID,是一個QUIC 連接 的唯一標識, QUIC 不用 源IP、源埠、目的IP、目的埠 四元組來為唯一標識一個連接,而是通過一個Connection ID,目的是為了連接轉移,
3、 Version : QUIC的版本號
4、 Packet Number: 一個QUIC包的唯一標識,是遞增的,
QUIC實際資料
QUIC包中的資料是由多個幀組成的,我們先說下幀的結構

1、 Type 中包含幀的類別,比如ack幀、FIN幀等、還有流識別符號、資料偏移量、資料大小的位元組長度,
2、 流識別符號:一個發送請求對應著一個流
3、 流偏移量:當前幀在流中的偏移位置
4、 資料長度: 幀中攜帶資料的位元組大小
5、 接下來就是實際傳輸的資料,
QUIC組成結構
一個發送請求對應著一個流,
一個流中包含多個幀,
一個流可以通過多個包進行傳遞,
QUIC 就是由 包 packet 和 幀 組成的,
一個packet 包中可以同時包含多個幀,幀與幀之間沒有關系,
幀 和 packet 之間沒有什么關系,packet 只是用來運載幀的,
QUIC安全連接詳解
在閱讀下面流程,需要掌握DH演算法的作業流程,不熟悉的可以看下我之前俺寫的一篇文章,HTTPS之TLS1.2連接詳解,
QUIC 是 安全的, 其使用DH演算法生成對稱密鑰,連接如下:
1、客戶端發送Client Hello給服務器,請求DH生成密鑰的引數
2、服務器回傳對應的引數和公鑰給引數給客戶端
3、客戶端收到DH引數以及服務器的公鑰,生成了密鑰,然后將自己公鑰發給服務器,在此時,客戶端已經可以利用密鑰加密資料進行傳輸了,
4、服務器收到客戶端的公鑰后,也可以得出對應的密鑰了,可以解密客戶端發來的密文,
從上述流程看出,僅僅1個RTT,客戶端和服務器就可以生成對稱密鑰,可以安全的進行連接了,
QUIC 還有進一步優化,優化到了0RTT,
客戶端可以快取服務器的DH引數,這樣的話,客戶端在進行連接的時候,就可以生成對應的密鑰,然后將自己的公鑰傳過去,服務器同樣可以利用客戶端的公鑰生成密鑰,然后解密資料,
0RRT就可以建立安全連接,太好了,
QUIC資料傳輸和重傳
QUIC將上層資料包,比如HTTP3資料包,分成多個幀,然后組裝成一個Packet 發送,
每個幀都會有一個定時器,如果在規定時間內收不到對應的ack,就重傳對應的幀,還是通過packet,如果有其他幀一塊,就湊成一個packet,如果沒有,就自己用一個packet,
QUIC解決隊頭阻塞
TCP利用的是滑動埠,埠中的前面的資料不被讀取,后面的資料無法被讀取,這就意味著不同的請求之間存在前后制約關系,進而出現了隊頭阻塞問題,
因為UDP每個請求都對應著一個流,每個流都直接被拆分成幀直接被發送出去,請求與請求之間不存在制約關系,所以不會存在隊頭阻塞問題,
但是流內部之間由于網路問題,有的時候會出現后面的資料先于前面的資料發送到對方,也會造成后面的資料等待前面的資料,但這是無法避免的事,任何協議都無法避免,QUIC在這方面已經做到最好了,
QUIC 連接遷移
假如 手機 從 WiFi 切換到了 手機資料網路,對應的IP地址會發生改變,
TCP 是利用 源IP地址、源埠、目的IP地址、目的埠 四元組來唯一標識一個TCP連接,服務器也是通過這個四元組來維護連接資訊的,所以更換了IP地址資訊,肯定要重新建立連接,
QUIC是不需要新建連接的,
因為QUIC是基于UDP,UDP是無連接的,QUIC是通過一個Connection ID來標識一個連接,,服務器也是通過Connection ID來標識一個QUIC連接的資訊,即使切換了網路,新網路還可以通過之前的Connection ID來繼續利用之前的連接,無需新建連接,
QUIC估算RTT

相較于TCP,因為TCP超時重傳的Seq 和之前的包是一模一樣的,發送方無法判斷是之前發送的包的ack,還是重傳的包的ack,有歧義性,當出現重傳的時候,就會造成RTT的不準確,
QUIC就不一樣了,QUIC每次重傳都會新增對應的Packet Num,RTT完全就是每個包對應的往返時間,

與此同時,QUIC還會統計服務器收到資料包和回傳ACK的相關時間,也就說會將服務器處理資料的時間從RTT中減去,更加精確了,
QUIC的RTT判斷是比較準確的,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/302480.html
標籤:其他
