UDT Unstructured Data Transformation 非結(jié)構(gòu)化數(shù)據(jù)變換
1. 介紹隨著網(wǎng)絡(luò)帶寬時(shí)延產(chǎn)品(BDP)的增加,通常的TCP協(xié)議開(kāi)始變的低效。這是因?yàn)樗腁IMD(additive increase multiplicative decrease)算法完全減少了TCP擁塞窗口,但不能快速的恢復(fù)可用帶寬。理論上的流量分析表明TCP在BDP增加到很高的時(shí)候比較容易受包損失攻擊。
另外,繼承自TCP擁塞控制的不公平的RTT也成為在分布式數(shù)據(jù)密集程式中的嚴(yán)重問(wèn)題。擁有不同RTT的并發(fā)TCP流將不公平地分享帶寬。盡管在小的BDP網(wǎng)絡(luò)中使用通常的TCP實(shí)現(xiàn)來(lái)相對(duì)平等的共享帶寬,但在擁有大量BDP的網(wǎng)絡(luò)中,通常的基于TCP的程式就必須承受?chē)?yán)重的不公平的問(wèn)題。這個(gè)RTT基于的算法嚴(yán)重的限制了其在廣域網(wǎng)分布式計(jì)算的效率,例如:internet上的網(wǎng)格計(jì)算。
一直到今天,對(duì)標(biāo)準(zhǔn)的TCP的提高一直都不能在高BDP環(huán)境中效率和公平性方面達(dá)到滿意的程度(特別是基于RTT的問(wèn)題)。例如:TCP的修改,RFC1423(高性能擴(kuò)展),RFC2018(SACK)、RFC2582(New Reno)、RFC2883(D-SACK)、和RFC2988(RTO計(jì)算)都或多或少的提高了點(diǎn)效率,但最根本的AIMD算法沒(méi)有解決。HS TCP(RFC 3649)通過(guò)根本上改變TCP擁塞控制算法來(lái)在高BDP網(wǎng)絡(luò)中獲得高帶寬利用率,但公平性問(wèn)題仍然存在。
考慮到上面的背景,需要一種在高BDP網(wǎng)絡(luò)支持高性能數(shù)據(jù)傳輸?shù)膫鬏攨f(xié)議。我們推薦一個(gè)應(yīng)用程式級(jí)別的傳輸協(xié)議,叫UDT或基于UDP的數(shù)據(jù)傳輸協(xié)議并擁有用塞控制算法。
本文描述兩個(gè)正交的部分,UDP協(xié)議和UDT擁塞控制算法。一個(gè)應(yīng)用層級(jí)別的協(xié)議,位于UDP之上,使用其他的擁塞算法,然而這些本文中描述的算法也能夠在其他協(xié)議中實(shí)現(xiàn),例如:TCP。
一個(gè)協(xié)議的參考實(shí)現(xiàn)叫[UDT];周詳?shù)膿砣刂扑惴ǖ男阅芊治鲈赱GHG04]中能夠找到。
2. 設(shè)計(jì)目標(biāo)UDT主要用在小數(shù)量的bulk源共享富裕帶寬的情況下,最典型的例子就是建立在光纖廣域網(wǎng)上的網(wǎng)格計(jì)算,一些研究所在這樣的網(wǎng)絡(luò)上運(yùn)行他們的分布式的數(shù)據(jù)密集程式,例如,遠(yuǎn)程訪問(wèn)儀器、分布式數(shù)據(jù)挖掘和高分辨率的多媒體流。
UDT的主要目標(biāo)是效率、公平、穩(wěn)定。單個(gè)的或少量的UDT流應(yīng)該利用任何高速連接提供的可用帶寬,即使帶寬變化的很劇烈。同時(shí),任何并發(fā)的流必須公平地共享帶寬,不依賴于不同的帶寬瓶勁、起始時(shí)間、RTT。穩(wěn)定性需要包發(fā)送速率應(yīng)該一直會(huì)聚可用帶寬很快,并且必須避免擁塞碰撞。
UDT并不是在瓶勁帶寬相對(duì)較小的和大量多元短文檔流的情況下用來(lái)取代TCP的。
UDT主要作為T(mén)CP的朋友,和TCP并存,UDT分配的帶寬不應(yīng)該超過(guò)根據(jù)MAX-MIN規(guī)則的最大最小公平共享原則。(備注,最大最小規(guī)則允許UDT在高BDP連接下分配TCP不能使用的可用帶寬)。我們
3. 協(xié)議說(shuō)明3.1. 概述UDT是雙工的,每個(gè)UDT實(shí)體有兩個(gè)部分:發(fā)送和接收。發(fā)送者根據(jù)流量控制和速率控制來(lái)發(fā)送(和重傳)應(yīng)用程式數(shù)據(jù)。接收者接收數(shù)據(jù)包和控制包,并根據(jù)接收到的包發(fā)送控制包。發(fā)送和接收程式共享同一個(gè)UDP端口來(lái)發(fā)送和接收。
接收者也負(fù)責(zé)觸發(fā)和處理任何的控制事件,包括擁塞控制和可靠性控制和他們的相對(duì)機(jī)制,例如RTT估計(jì)、帶寬估計(jì)、應(yīng)答和重傳。
UDT總是試著將應(yīng)用層數(shù)據(jù)打包成固定的大小,除非數(shù)據(jù)不夠這么大。和TCP相似的是,這個(gè)固定的包大小叫做MSS(最大包大小)。由于期望UDT用來(lái)傳輸大塊數(shù)據(jù)流,我們假定只有很小的一部分不規(guī)則的大小的包在UDT session中。MSS能夠通過(guò)應(yīng)用程式來(lái)安裝,MTU是其最優(yōu)值(包括任何包頭)。
UDT擁塞控制算法將速率控制和窗口(流量控制)合并起來(lái),前者調(diào)整包的發(fā)送周期,后者限制最大的位被應(yīng)答的包。在速率控制中使用的參數(shù)通過(guò)帶寬估計(jì)技術(shù)來(lái)更新,他繼承來(lái)自基于接收的包方法。同時(shí),速率控制周期是估計(jì)RTT的常量,流控制參數(shù)依賴于對(duì)方的數(shù)據(jù)到達(dá)速度,另外接收端釋放的緩沖區(qū)的大小。
3.2. 包結(jié)構(gòu)UDT有兩種包:數(shù)據(jù)包和控制包。他們通過(guò)包頭的第一位來(lái)區(qū)分(標(biāo)志位)。假如是0,表示是數(shù)據(jù)包,1表示是控制包。
3.2.1. 數(shù)據(jù)包
數(shù)據(jù)包結(jié)構(gòu)如下顯示:
0 1 3 4
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
0
包序號(hào)
應(yīng)用數(shù)據(jù)
包序號(hào)是UDT數(shù)據(jù)包頭中唯一的內(nèi)容。他是個(gè)無(wú)符號(hào)整數(shù),使用標(biāo)志位后的31位,UDT使用包基礎(chǔ)的需要,例如,每個(gè)非重傳的包都增加序號(hào)1。序號(hào)在到達(dá)最大值2^31-1的時(shí)候覆蓋。緊跟在這些數(shù)據(jù)后面的是應(yīng)用程式數(shù)據(jù)。
3.2.2. 控制包控制包結(jié)構(gòu)如下:
0 1 3 4
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
1
類(lèi)型
保留
ACK序號(hào)
控制信息字段
有6種類(lèi)型的控制包在UDT中,bit1-3表示這些信息。前32位在包頭中必須存在?刂菩畔⒆侄伟0(例如,他不存在)或多個(gè)32位無(wú)符號(hào)整數(shù),這由包類(lèi)型決定。
UDT使用應(yīng)答子序號(hào)的方法。每個(gè)ACK/ACK2包有一個(gè)無(wú)符號(hào)的16位序號(hào),他單獨(dú)于數(shù)據(jù)包需要。他使用位16-31。應(yīng)答需要從0到(2^16-1)。位16-31在其他控制包中沒(méi)有定義。
類(lèi)型
說(shuō)明
控制信息
000
協(xié)議連接握手
1.32位 UDT版本
2.32位 內(nèi)部順序號(hào)
3.32位 MSS(字節(jié))
4.32位 最大流量窗口大小(字節(jié))
001
保活
沒(méi)有
010
應(yīng)答,位16-31是應(yīng)答序號(hào)
1.32位包序號(hào),先前接收到的包序號(hào)
2.32位,RTT(微秒)
3.32位,RTT 變量或RTTVar (微秒)
4.32位,流量窗口大。ò臄(shù)量)
5.32位,連接容量估計(jì)(每秒包的數(shù)量)
011
Negative應(yīng)答(NAK)
丟失信息的32位整數(shù)數(shù)組,見(jiàn)3.9節(jié)
100
保留
這種類(lèi)型的控制信息保留作為擁塞警告使用,從接收到發(fā)送端。一個(gè)擁塞警告能被ECN或包延遲增加趨勢(shì)的度量方法觸發(fā)。
101
關(guān)閉
110
應(yīng)答一個(gè)應(yīng)答(ACK2)
16-31位,應(yīng)答序號(hào)。
111
4-15的解釋
保留將來(lái)使用
注意,對(duì)于數(shù)據(jù)和控制包來(lái)說(shuō),能夠從UDP協(xié)議頭中得到實(shí)際的包大小。包大小信息能被用來(lái)得到有效的數(shù)據(jù)負(fù)載和NAK包中的控制信息字段大小。
3.3. 定時(shí)器UDT在接收端使用4個(gè)定時(shí)器來(lái)觸發(fā)不同的周期事件,包括速率控制、應(yīng)答、丟失報(bào)告(negative應(yīng)答)和重傳/連接維護(hù)。
UDT中的定時(shí)器使用系統(tǒng)時(shí)間作為源。UDT接收端主動(dòng)查詢系統(tǒng)時(shí)間來(lái)檢查一個(gè)定時(shí)器是否過(guò)期。對(duì)于某個(gè)定時(shí)器T來(lái)說(shuō),其擁有周期TP,將定變量t用來(lái)記錄最近T被配置或復(fù)位的時(shí)間。假如T在系統(tǒng)時(shí)間t0(t= t0)被復(fù)位,那么任何t1(t1-t>=TP)是T過(guò)期的條件。
四個(gè)定時(shí)器是:RC定時(shí)器、ACK定時(shí)器、NAK定時(shí)器、EXP定時(shí)器。他們的周期分別是:RCTP、ATP、NTP、ETP。
RC定時(shí)器用來(lái)觸發(fā)周期性的速率控制。ACK定時(shí)器用來(lái)觸發(fā)周期性的有選擇的應(yīng)答(應(yīng)答包)。RCTP和ATP是常量值,值為:RCTP=ATP=0.01秒。
NAK被用來(lái)觸發(fā)negative應(yīng)答(NAK包)。重傳定時(shí)器被用來(lái)觸發(fā)一個(gè)數(shù)據(jù)包的重傳和維護(hù)連接狀態(tài)。他們周期依賴于對(duì)于RTT的估計(jì)。ETP值也依賴于連續(xù)EXP時(shí)間溢出的次數(shù)。推薦的RTT初始值是0.1秒,而NTP和ETP的初始值是:NTP=3*RTT,ETP=3*RTT+ATP。
在每次bounded UDP接收操作(假如收到一個(gè)UDP包,一些額外的必須的數(shù)據(jù)處理時(shí)間)時(shí)查詢系統(tǒng)時(shí)間來(lái)檢查四個(gè)定時(shí)器是否已過(guò)期。推薦的周期粒度是微秒。UDP接收時(shí)間溢出值是實(shí)現(xiàn)的一個(gè)選擇,這依賴于循環(huán)查詢的負(fù)擔(dān)和事件周期精確度之間的權(quán)衡。
速率控制事件更新包發(fā)送周期,UDT發(fā)送端使用STP來(lái)安排數(shù)據(jù)包的發(fā)送。假定一個(gè)在時(shí)間t0被發(fā)送,那么下一次包發(fā)送時(shí)間是(t0+ STP)。換句話說(shuō),假如前面的包發(fā)送花費(fèi)了t’時(shí)間,發(fā)送端將等待(STP-t’)來(lái)發(fā)送下一個(gè)數(shù)據(jù)包(假如STP-t’ ,就無(wú)需等待了)。這個(gè)等待間隔需要一個(gè)高精確度的實(shí)現(xiàn),推薦使用CPU時(shí)鐘周期粒度。
3.4. 發(fā)送端算法3.4.1. 數(shù)據(jù)結(jié)構(gòu)和變量A. SND PKT歷史窗口:一個(gè)循環(huán)數(shù)組記錄每個(gè)數(shù)據(jù)包的開(kāi)始時(shí)間
B. 發(fā)送端丟失鏈表:發(fā)送段丟失列表是個(gè)連接鏈表,用來(lái)存儲(chǔ)被接收方NAK包中返回的丟失包序號(hào)。這些數(shù)字以增加的順序存儲(chǔ)。
3.4.2. 數(shù)據(jù)發(fā)送算法A. 假如發(fā)送端的丟失鏈表是非空的,重傳第一個(gè)在list中的包,并刪除該成員,到5。
B. 等待有應(yīng)用程式數(shù)據(jù)需要發(fā)送
C. 假如未應(yīng)答的包數(shù)量超過(guò)了兩量窗口的大小,轉(zhuǎn)到1。假如不是包裝一個(gè)新的包并發(fā)送他。
D.假如當(dāng)前包的序號(hào)是16n,n是個(gè)整數(shù),轉(zhuǎn)第2步。
E. 在SND PKT歷史窗口中記錄包的發(fā)送時(shí)間
F. 假如這是自上次發(fā)送速率降低之后的第一個(gè)包,等外SYN時(shí)間。
G.等外(STP – t)時(shí)間,t是第1到第4步之間的總時(shí)間,然后轉(zhuǎn)到1。
3.5. 接收端算法3.5.1. 數(shù)據(jù)結(jié)構(gòu)和變量A. 接收端丟失鏈表:是個(gè)duple連接鏈表,元素的值包括:丟失數(shù)據(jù)包的序號(hào)、最近丟失包的反饋時(shí)間和包已被反饋的次數(shù)。值以包序號(hào)增序的方式存儲(chǔ)。
B. 應(yīng)答歷史窗口:每個(gè)發(fā)送ACK的和時(shí)間一個(gè)循環(huán)數(shù)組;由于其循環(huán)的特性,意味著假如數(shù)組中沒(méi)有更多空間的時(shí)候新的值將覆蓋老的值。
C. RCV PKT歷史窗口:一個(gè)用來(lái)記錄每個(gè)包到達(dá)時(shí)間的循環(huán)數(shù)組。
D.對(duì)包窗口:一個(gè)用來(lái)記錄每個(gè)探測(cè)包對(duì)之間的時(shí)間間隔。
E. LRSN:一個(gè)用來(lái)記錄最大接收數(shù)據(jù)包需要的變量。LRSN被初始化為初始序號(hào)減1。
3.5.2. 數(shù)據(jù)接收算法A. 查詢系統(tǒng)時(shí)間來(lái)檢查RC、ACK、NAK、或EXP定時(shí)器是否過(guò)期。假如任一定時(shí)器過(guò)期,處理事件(本節(jié)下面介紹)并復(fù)位過(guò)期的定時(shí)器。
B. 啟動(dòng)一個(gè)時(shí)間bounded UDP接收。假如每個(gè)包到,轉(zhuǎn)1。
C. 配置exp-count為1,并更新ETP為:ETP=RTT+4*RTTVar + ATP。
D.假如任何的發(fā)送數(shù)據(jù)包已被應(yīng)答,復(fù)位EXP時(shí)間變量。
E. 檢查包頭的標(biāo)志位。假如是個(gè)控制包,根據(jù)類(lèi)型處理他,然后轉(zhuǎn)1。
F. 假如當(dāng)前數(shù)據(jù)包的需要是16n+1,n是個(gè)整數(shù),記錄當(dāng)前包和上個(gè)在對(duì)包窗口中數(shù)據(jù)包的時(shí)間間隔。
G.在PKT歷史窗口中記錄包到達(dá)時(shí)間
H. 假如當(dāng)前數(shù)據(jù)包的序號(hào)大于LRSN+1,將任何在(但不包括)這兩個(gè)值之間的序號(hào)放入接收丟失鏈表,并在一個(gè)NAK包中將這些序號(hào)發(fā)送給發(fā)送端。假如序號(hào)小于LRSN,從接收丟失鏈表中刪除他。
I. 更新LRSN,轉(zhuǎn)1。
3.5.3. RC定時(shí)器到通過(guò)速率控制算法來(lái)更新STP(見(jiàn)3.6節(jié))。
過(guò)程如下:
A. 按照下面的原則查找接收端所接收到的任何包之前的序號(hào):假如接收者丟失鏈表是空的,ACK號(hào)碼是LRSN+1,否則是在接收丟失隊(duì)列中的最小序號(hào)。
B. 假如應(yīng)答號(hào)不大于曾被ACK2應(yīng)答的最大應(yīng)答號(hào),或等于上次應(yīng)答的應(yīng)答號(hào)并且兩次應(yīng)答之間的時(shí)間間隔小于RTT+4*RTTVar,停止(不發(fā)送應(yīng)答)。
C. 分配這個(gè)應(yīng)答一個(gè)唯一增加的ACK序列號(hào),推薦采用ACK序列號(hào)按步驟1增加,并且重疊在達(dá)到最大值之后。
D.根據(jù)下面的算法來(lái)計(jì)算包的抵達(dá)速度:使用PKT歷史窗口中的值計(jì)算最近16個(gè)包抵達(dá)間隔(AI)中值。在這16個(gè)值中,刪除那些大于AI*8或小于AI*8的包,假如最后剩余8個(gè)值,計(jì)算他們的平均值(AI’),包抵達(dá)速度是1/AI’(每秒包的數(shù)量),否則是0。
E. 根據(jù)3.7節(jié)中的內(nèi)容為每端(W)計(jì)算流量窗口。然后計(jì)算有效的流量窗口大小為:最大(W,可用接收方緩沖大。,2)。
F. 根據(jù)下面的算法來(lái)計(jì)算連接容量估計(jì)。假如流量控制快啟動(dòng)階段(3.7)一直繼續(xù),返回0,否則計(jì)算最近16個(gè)對(duì)包間隔(PI),這些值在對(duì)包窗口中,那么連接容量就是1/PI(每秒包的數(shù)量)。
G.打包應(yīng)答序列號(hào),應(yīng)答號(hào),RTT,RTT 變量,有效的流量窗口大小并估計(jì)連接,將他們放入ACK包中,然后發(fā)送出去。
H. 記錄ACK序列號(hào),應(yīng)答號(hào)和這個(gè)應(yīng)答的開(kāi)始時(shí)間,并放入歷史窗口中。
3.5.4. 處理NAK定時(shí)器到時(shí)Ø 查找接受方的丟失鏈表,找到任何上次反饋時(shí)間是(k*(RTT+4*RTTVar ) )前的包,k當(dāng)前這個(gè)包的反饋次數(shù)加1,假如沒(méi)有反饋丟失,停止。
Ø 壓縮第一步中得到的序號(hào)(見(jiàn)3.9),然后在一個(gè)NAK包中發(fā)送他們到發(fā)送方。
Ø 假如不是停止流量控制快啟動(dòng)階段。
3.5.5. 處理EXP定時(shí)器A. 假如發(fā)送端的丟失鏈表不是空的,停止
B. 將任何未應(yīng)答的包放到發(fā)送端的丟失鏈表中
C. 假如(exp-count>16)并且自上次從對(duì)方接收到一個(gè)包以來(lái)的總時(shí)間超過(guò)3秒,或這個(gè)時(shí)間已超過(guò)3分鐘了,這被認(rèn)為是連接已斷開(kāi),關(guān)閉UDT連接。
D.假如沒(méi)有數(shù)據(jù),也就沒(méi)有應(yīng)答,發(fā)送一個(gè);畎o對(duì)端,否則將任何未應(yīng)答包的序號(hào)放入發(fā)送丟失列表中。
E. 更新exp-count為:exp-count= exp-count+1
F. 更新ETP為:ETP=exp-count*(RTT+4*RTTVar)+ATP。
3.5.6. 收到應(yīng)答包A. 更新最大的應(yīng)答序號(hào)
B. 更新RTT和RTTVar為:RTT = rtt, RTTVar = rv;rtt和rv是ACK包中的RTT和RTTVar值。
C. 更新NTP和ETP為:NTP=RTT+4*RTTVar;ETP=exp-count*(RTT+4*RTTVar)+ATP。
D. 更新連接容量估計(jì):B=(B*7+b)/8,b是ACK包帶的值。
E. 更新流量窗口大小為ACK中的值。
F. 發(fā)送ACK2包,并配置和ACK序號(hào)相同的應(yīng)答號(hào)到對(duì)端
G. 復(fù)位EXP定時(shí)器
3.5.7. 當(dāng)收到NAK包的時(shí)候A. 將任何NAK包中帶的序號(hào)放入發(fā)送方的丟失列表中
B. 通過(guò)速率控制來(lái)更新STP(見(jiàn)3.6)
C. 復(fù)位EXP定時(shí)器
3.5.8. 當(dāng)收到ACK2包Ø 在ACK歷史窗口中根據(jù)接收到的ACK2序列號(hào)查找行營(yíng)的ACK包。
Ø 更新曾被應(yīng)答的最大應(yīng)答號(hào)
Ø 根據(jù)ACK2的到達(dá)時(shí)間和ACK離開(kāi)時(shí)間計(jì)算新的rtt值,并且更新RTT和RTTVar值為:
RTTVar = (RTTVar *3 +abs(rtt-RTT)/4
RTT = (RTT *7+rtt)/8
RTT和RTTVar的初始值是0.1秒和0.05秒。
Ø 更新NTP和ETP為:
NTP = RTT;
ETP = (exp-count +1)* RTT+ATP
3.5.9. 當(dāng)收到;畎臅r(shí)候什么也不做
3.5.10. 當(dāng)收到連接握手和關(guān)閉包的時(shí)候見(jiàn)3.8節(jié)
3.6. 速度控制算法3.6.1. 速率控制快啟動(dòng)STP被初始為最小的時(shí)間精度(1個(gè)CPU周期或1毫秒)。這是在快啟動(dòng)階段,一般收到一個(gè)ACK包其攜帶的估計(jì)帶寬大于0這個(gè)階段就停止了。包的發(fā)送周期被配置為1/W,W是ACK攜帶的流量窗口的大小。
快啟動(dòng)階段僅僅在開(kāi)始一個(gè)UDT連接的時(shí)候發(fā)生,且不會(huì)在UDT連接的以后再出現(xiàn)。在快啟動(dòng)階段之后,下面的算法就要工作了。
3.6.2. 當(dāng)RC定時(shí)器時(shí)間到1. 假如在上一個(gè)RCTP時(shí)間內(nèi),沒(méi)有收到一個(gè)ACK,停止
2. 計(jì)算在上個(gè)RCTP時(shí)間內(nèi)的丟失率,計(jì)算方法是根據(jù)總共發(fā)送的包和NAK反饋中總共丟失包的數(shù)量。假如丟失率大于0.1%,停止。
3. 下個(gè)RCTP時(shí)間內(nèi)發(fā)送包的增加數(shù)量如下計(jì)算:(inc)
If (B
Else inc = max (10^(ceil(log10((B-C)*MSS*8)))*Beta/MSS,1/MSS)
B是連接容量估計(jì),C是當(dāng)前的發(fā)送速度。兩個(gè)都計(jì)算為每秒多少個(gè)包。MSS是以字節(jié)計(jì)算的;Beta是值為0.0000015的常量。
4. 更新STP:STP=(STP*RCTP)/(STP*inc + RCTP)
5. 計(jì)算真正的數(shù)據(jù)發(fā)送周期(rsp),從SND PKT歷史窗口中得到,假如(STP)配置STP為(0.5 * rsp)。
6. 假如(STP),配置STP為1.0。
3.6.3. 當(dāng)收到NAK包時(shí)3.6.3.1. 數(shù)據(jù)結(jié)構(gòu)和變量1. LSD:自上次速率降低后發(fā)送的最大序號(hào)
2. NumNAK:自上次LSD更新以后的NAK數(shù)量
3. AvgNAK:當(dāng)最大序號(hào)大于LSD時(shí)兩次事件之間的NAK移動(dòng)的平均數(shù)。
4. DR:在1到AvgNAK之間的隨機(jī)平均數(shù)。
3.6.3.2. 算法1. 假如NAK中最大的丟失序列號(hào)大于LSD:
增加STP為:STP=STP*(1+1/8)
更新AvgNAK為:AvgNAK = (AvgNAK *7 +NumNAK)/8
更新DR
復(fù)位 NumNAK = 0
記錄LSD
2. 否則,增加NumNAK按照1個(gè)步驟增加;假如NumNAK % DR = 0;增加STP為:STP=STP*(1+1/8);記錄LSD。
3.7. 流量控制算法流量控制窗口大。╓)初始值是16。
3.7.1. 當(dāng)ACK定時(shí)器到的時(shí)候1. 流量控制快啟動(dòng):假如沒(méi)有NAK產(chǎn)生或W沒(méi)有到達(dá)或超過(guò)15個(gè)包,并且AS>0,流量窗口大小更新為應(yīng)答包的總數(shù)量。
2. 否則,假如(AS>0),W更新為:(AS是包的到達(dá)速度)
W= ceil (W *0.875+AS* (RTT +ATP) *0.125)
3. 限制W到對(duì)方最大流量窗口大小。
3.8. 連接建立和關(guān)閉一個(gè)UDT實(shí)體首先作為一個(gè)SERVER啟動(dòng),當(dāng)一個(gè)客戶端需要連接的時(shí)候其發(fā)送握手包?蛻舳嗽趶姆⻊(wù)端接收到一個(gè)握手響應(yīng)包或時(shí)間溢出之前,應(yīng)該每隔一段時(shí)間發(fā)送一個(gè)握手包(時(shí)間間隔由響應(yīng)時(shí)間和系統(tǒng)overhead來(lái)權(quán)衡)。
握手包有如下信息:
1. UDT版本:這個(gè)值是兼容的目的。當(dāng)前的版本是2
2. 初始序號(hào):這是發(fā)送這個(gè)UDT實(shí)體將來(lái)用于發(fā)送數(shù)據(jù)包的起始序號(hào)。他必須是個(gè)在1到(2^31-1)之間的隨機(jī)值。另外,建議這個(gè)值在合理的時(shí)間歷史窗口中不應(yīng)該重復(fù)。
3. MSS:數(shù)據(jù)包的大。ㄍㄟ^(guò)IP有效負(fù)載來(lái)度量)
4. 最大的流量窗口大小:這是接收到握手信息的UDT實(shí)體允許的最大流量窗口大小,窗口大小通常限制為接收端的數(shù)據(jù)結(jié)構(gòu)大小。
服務(wù)器接收到一個(gè)握手包之后,比較MSS值和他自己的值并配置他自己的值為較小的值。結(jié)果值也在握手響應(yīng)中被發(fā)送到客戶端,另外更有服務(wù)器的版本信息,初始序列號(hào),最大流量窗口大小。
版本字段用來(lái)檢查兩端的兼容性。初始序列號(hào)和最大流量窗口大小用于初始化接收到這個(gè)握手包的UDT實(shí)體參數(shù)。
服務(wù)器在第一步完成以后就準(zhǔn)備發(fā)送或接收數(shù)據(jù)。然而,只要從同一個(gè)客戶端接收任何握手包,其應(yīng)該發(fā)送響應(yīng)包。
客戶端一旦得到服務(wù)器的一個(gè)握手響應(yīng)其就進(jìn)入發(fā)送和接收數(shù)據(jù)狀態(tài)。配置他自己的MSS為握手響應(yīng)包中的值并初始化相應(yīng)的參數(shù)為包中的值(序列號(hào)、最大流量窗口)。假如收到任何其他的握手信息,丟掉他。
假如其中的UDT實(shí)體要關(guān)閉,他將發(fā)送一個(gè)關(guān)閉信息到對(duì)端;對(duì)方收到這個(gè)信息以后將自己關(guān)閉。這個(gè)關(guān)閉信息通過(guò)UDP傳輸,僅僅發(fā)送一次,并不確保一定收到。假如消息沒(méi)有收到,對(duì)方將根據(jù)時(shí)間溢出機(jī)制來(lái)關(guān)閉連接。
3.9. 丟失信息的壓縮方案NAK包中攜帶的丟失信息是個(gè)32-bit整數(shù)的數(shù)組。假如數(shù)組的中數(shù)字是個(gè)正常的序號(hào)(第1位是0),這意味著這個(gè)序號(hào)的包丟失了,假如第1位是1,意味著從這個(gè)號(hào)碼開(kāi)始(包括該號(hào)碼)到下一個(gè)數(shù)組中的元素(包括這個(gè)元素值)之間的包(他的第1位必須是0)都丟失。
例如,下面的NAK中攜帶的信息:
0x00000002, 0x80000006, 0x0000000B, 0x0000000E
上面的信息表明序號(hào)為:2,6,7,8,9,10,11,14的包都丟了。
4. 效率和公平性UDT能夠充分利用當(dāng)前有線網(wǎng)絡(luò)的單獨(dú)于連接容量的可用帶寬 、RTT、后臺(tái)共存流、給定的連接比特錯(cuò)誤率。UDT在沒(méi)有數(shù)據(jù)包丟失的情況下從0bits/s到90%帶寬需要一個(gè)常量時(shí)間,這個(gè)時(shí)間是7.5秒。UDT并不適合無(wú)線網(wǎng)絡(luò)。
UDT的確滿足單瓶勁網(wǎng)絡(luò)拓?fù)涞淖畲?最小公平性。在多個(gè)瓶勁情況下,根據(jù)最大最小原則他能確保較小瓶勁連接或至少一半的平等共享(it guarantees that flows over smaller bottleneck links obtain at least half of their fair share according to max-min rule)。RTT對(duì)公平性都一點(diǎn)影響。
當(dāng)和大塊的TCP流共存的時(shí)候,TCP能占用比UDT更多的帶寬,除了三種情況:
1. 網(wǎng)絡(luò)BDP很大,TCP不能利用他們的公平共享帶寬。這種情況下,UDT將占用TCP不能利用的帶寬。
2. 連接容量是如此的小,從而導(dǎo)致UDT的帶寬估計(jì)技術(shù)不能最有的工作;模擬顯示這個(gè)極限連接容量大約是100kb/s。
3. 在使用FIFO隊(duì)列作為網(wǎng)絡(luò)路徑的網(wǎng)絡(luò)中,假如隊(duì)列大小大于BDP,TCP的共享帶寬隨著隊(duì)列大小的增加而降低。然而,抵達(dá)UDT的共享帶寬是,隊(duì)列大小通常超過(guò)實(shí)際路由器/交換機(jī)提供的數(shù)量。
當(dāng)短(timewise)類(lèi)似web的TCP流和小的并發(fā)UDT流共存的時(shí)候,UDT在TCP流上的效果很小。
更多的分析在[GHG03]。
5. 安全考慮UDT并沒(méi)有使用特定的安全機(jī)制,相反,他依賴于應(yīng)用程式提供的授權(quán)和底層提供的安全機(jī)制。
然而,由于UDP是無(wú)連接的,UDT實(shí)現(xiàn)應(yīng)該檢查任何達(dá)到的包是否是預(yù)期的來(lái)源。這是從socket的API連接概念中繼承而來(lái),其連接只是接收指定來(lái)源的數(shù)據(jù)。
6.UDT SOURCE CODE LINK
User Data Transfer, 用戶數(shù)據(jù)傳送。