生活随笔
收集整理的這篇文章主要介紹了
UDT的连接建立和释放
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
連接的建立和釋放
UDT有兩種建立連接的方式,C/S模式和聚合模式,在聚合模式中,各UDT Socket會同時向各方發(fā)出連接請求,類似于P2P模式。
在建立連接的過程中,UDT Client(聚合模式中的節(jié)點都是Client)會向UDT Server或者對端節(jié)點發(fā)出握手請求,握手請求報文是一個類型為0的控制包,其帶有如下的信息(假設(shè)A向B發(fā)握手):
1. UDT 版本:用于兼容性處理,目前版本是4。
2. Socket 類型:Socket類型,0代表Stream,1代表數(shù)據(jù)包。
3. 初始化序列號:第一個數(shù)據(jù)包的序列號,隨機(jī)值。
4. 包大小:數(shù)據(jù)包包含頭部信息的完整大小,一般設(shè)置為MTU的值。
5. 最大滑動窗口Flow Window大小:不是必須,但是在目前的實現(xiàn)里需要該值。
6. 連接類型:區(qū)分建立連接的方式 以及 request/response。
7. Socket ID:客戶端的UDT Socket ID。
8. Cookie:避免SYN洪水攻擊。
9. 對端IP地址:B的IP地址。
C/S模型建連
UDT Server首先啟動監(jiān)聽器并接收request,為每個新的UDT Socket創(chuàng)建一個連接。UDT Client以固定周期發(fā)送握手包,直到從Server收到握手的 response,或者超時結(jié)束。UDT Server收到建連請求后,根據(jù)客戶端地址和自身密鑰生成一個cookie,然后將cookie送回客戶端,后續(xù)客戶端請求需要附帶該cookieUDT Server收到握手包和正確的cookie后,將握手包中數(shù)據(jù)包大小值,滑動窗口值和自身設(shè)置的數(shù)據(jù)包大小,滑動窗口值進(jìn)行比較,將其小者設(shè)置為后續(xù)使用值,然后將其同 “服務(wù)器版本”,”初始化序列號” 返回給客戶端。完成后UDT Server將開始準(zhǔn)備接收數(shù)據(jù),同時對收到的任意握手包,服務(wù)器都必須響應(yīng)。UDT Client在收到握手響應(yīng)后即可開始發(fā)送數(shù)據(jù),后續(xù)再收到的握手響應(yīng)都拋棄掉。UDT Client發(fā)出的連接類型為1,響應(yīng)包為-1。UDT Client需要檢查響應(yīng)包的Server是否對應(yīng)于請求包的Server。
聚合模式(P2P模式)建連
該模式下,各節(jié)點會同時向?qū)Ψ秸埱筮B接,初始的連接類型設(shè)置為0,當(dāng)某節(jié)點收到類型為0的請求時,其返回類型為-1的響應(yīng)。如果收到類型為-1的請求時(即上一步節(jié)點返回的-1類型),其返回類型為-2的響應(yīng)。對于類型為-2的請求,不返回響應(yīng)。 各節(jié)點需對握手報文進(jìn)行檢查,此處可以參考C/S模型。節(jié)點只會處理它已發(fā)送請求的對端所發(fā)送過來的請求。 聚合模式的建連請求應(yīng)當(dāng)被UDT Server拒絕掉。 節(jié)點在收到-1的響應(yīng)時初始化連接 該模式適用于有防火墻的網(wǎng)絡(luò)環(huán)境,并且在沒有UDT Server的情況下能提供較好的安全性和可用性。
關(guān)閉連接
如果一個UDT連接中的某節(jié)點想要關(guān)閉,則其會發(fā)送shutdown信息給對方,對方收到信息后也進(jìn)行關(guān)閉操作。shutdown信息使用UDP進(jìn)行傳遞,無法保證達(dá)到,此時會采取超時機(jī)制進(jìn)行關(guān)閉,在16次連續(xù) EXP 超時事件發(fā)生后,對端節(jié)點也會同樣進(jìn)行關(guān)閉操作。在目前的實現(xiàn)中,總超時時間的上限為30秒,下限為3秒。
總結(jié)
以上是生活随笔為你收集整理的UDT的连接建立和释放的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。