UDT協議深入解析

將近兩年以前因爲想選擇一個兼顧TCP協議的可靠性和UDP協議的高效性來進行我們某種數據的傳輸曾經選擇過UDT協議,也進行了一段時間的學習、實踐。但最終由於不適合我們的業務場景放棄了它,但它的實現原理、代碼實現、拓展使用的優秀給我留下了很深刻的印象,今天翻出自己曾經的一篇總結筆記來和大家一起回顧下UDT協議。

  • UDT協議是什麼?是一種基於UDP的數據傳輸協議(UDP-based Data Transfer Protocol,簡稱UDT)。

  • UDT協議的主要作用是什麼?UDT的主要目的是支持高速廣域網上的海量數據傳輸,而互聯網上的標準數據傳輸協議TCP在高帶寬長距離網絡上性能很差。

  • 那麼UDT與UDP的區別又是什麼?UDT建於UDP之上,並引入新的擁塞控制和數據可靠性控制機制。UDT是面向連接的雙向的應用層協議。它同時支持可靠的數據流傳輸和部分可靠的數據報傳輸。

  • UDT的使用場景是什麼?由於UDT完全在UDP上實現,它也可以應用在除了高速數據傳輸之外的其它應用領域,例如點到點技術(P2P),防火牆穿透,多媒體數據傳輸等等。

(以上問題的答案均摘自wikipedia)當然我今天也不是來當知識搬運工的,而是結合以上UDT協議的基本定義來深入到UDT協議內部去解析它。


UDT協議的主要特性有哪些?
  • 基於UDP的應用層協議: 有基本網絡知識的朋友都知道TCP和UDP的區別和使用場景,但是有沒有一種協議能同時兼顧TCP協議的安全可靠和UDP協議的高效,那麼UDT就是一種。

  • 面向連接的協議:面向連接意味着兩個使用協議的應用在彼此交換數據之前必須先建立一個連接,當然UDT是邏輯上存在的連接通道。這種連接的維護是基於握手、Keep-alive(保活)以及關閉連接。

  • 可靠的協議:依靠包序號機制、接收者的ACK響應和丟包報告、ACK序號機制、重傳機制(基於丟包報告和超時處理)來實現數據傳輸的可靠性。

  • 雙工的協議:每個UDT實例包含發送端和接收端的信息。

  • 單播的數據流。

  • 新的擁塞算法,並且具有可擴展的擁塞控制框架:新的擁塞控制算法不同於基於窗口的TCP擁塞控制算法(慢啓動和擁塞避免),是混合的基於窗口的、基於速率的擁塞控制算法。可擴展的擁塞控制框架開源的代碼和擁塞控制的C++類架構,可支持開發者派生專用的擁塞控制算法。

  • 帶寬估計:UDT使用對包(PP -- Packet pair)的機制來估計帶寬值。即每16個包爲一組,最後一個是對包,即發送方不用等到下一個發送週期內再發送。接收方接收到對包後對其到達時間進行記錄,可結合上次記錄的值計算出鏈路的帶寬(計算的方法稱爲中值過濾法), 並在下次ACK中進行反饋。

UDT一些主要特性的實現

UDT包確認機制是基於時間的定時器實現的。原理:

uses timer-based selective acknowledgement, which generates an acknowledgement at a fixed interval. This means that the faster the transfer speed, the smaller the ratio of bandwidth consumed by control traffic. Meanwhile, at very low bandwidth, UDT acts like protocols using cumulative acknowledgement.

The ACK interval of UDT is the same as the rate control interval (SYN).

To support this scheme, nega tive acknowledgement (NAK) is used to explicitly feed back packet loss. NAK is generated once a loss is detected so that the sender can react to congestion as quickly as possible. The loss information (sequence numbers of lost packets) will be resent after an increasing interval if there are timeouts indicating that the retr ansmission or NAK itself has been lost.

UDT流量控制是基於以下三個機制實現的。

  • new congestion control

  • DAIMD rate control

  • dynamic window control

詳細說明在這:http://www.jenkinssoftware.com/raknet/manual/congestioncontrol.html

UDT支持哪些數據傳輸類型
  • 基於流的send, recv。

  • 基於數據報sendmsg,recvmsg。

  • 文件傳輸sendfile,recvfile。

下面我們結合UDT version 4版本來給大家分析下這個版本的UDT所擁有的一些新的特性。
  • 使用了UDP multiplexer(UDP多路複用)機制,這樣做的好處是:

therefore it is possible (and by default) all UDT sockets in one process will share one UDP port. This scheme makes it easier for firewall traversing.

  • UDT流控採用可配置的擁塞控制算法,你可以關閉它、配置它,改良它來實現自己需要的流控策略。

  • 採用新的資源管理(內存管理)和共享的擁塞控制方法來支持更多併發的UDT連接。有關內存管理的介紹如下:

    • UDT4 has a new buffer management module that enables all UDT sockets in one process can share protocol buffer. The goodness it brings is the much less memory usage for multiple UDT connections compared to previous versions.

    • UDT4 can automatically resize its buffer in order to reduce memory usage while providing maximum throughput.

    • Because of the new memory management scheme, overlapped IO has been removed from UDT4. If your existing code uses overlapped IO, you need to modify it to use regular IO. This is the only change needed for exiting code to move from UDT3 to UDT4.

  • 其他的特點:

    • 不和原生socket api衝突;

    • 線程安全;

    • 進程間不共享句柄;

    • 錯誤處理;

    • 防火牆穿透;

    • 安全性好;

    • 建立連接快速;

以上就是我依據自己的記憶以及筆記對UDT協議進行的分析總結,筆記在此UDT協議研究.mmap 歡迎大家下載。非常感謝谷雲洪博士爲我們提供了這麼一個優秀的協議。


本文出自 “永遠的朋友” 博客,請務必保留此出處http://yaocoder.blog.51cto.com/2668309/1530969


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章