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