UDT 最新协议分析
UDT4 最新協議分析
- 背景
- 協議
- 與IETF草案版本差異
- 簡介
- 數據結構
- 數據包
- 控制包
- 定時器
- 兩種連接模式
- 數據發送與接收
- 發送端算法
- 發送端數據結構
- 數據發送算法
- 接收端算法
- 接收端數據結構
- 數據接收算法
- 流控
- 丟包信息壓縮
- 可配置的擁塞控制
- CCC接口
- 原生控制算法
- 當ACK包被接收
- 當NAK包被接收
- 效率與安全
背景
網絡帶寬占用與實際物理管道通信能力之間的矛盾愈加突出,TCP越來越不能滿足需求,傳輸效率提升需求很迫切。如果對這個領域細分的話,其實每個細分領域的需求各不一樣,比如分布式計算,實時通信,直播,在線游戲等。有些對實時性要求更高,也有些對數據完整性要求更高,當然也有兩者兼而有之。
為什么會出現網絡傳輸效率降低呢?這有網絡擁塞的原因,也有傳輸協議的問題。從網絡擁塞上來說,最根本還是中間網關或管道的限制。當大量數據涌入一個流量限制通路,路由器排隊丟失導致丟包;如果路由器性能不足,或者出現故障,也會出現大量的數據丟失。如果采用TCP傳輸,會導致數據重傳,以及傳輸窗口降低影響效率,也存在重新選路的可能。
UDT(UDP-based Data Transfer Protocol)主要針對當前TCP進行長距離傳輸大量數據時的性能表現較差而提出,建立在UDP之上,引入新的擁塞控制以及可靠性,支持可靠的流式傳輸(類似TCP),以及部分可靠的數據報傳輸(增強UDP)。除了高速數據傳輸之外的其它應用領域,例如點到點技術(P2P),防火墻穿透,多媒體數據傳輸等等。
協議
與IETF草案版本差異
協議內容以代碼UDT4中包含的draft-gg-udt-xx為準,更新時間為2013年。在IETF中的協議版本為draft-gg-udt-03,更新時間為2010年。
簡介
UDT是面向連接的雙工協議,每個UDT實體有兩個部分:發送和接收。發送者根據流量控制和速率控制來發送(和重傳)應用程序數據。接收者接收數據包和控制包,并根據接收到的包發送控制包。發送和接收程序共享同一個UDP端口來發送和接收。
接收者也負責觸發和處理所有的控制事件,包括擁塞控制和可靠性控制和他們的相對機制,例如RTT估計、帶寬估計、應答和重傳。所以整個系統依靠接收者對網絡的統計與計算進行調節。
因為使用UDP傳輸,所以可能需要對應用層數據進行分包與重組,這樣就決定了需要有字節包頭格式。流式傳輸時需要填滿上一分包,這一點與TCP類似。從傳輸效率來看,使用流式傳輸效率更高,尤其針對大量的數據或者大塊數據。
UDT在傳輸效率優化時,同樣希望可以兼顧到公平,所以也有自己的擁塞控制算法和流控措施。速率控制調整包的發送周期(RTT估計),擁塞窗口限制傳輸到網絡的數據量(接收方數據到達速度,接收緩沖窗口大小)。
數據結構
數據包
第一個bit為0,標識數據包。
FF標識一個消息中各個包的位置,11:單獨的數據包,10:一個數據流中的第一個數據包,01:一個數據流中的最后一個數據包。緊隨其后的bit位標記是否立即發送數據。
Destination Socket ID是在端口復用時用來區分哪一個連接的數據。因為UDT支持多個連接使用同一個端口。
控制包
第1 bit為1,標識控制包。第2-16bit標識控制報的類型,UDT定義了8種數據類型,其余暫時保留,根據不同的類型,Additional Info與control Information內容也會不同。
- TYPE 0x0: Protocol Connection Handshake
Additional Info:
Undefined
Control Info:
- TYPE 0x1: Keep-alive
Additional Info:
Undefined
Control Info:
None
- TYPE 0x2: Acknowledgement (ACK)
Additional Info:
ACK sequence number
Control Info:
[The following fields are optional]
- TYPE 0x3: Negative Acknowledgement (NAK)
Additional Info:
Undefined
Control Info:
- TYPE 0x4: Congestion/Delay Warning
Additional Info:
Undefined
Control Info:
None
- TYPE 0x5: Shutdown
Additional Info:
Undefined
Control Info:
None
- TYPE 0x6: Acknowledgement of Acknowledgement (ACK2)
Additional Info:
ACK sequence number
Control Info:
None
- TYPE 0x7: Message Drop Request:
Additional Info:
Message ID
Control Info:
定時器
協議定義了四個定時器ACK,NAK,EXP和SND。SND在發送端,其余在接收端。不同定時器觸發不同的周期事件,包括速率控制、應答、丟失報告(negative應答)和重傳/連接維護。定時器使用系統時間,并主動查詢是否到期。
SND定時器用來觸發周期性的速率控制。
ACK定時器周期被CC控制,周期性的有選擇的發送ACK包,檢查周期不超過一個SYN時間 0.01秒。
NAK被用來觸發發送NAK包。重傳定時器被用來觸發一個數據包的重傳和維護連接狀態。他們周期依賴于對于RTT的估計,周期動態更新為4 * RTT + RTTVar + SYN,RTTVar為RTT樣本方差。
EXP被用于觸發丟包重傳和維護連接狀態。周期動態更新為 N * (4 * RTT + RTTVar + SYN), N 為連續超時的次數,且周期最小值被設定,默認為0.5秒,以防止太頻繁被觸發。
兩種連接模式
C/S模式:客戶端服務器模式,傳統模式。由客戶端向服務器端發起連接請求。而服務器端需要先建立監聽,以便接受連接請求。
Rendezvous模式:會和模式,通信雙方同時向對方發送連接請求。這種情況,在NAT穿越后較多用到。不能接受C/S模式下的連接請求。
對于已經建立UDT連接的雙方來說,發送方發送一個關閉請求,且只發送一次。如果接受沒有接收到,需要等到16*EXP后再自行關閉。總超時有最小最大閾值,參考值設置為3秒到30秒。
數據發送與接收
發送端根據擁塞控制和流量控制,決定如何發送數據包或者重傳可能丟失的數據包。接收端負責觸發控制事件NAK、ACK和EXP,處理所有相關控制機制。
發送端算法
發送端數據結構
- 發送丟失鏈表(Sender’s Loss List)
記錄從接收端返回的NAK包記錄的丟包信息以及觸發超時事件時的包序號(發生超時事件時會插入鏈表)。
數據發送算法
接收端算法
接收端數據結構
- 接收端丟失鏈表
包括一個二元組和一個參數。二元組為檢測到丟包的序號,和最新反饋的時間。參數k是每一個包被NAK反饋的次數。丟失鏈表中序號升序排列。 - ACK 歷史窗口
記錄每個發送的ACK,以及發送時間。循環數組。 - PKT 歷史窗口
記錄每個數據包的到達時間。循環數組。 - 包對窗口
記錄每個探測包隊的間隔時間。循環數組。 - LRSN
記錄接收到的數據包最大序號,初始化為1。 - ExpCount
記錄連續發生EXP超時時間的次數。
數據接收算法
- 數據接收算法
如果當前數據包的序號小于LRSN,從接收丟失鏈表中刪除。
- ACK定時器事件處理過程
如果接收丟失鏈表非空,ACK 序號為 LRSN + 1;否則,ACK 序號為接收丟失鏈表中最小序號。
計算存儲在PKT歷史窗口中最近16個包到達時間的中值AI。去掉大于 AI * 8或者AI/8的值。如果剩余超過8個,計算均值 AI’和包到達速率 1/AI’(每秒包到達個數),否則,小于8個則返回0。
計算包對窗口中最近的16個包對時間間隔的中值PI,鏈路容量值為1/PI(每秒包數量)。
- ACK定時器事件處理過程
如果接收丟失鏈表非空,ACK 序號為 LRSN + 1;否則,ACK 序號為接收丟失鏈表中最小序號。
計算存儲在PKT歷史窗口中最近16個包到達時間的中值AI。去掉大于 AI * 8或者AI/8的值。如果剩余超過8個,計算均值 AI’和包到達速率 1/AI’(每秒包到達個數),否則,小于8個則返回0。
計算包對窗口中最近的16個包對時間間隔的中值PI,鏈路容量值為1/PI(每秒包數量)。
- NAK事件處理過程
搜索接收丟失鏈表,尋找最后的反饋時間在 k*RTT的所有包序號,k初始化為2,并且每次反饋增加1。通過NAK將所有包反饋給發送端。
- EXP事件處理過程
- 接收到ACK 控制包的處理過程
- 接收到NAK 控制包的處理過程
- 接收到ACK2控制包的處理過程
- 接收到消息丟失請求的處理過程
流控
流量控制窗口初始值設置為16。
接收到ACK消息時,流窗口大小更新為接收端當前的可用緩沖大小。
丟包信息壓縮
NAK包中攜帶的丟失信息是一個32-bit整數的數組。如果數組的第一位為0,表示這個序號的包丟失,如果第1位是1,意味著從這個號碼開始(包括該號碼)到下一個數組中的元素(包括這個元素值)之間的包(它的第1位必須是0)都丟失。例如,下面的NAK中攜帶的信息:
0x00000002, 0x80000006, 0x0000000B, 0x0000000E
上面的信息表明序號為:2,6,7,8,9,10,11,14的包都丟了
可配置的擁塞控制
UDT中的擁塞控制使用一種開放式的框架,用戶可以較容易的實現自定義的算法,或者在多個算法之間切換。在UDT的控制算法框架中,已經實現了原生的控制算法。
用戶定義的算法可能重定義許多控制流程以及適配一些UDT參數。這些流程將在某一時間出現時被調用,例如,當ACK接收到時,控制算法可能增加擁塞窗口大小。
CCC接口
UDT允許用戶接入兩個擁塞控制參數:擁塞窗口大小和包間發送時間間隔。用戶可以通過調整參數適配這兩個參數來實現基于窗口的控制,基于速率的控制或者混合方法。另外,下列參數也將被公開:
UDT實現同樣可以公開一些其他的參數,這些信息被在用戶自定義的擁塞控制算法中使用,以挑戰包發送速率。
下列的控制事件能通過CCC進行重定義(比如通過回調的方式):
用戶還可以在自定義算法中調整下列參數:
原生控制算法
如果用戶沒有自定義控制算法,那么UDT缺省使用原生的控制算法,并被CCC執行。
UDT原生算法是一種混合型的擁塞控制算法,因此需要調整擁塞窗口大小和包間間隔。原生算法使用基于定時器的ACK,ACK之間的時間間隔為SYN。
出視擁塞控制窗口大小為16個包,并且包間間隔為0,算法以慢啟動開始,直到第一個ACK或NAK到來。
當ACK包被接收
if (B <= C) inc = min_inc
else inc = max(10^(ceil( log10( (B-C) * PS * 8 ) )) * Beta/PS, min_inc)
其中,B 為鏈路容量估計,C為當前發送速率估計,單位 包數/秒。
Beta 是常數 0.0000015,min_inc 為最小增加值,0.01,表示每秒至少增加一個包(SYN)。
SND = (SND * SYN) / (SND * inc + SYN)
在碼率降低時有四個參數將被使用,初始值為圓括號內值:
一個擁塞周期被定義為介于 2個NAK包之間,并且第一個最大的丟包序號大于LastDecSeq。
當NAK包被接收
如果被觀察到接收速率被從包間間隔設置為 1/recvrate,停止。
否則,根據當前窗口大小(cwnd / rtt + SYN)設置發送速率,繼續以步驟2中方法減少窗口。
更新AvgNAKNum,重置NAKCount為1,計算DecRandom為1到AvgNAKNum之間的一個平均分布的隨機數,更新LastDecSeq。停止。
a. 更新SND period: SND = SND * 1.125;
b. DecCount以增加值1進行增加;
c. 記錄當前最大發送序號LastDecSeq。
效率與安全
UDT原生控制算法被設計給海量數據在高帶寬時延積網絡傳輸數據的。這也就解釋了為什么在日常使用中有些應用批判UDT效果不佳的問題,尤其在無線網絡。
所以永遠不要期望存在一種算法適合所有的網絡狀態,只能與具體的業務進行分析,才能優化出更好的效果。與其抱怨算法的太差,不如回頭梳理自己的需求是否一致以及如何修改或者創新。
UDT安全機制類似與TCP。
總結
以上是生活随笔為你收集整理的UDT 最新协议分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用MUI花两天时间快速开发『One·一个
- 下一篇: 锂电池和锂离子电池命名规则