UDT的連接建立和釋放

連接的建立和釋放

UDT有兩種建立連接的方式,C/S模式和聚合模式,在聚合模式中,各UDT Socket會同時向各方發出連接請求,類似於P2P模式。
在建立連接的過程中,UDT Client(聚合模式中的節點都是Client)會向UDT Server或者對端節點發出握手請求,握手請求報文是一個類型爲0的控制包,其帶有如下的信息(假設A向B發握手):

1. UDT 版本:用於兼容性處理,目前版本是4。  
2. Socket 類型:Socket類型,0代表Stream,1代表數據包。  
3. 初始化序列號:第一個數據包的序列號,隨機值。
4. 包大小:數據包包含頭部信息的完整大小,一般設置爲MTU的值。
5. 最大滑動窗口Flow Window大小:不是必須,但是在目前的實現裏需要該值。
6. 連接類型:區分建立連接的方式 以及 request/response。
7. Socket ID:客戶端的UDT Socket ID。
8. Cookie:避免SYN洪水攻擊。
9. 對端IP地址:B的IP地址。

C/S模型建連

  1. UDT Server首先啓動監聽器並接收request,爲每個新的UDT Socket創建一個連接。
  2. UDT Client以固定週期發送握手包,直到從Server收到握手的 response,或者超時結束。
  3. UDT Server收到建連請求後,根據客戶端地址和自身密鑰生成一個cookie,然後將cookie送回客戶端,後續客戶端請求需要附帶該cookie
  4. UDT Server收到握手包和正確的cookie後,將握手包中數據包大小值,滑動窗口值和自身設置的數據包大小,滑動窗口值進行比較,將其小者設置爲後續使用值,然後將其同 “服務器版本”,”初始化序列號” 返回給客戶端。完成後UDT Server將開始準備接收數據,同時對收到的任意握手包,服務器都必須響應。
  5. UDT Client在收到握手響應後即可開始發送數據,後續再收到的握手響應都拋棄掉。
  6. UDT Client發出的連接類型爲1,響應包爲-1。
  7. UDT Client需要檢查響應包的Server是否對應於請求包的Server。

聚合模式(P2P模式)建連

  1. 該模式下,各節點會同時向對方請求連接,初始的連接類型設置爲0,當某節點收到類型爲0的請求時,其返回類型爲-1的響應。如果收到類型爲-1的請求時(即上一步節點返回的-1類型),其返回類型爲-2的響應。對於類型爲-2的請求,不返回響應。
  2. 各節點需對握手報文進行檢查,此處可以參考C/S模型。節點只會處理它已發送請求的對端所發送過來的請求。
  3. 聚合模式的建連請求應當被UDT Server拒絕掉。
  4. 節點在收到-1的響應時初始化連接
  5. 該模式適用於有防火牆的網絡環境,並且在沒有UDT Server的情況下能提供較好的安全性和可用性。

關閉連接

如果一個UDT連接中的某節點想要關閉,則其會發送shutdown信息給對方,對方收到信息後也進行關閉操作。shutdown信息使用UDP進行傳遞,無法保證達到,此時會採取超時機制進行關閉,在16次連續 EXP 超時事件發生後,對端節點也會同樣進行關閉操作。在目前的實現中,總超時時間的上限爲30秒,下限爲3秒。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章