轉載自:UDP如何實現可靠傳輸
概述
UDP不屬於連接協議,具有資源消耗少,處理速度快的優點,所以通常音頻,視頻和普通數據在傳送時,使用UDP較多,因為即使丟失少量的包,也不會對接受結果產生較大的影響。
傳輸層無法保證數據的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。
最簡單的方式是在應用層模仿傳輸層TCP的可靠性傳輸。下面不考慮擁塞處理,可靠UDP的簡單設計。
- 1、添加seq/ack機制,確保數據發送到對端
- 2、添加發送和接收緩沖區,主要是用戶超時重傳。
- 3、添加超時重傳機制。
詳細說明:
發送端發送數據時,生成一個隨機seq=x,然后每一片按照數據大小分配seq。
數據到達接收端后接收端放入緩存,並發送一個ack=x的包,表示對方已經收到了數據。
發送端收到了ack包后,刪除緩沖區對應的數據。
時間到后,發送端定時任務檢查是否需要重傳數據。
開源程序:
目前有如下開源程序利用udp實現了可靠的數據傳輸。分別為RUDP、RTP、UDT。
1、RUDP(Reliable User Datagram Protocol)
RUDP 提供一組數據服務質量增強機制,如擁塞控制的改進、重發機制及淡化服務器算法等,從而在包丟失和網絡擁塞的情況下, RTP 客戶機(實時位置)面前呈現的就是一個高質量的 RTP 流。在不干擾協議的實時特性的同時,可靠 UDP 的擁塞控制機制允許 TCP 方式下的流控制行為。
2、RTP(Real Time Protocol)
RTP為數據提供了具有實時特征的端對端傳送服務,如在組播或單播網絡服務下的交互式視頻音頻或模擬數據。
應用程序通常在 UDP 上運行 RTP 以便使用其多路結點和校驗服務;這兩種協議都提供了傳輸層協議的功能。但是 RTP 可以與其它適合的底層網絡或傳輸協議一起使用。如果底層網絡提供組播方式,那么 RTP 可以使用該組播表傳輸數據到多個目的地。
RTP 本身並沒有提供按時發送機制或其它服務質量(QoS)保證,它依賴於底層服務去實現這一過程。 RTP 並不保證傳送或防止無序傳送,也不確定底層網絡的可靠性。 RTP 實行有序傳送, RTP 中的序列號允許接收方重組發送方的包序列,同時序列號也能用於決定適當的包位置,例如:在視頻解碼中,就不需要順序解碼。
3、UDT(UDP-based Data Transfer Protocol)
基於UDP的數據傳輸協議(UDP-basedData Transfer Protocol,簡稱UDT)是一種互聯網數據傳輸協議。UDT的主要目的是支持高速廣域網上的海量數據傳輸,而互聯網上的標准數據傳輸協議TCP在高帶寬長距離網絡上性能很差。
顧名思義,UDT建於UDP之上,並引入新的擁塞控制和數據可靠性控制機制。UDT是面向連接的雙向的應用層協議。它同時支持可靠的數據流傳輸和部分可靠的數據報傳輸。由於UDT完全在UDP上實現,它也可以應用在除了高速數據傳輸之外的其它應用領域,例如點到點技術(P2P),防火牆穿透,多媒體數據傳輸等等。