QUIC(Quick UDP Internet Connections,,快速UDP互聯(lián)網(wǎng)連接)是Google提出的一種基于UDP改進(jìn)的通信協(xié)議,,其目的是降低網(wǎng)絡(luò)通信的延遲,提供更好的用戶互動體驗,。 QUIC的主要特點包括:具有SPDY(SPDY是谷歌研制的提升HTTP速度的協(xié)議,,是HTTP/2.0的基礎(chǔ))所有的優(yōu)點;0-RTT連接,;減少丟包,;前向糾錯,減少重傳時延,;自適應(yīng)擁塞控制,, 減少重新連接;相當(dāng)于TLS加密,。 有關(guān)QUIC的詳細(xì)資料可以參考http://www./quic里的相關(guān)文檔和代碼,。 1.重傳與恢復(fù)與TCP類似,QUIC每發(fā)送一個包后,,都會等待回復(fù)一個確認(rèn)包,。當(dāng)丟包率超過協(xié)議的糾錯門限時,會顯式或隱式地進(jìn)行重傳 對于某些重要的數(shù)據(jù)包,,如初始密鑰協(xié)商時的數(shù)據(jù)包,,在建立連接時非常重要,如果這類包丟失會阻塞整體數(shù)據(jù)流,。QUIC對于這一類數(shù)據(jù)包在確認(rèn)發(fā)生丟失前就會嘗試重傳,,通常是等待較短的時間(如20ms)沒收到確認(rèn)后就馬上再次發(fā)送。這樣在網(wǎng)絡(luò)中會有若干個相同的包同時傳輸,,只要有一個能成功抵達(dá)就完成了連接,,這樣降低了丟包率。接收方對于關(guān)鍵數(shù)據(jù)包的多次發(fā)送和普通數(shù)據(jù)包的超時重傳,,都采用相同的重復(fù)包處理機(jī)制 QUIC在擁塞避免算法的基礎(chǔ)上還加入了心跳包,,用于減少丟包率 QUIC使用了FEC(前向糾錯碼)來恢復(fù)數(shù)據(jù),F(xiàn)EC采用簡單異或的方式,。每次發(fā)送一組數(shù)據(jù),,包括若干個數(shù)據(jù)包后,并對這些數(shù)據(jù)包依次作異或運算,,最后的結(jié)果作為一個FEC包再發(fā)送出去,。接收方收到一組數(shù)據(jù)后,根據(jù)數(shù)據(jù)包和FEC包即可以進(jìn)行校驗和糾錯。 2.安全性QUIC對每個散裝的UDP包都進(jìn)行了加密和認(rèn)證的保護(hù),,并且避免使用前向依賴的處理方法(如CBC模式),,這樣每個UDP包可以獨立地根據(jù)IV進(jìn)行加密或認(rèn)證處理。 QUIC采用了兩級密鑰機(jī)制:初始密鑰和會話密鑰,。初次連接時不加密,并協(xié)商初始密鑰,。初始密鑰協(xié)商完畢后會馬上再協(xié)商會話密鑰,,這樣可以保證密鑰的前向安全性,之后可以在通信的過程中就實現(xiàn)對密鑰的更新,。接收方意識到有新的密鑰要更新時,,會嘗試用新舊兩種密鑰對數(shù)據(jù)進(jìn)行解密,直到成功才會正式更新密鑰,,否則會一直保留舊密鑰有效,。 3. 0-RTT握手過程QUIC握手的過程是需要一次數(shù)據(jù)交互,0-RTT時延即可完成握手過程中的密鑰協(xié)商,,比TLS相比效率提高了5倍,,且具有更高的安全性。 QUIC在握手過程中使用Diffie-Hellman算法協(xié)商初始密鑰,,初始密鑰依賴于服務(wù)器存儲的一組配置參數(shù),,該參數(shù)會周期性的更新。初始密鑰協(xié)商成功后,,服務(wù)器會提供一個臨時隨機(jī)數(shù),,雙方根據(jù)這個數(shù)再生成會話密鑰。 具體握手過程如下: (1) 客戶端判斷本地是否已有服務(wù)器的全部配置參數(shù),,如果有則直接跳轉(zhuǎn)到(5),,否則繼續(xù) (2) 客戶端向服務(wù)器發(fā)送inchoate client hello(CHLO)消息,請求服務(wù)器傳輸配置參數(shù) (3) 服務(wù)器收到CHLO,,回復(fù)rejection(REJ)消息,,其中包含服務(wù)器的部分配置參數(shù) (4) 客戶端收到REJ,提取并存儲服務(wù)器配置參數(shù),,跳回到(1) (5) 客戶端向服務(wù)器發(fā)送full client hello消息,,開始正式握手,消息中包括客戶端選擇的公開數(shù),。此時客戶端根據(jù)獲取的服務(wù)器配置參數(shù)和自己選擇的公開數(shù),,可以計算出初始密鑰。 (6) 服務(wù)器收到full client hello,,如果不同意連接就回復(fù)REJ,,同(3);如果同意連接,根據(jù)客戶端的公開數(shù)計算出初始密鑰,,回復(fù)server hello(SHLO)消息,,SHLO用初始密鑰加密,并且其中包含服務(wù)器選擇的一個臨時公開數(shù),。 (7) 客戶端收到服務(wù)器的回復(fù),,如果是REJ則情況同(4);如果是SHLO,,則嘗試用初始密鑰解密,,提取出臨時公開數(shù) (8) 客戶端和服務(wù)器根據(jù)臨時公開數(shù)和初始密鑰,各自基于SHA-256算法推導(dǎo)出會話密鑰 (9) 雙方更換為使用會話密鑰通信,,初始密鑰此時已無用,,QUIC握手過程完畢。之后會話密鑰更新的流程與以上過程類似,,只是數(shù)據(jù)包中的某些字段略有不同,。
|
|