UDT摘记
1.UDT主要應(yīng)用于高帶寬延時積(BDP)的網(wǎng)絡(luò)中,BDP=bandwidth*RTT/8,代表鏈路中所能容納的數(shù)據(jù)量),但是TCP的窗口大小為16bit,最高有65536個byte在傳輸,所以不適合用于高速廣域網(wǎng)上進行數(shù)據(jù)傳輸。
2.UDT的可分為數(shù)據(jù)包和控制包,控制包共分為7種:ACK,NACK,keep-alive,shutdown等。
3.UDT支持多路復(fù)用技術(shù):多路復(fù)用器維持兩個隊列:發(fā)送隊列和接收隊列。發(fā)送隊列根據(jù)需要發(fā)送的包的時間對socket進行排序。發(fā)送端維持一個高精度的定時器。當(dāng)定時器時間到了之后,它會把數(shù)據(jù)包發(fā)出并將socket從隊列中移出。接收隊列和發(fā)送隊列類似,也維持了一個高精度的定時器,隊列中包含一些等待接收數(shù)據(jù)的socket,接收隊列每隔0.01s檢查隊列中的socket有沒有timeout。destination ID是0的數(shù)據(jù)包會被送往listener.
4.UDT維持了四個定時器:SND,ACK,NACK,EXP.SND是基于速率控制的,用于控制包的發(fā)送間隔。ACK TIMER是觸發(fā)ACK的定時器,ACK TIMER的時長 不得超過0.01s。NACK timer是觸發(fā)對沒有收到的包的回應(yīng),它的周期是根據(jù)ACK中的RTT以及RTT樣本方差估算出來的。EXP是超時重傳的定時器,它的 值是由RTT和RTT的樣本方差以及timeout次數(shù)算出來的。
5.UDT支持兩種模式:傳統(tǒng)的C/S模式以及rendevous模式,rendevous mode適合NAT打洞,打洞的原理就是兩端同時向?qū)Χ税l(fā)起連接。
回復(fù)。連接建立后,server回復(fù)的握手包將會被客戶端自動忽略。
7.連接關(guān)閉:主動關(guān)閉連接的一方將向另一方發(fā)送一個shutdown的控制信息包,然后本端關(guān)閉連接。如果這個包丟了,被關(guān)閉的一方將在16次EXP后 關(guān)閉連接。推薦的值是3s到30s。
8.UDT的數(shù)據(jù)包大小固定,是經(jīng)由握手時協(xié)商的。
發(fā)送端維持一個包丟失列表。列表中存放的是由客戶端NACK的丟失包的序列號,它們以遞增的序列號存放在列表中。
1.當(dāng)丟失列表不為空的時候,重傳丟失列表中的包并將其移出丟失列表。若當(dāng)前包的序列號是16的整數(shù)倍時,就處在message mode。
2.在message mode下,如果數(shù)據(jù)包的時間超過了應(yīng)用程序指定的TTL,那么它將發(fā)送一個drop message的包并將其從包丟失列表中移出。
3.等待知道有數(shù)據(jù)包需要傳送。
4.如果未被確認(rèn)的包的數(shù)量超過了流控窗口大小,將會一直等待ACK。若果沒有,則直接打包發(fā)出。
5.等待(SYN-t),SYN是SND是由擁塞控制更新的包間間隔,t是以上校驗所花費的時間。
10.接收方算法:
1.數(shù)據(jù)結(jié)構(gòu)和變量:
接收端丟失列表:其中包含檢測到丟包的序列號,最新的反饋時間,每個丟失的包在NACK中反饋的次數(shù)。
ACK歷史窗口:記錄每一個已經(jīng)發(fā)出的ACK以及ACK發(fā)出時間的環(huán)形數(shù)組,當(dāng)空間不夠時,舊的值會被新的值覆蓋。
PKT歷史窗口:記錄每一個數(shù)據(jù)包到達時間的環(huán)形數(shù)組。
包對窗口:記錄每個探測包對時間間隔的的環(huán)形數(shù)組。
LRSN:當(dāng)前已經(jīng)接收到的包的最大序列號。
ExpCount:EXP timer持續(xù)timeout的次數(shù)。
接收端算法:
1.查詢系統(tǒng)ACK,NACK,EXP是否超時。如果有超時,處理對應(yīng)的事件。
2.啟動綁定的UDP接受。
3.如果沒有未被確認(rèn)的數(shù)據(jù)包或者是有ACK或者NACK數(shù)據(jù)包到來,復(fù)位ExpCount。
4.檢查包類型,如果是控制包,則執(zhí)行1)。
5.如果數(shù)據(jù)包的序列號是16n+1,記錄下當(dāng)前包和包對窗口中最后一個包的時間間隔。
6.在PKT歷史窗口中記錄包的到達時間。
7.如果當(dāng)前包的序列號比LRSN+1還要大,那么將這兩個序列號之間的包放到接收端的丟失列表中,在NACK中返回給發(fā)送端。如果當(dāng)前包
的序列號小于LRSN,將此包從接收端的丟失列表中移出。
8.更新LRSN
ACK事件處理:
1.如果接收端丟失列表為空并且ACK序列號是LRSN+1的話,那么所有的包都被收到。否則ACK的序列號就是丟失列表中最小的序列號。
2.如果(a)ACK數(shù)等于ACK2所確認(rèn)的最大ACK數(shù),或(b)它等于最后一個ACK中的ACK數(shù),并且這兩個ACK數(shù)據(jù)包之間的時間間隔小于2 rtt,
停止(不要發(fā)送這個ACK)。
3.給當(dāng)前的ACK分配一個唯一的序列號,并加入RTT,RTT方差,窗口大小等信息。如果這個ACK包不是由ACK定時器觸發(fā)的,發(fā)出這個包并停止。
4.計算包到達速率。
5.估算鏈路容量。
6.將包到達速率和估算出的鏈路容量加入ACK包中。
7.在ACK歷史窗口中記錄ACK序列號以及ACK的發(fā)出時間。
NACK事件處理:
搜索接收端的丟失列表并找出那些K個RTT之前的包,K的初始值是2,每一次反饋之后加1,將這些序列號加入NACK中。
EXP事件處理:
1.將所有未被確認(rèn)的包加入到發(fā)送端的丟失列表中
2.如果ExpCount>16以及自上次ExpCount重置為1并過去3s之后,或者3min過去了,關(guān)掉連接。
3.如果發(fā)送端丟失列表為空,發(fā)送一個keep-alive包。
4.將ExpCount加1
收到ACK包:
1.更新最大已經(jīng)確認(rèn)的序列號。
2.向?qū)Χ嘶貜?fù)ACK2,兩者的ACK序列號是一致的。
3.更新RTT和RTT樣本方差。
4.更新ACK和NACK周期。
5.更新流控窗口。
6.如果是一個輕量級的ACK,則停止。
7.更新包到達速率以及鏈路容量評估。
8.更新發(fā)送端buffer以及丟失列表。
收到NACK包:
1.將NACK包中所有的序列號加入到丟失列表中。
2.基于速率控制更新發(fā)送定時器。
3.重置EXP定時器。
收到ACK2包:
1.根據(jù)ACK2中的ACK序列號在ACK歷史窗口中定位相應(yīng)的ACK
2.更新最大的已被確認(rèn)的ACK序列號。
3.根據(jù)ACK2計算rtt,并更新RTT.RTT = (RTT * 7 + rtt) / 8.
4.更新RTT樣本方差。
5.更新ACK和NACK周期。
收到message drop請求:
1.在接受緩沖區(qū)中標(biāo)記這個消息包中的所包含的序列號的包并將其從接受端丟失列表中移出。
11.初始流控大小的值為16.當(dāng)收到ACK后,流窗口大小更新為接受端的可以使用的buffer大小。
12.UDT本地控制算法:
UDT的本地控制算法是一個混合的阻塞控制算法,因為它調(diào)整包的發(fā)送間隔以及窗口大小。本地控制使用基于定時器的ACK,定時器的值是
SYN(0.01s).默認(rèn)的窗口大小是16個包以及包的發(fā)送間隔為0.該算法使用慢啟動,知道收到ACK或者是NACK時,退出慢啟動過程。
總結(jié)
- 上一篇: 会声会影2022试用版 智能、快速、简单
- 下一篇: 计算机80坐标转换经纬度,西安80坐标系