基于UDP協議的UDT格式介紹
UDT,類似于UDP協議。那么它的中文翻譯則是基于UDP的傳輸協議。在理解上面我們如何進行區分和理解呢?下面我們就來對這兩個協議進行一下說明。首先,UDT是雙工的,每個UDT實體有兩個部分:發送和接收。發送者根據流量控制和速率控制來發送(和重傳)應用程序數據。接收者接收數據包和控制包,并根據接收到的包發送控制包。發送和接收程序共享同一個UDP協議的端口來發送和接收。
接收者也負責觸發和處理所有的控制事件,包括擁塞控制和可靠性控制和他們的相對機制,例如RTT估計、帶寬估計、應答和重傳。
UDT總是試著將應用層數據打包成固定的大小,除非數據不夠這么大。和TCP相似的是,這個固定的包大小叫做MSS(***包大小)。由于期望UDT用來傳輸大塊數據流,我們假定只有很小的一部分不規則的大小的包在UDT session中。MSS可以通過應用程序來安裝,MTU是其***值(包括所有包頭)。
UDT擁塞控制算法將速率控制和窗口(流量控制)合并起來,前者調整包的發送周期,后者限制***的位被應答的包。在速率控制中使用的參數通過帶寬估計技術來更新,它繼承來自基于接收的包方法。同時,速率控制周期是估計RTT的常量,流控制參數依賴于對方的數據到達速度,另外接收端釋放的緩沖區的大小。
包結構
UDT有兩種包:數據包和控制包。他們通過包頭的***位來區分(標志位)。如果是0,表示是數據包,1表示是控制包。
數據包
數據包結構如下顯示:
包序號是UDT數據包頭中唯一的內容。它是一個無符號整數,使用標志位后的31位,UDT使用包基礎的需要,例如,每個非重傳的包都增加序號1。序號在到達***值2^31-1的時候覆蓋。緊跟在這些數據后面的是應用程序數據。
控制包
控制包結構如下:
有6種類型的控制包在UDT中,bit1-3表示這些信息。前32位在包頭中必須存在。控制信息字段包括0(例如,它不存在)或者多個32位無符號整數,這由包類型決定。
UDT使用應答子序號的方法。每個ACK/ACK2包有一個無符號的16位序號,它獨立于數據包需要。它使用位16-31。應答需要從0到(2^16-1)。位16-31在其他控制包中沒有定義。
類型
|
說明
|
控制信息
|
000
|
協議連接握手
|
1.32位 UDT版本
2.32位內部順序號
3.32位 MSS(字節)
4.32位***流量窗口大小(字節)
|
001
|
保活
|
沒有
|
010
|
應答,位16-31是應答序號
|
1.32位包序號,先前接收到的包序號
2.32位,RTT(微秒)
3.32位,RTT 變量或者RTTVar (微秒)
4.32位,流量窗口大小(包的數量)
5.32位,連接容量估計(每秒包的數量)
|
011
|
Negative應答(NAK)
|
丟失信息的32位整數數組,見3.9節
|
100
|
保留
|
這種類型的控制信息保留作為擁塞警告使用,從接收到發送端。一個擁塞警告能被ECN或包延遲增加趨勢的度量方法觸發。
|
101
|
關閉
|
|
110
|
應答一個應答(ACK2)
|
16-31位,應答序號。
|
111
|
4-15的解釋
|
保留將來使用
|
注意,對于數據和控制包來說,可以從UDP協議頭中得到實際的包大小。包大小信息能被用來得到有效的數據負載和NAK包中的控制信息字段大小。
定時器
UDT在接收端使用4個定時器來觸發不同的周期事件,包括速率控制、應答、丟失報告(negative應答)和重傳/連接維護。
UDT中的定時器使用系統時間作為源。UDT接收端主動查詢系統時間來檢查一個定時器是否過期。對于某個定時器T來說,其擁有周期TP,將定變量t用來記錄最近T被設置或復位的時間。如果T在系統時間t0(t= t0)被復位,那么任何t1(t1-t>=TP)是T過期的條件。
四個定時器是:RC定時器、ACK定時器、NAK定時器、EXP定時器。他們的周期分別是:RCTP、ATP、NTP、ETP。
RC定時器用來觸發周期性的速率控制。ACK定時器用來觸發周期性的有選擇的應答(應答包)。RCTP和ATP是常量值,值為:RCTP=ATP=0.01秒。
NAK被用來觸發negative應答(NAK包)。重傳定時器被用來觸發一個數據包的重傳和維護連接狀態。他們周期依賴于對于RTT的估計。ETP值也依賴于連續EXP時間溢出的次數。推薦的RTT初始值是0.1秒,而NTP和ETP的初始值是:NTP=3*RTT,ETP=3*RTT+ATP。
在每次bounded UDP協議接收操作(如果收到一個UDP協議包,一些額外的必須的數據處理時間)時查詢系統時間來檢查四個定時器是否已經過期。推薦的周期粒度是微秒。UDP接收時間溢出值是實現的一個選擇,這依賴于循環查詢的負擔和事件周期精確度之間的權衡。
速率控制事件更新包發送周期,UDT發送端使用STP來安排數據包的發送。假定一個在時間t0被發送,那么下一次包發送時間是(t0+ STP)。換句話說,如果前面的包發送花費了t’時間,發送端將等待(STP-t’)來發送下一個數據包(如果STP-t’ <0,就不需要等待了)。這個等待間隔需要一個高精確度的實現,推薦使用CPU時鐘周期粒度。