1. 程式人生 > >如何udp實現可靠性傳輸

如何udp實現可靠性傳輸

1.udp與tcp的區別

TCP(TransmissionControl Protocol 傳輸控制協議)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

UDP是User Datagram Protocol,一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務。可靠性由上層應用實現,所以要實現udp可靠性傳輸,必須通過應用層來實現和控制。

2.TCP如何實現可靠性傳輸?

         確認機制、重傳機制、滑動視窗。

2.1 可靠性

1.應用資料被分割成TCP認為最適合傳送的資料塊。這和UDP完全不同,應用程式產生的資料長度將保持不變。由TCP傳遞給IP的資訊單位稱為報文段或段(segment)。

2.當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。當TCP收到發自TCP連線另一端的資料,它將傳送一個確認。TCP有延遲確認的功能,在此功能沒有開啟,則是立即確認。功能開啟,則由定時器觸發確認時間點。

3.TCP將保持它首部和資料的檢驗和。這是一個端到端的檢驗和,目的是檢測資料在傳輸過程中的任何變化。如果收到段的檢驗和有差錯,TCP將丟棄這個報文段和不確認收到此報文段(希望發端超時並重發)。

4.既然TCP報文段作為IP資料報來傳輸,而IP資料報的到達可能會失序,因此TCP報文段的到達也可能會失序。如果必要,TCP將對收到的資料進行重新排序,將收到的資料以正確的順序交給應用層。

5.既然IP資料報會發生重複,TCP的接收端必須丟棄重複的資料。[2]

6.TCP還能提供流量控制。TCP連線的每一方都有固定大小的緩衝空間。TCP的接收端只允許另一端傳送接收端緩衝區所能接納的資料。這將防止較快主機致使較慢主機的緩衝區溢位。

2.2 重傳策略

TCP協議用於控制資料段是否需要重傳的依據是設立重發定時器。在傳送一個數據段的同時啟動一個重傳,如果在重傳超時前收到確認(Acknowlegement)就關閉該重傳,如果重傳超時前沒有收到確認,則重傳該資料段。在選擇重發時間的過程中,TCP必須具有自適應性。它需要根據網際網路當時的通訊情況,給出合適的重發時間。

這種重傳策略的關鍵是對定時器初值的設定。採用較多的

演算法是Jacobson於1988年提出的一種不斷調整超時時間間隔的動態演算法。其工作原理是:對每條連線TCP都保持一個變數RTT(Round Trip Time),用於存放當前到目的端往返所需要時間最接近的估計值。當傳送一個數據段時,同時啟動連線的定時器,如果在定時器超時前確認到達,則記錄所需要的時間(M),並修正[2]  RTT的值,如果定時器超時前沒有收到確認,則將RTT的值增加1倍。通過測量一系列的RTT(往返時間)值,TCP協議可以估算資料包重發前需要等待的時間。在估計該連線所需的當前延遲時通常利用一些統計學的原理和演算法(如Karn演算法),從而得到TCP重發之前需要等待的時間值。

2.3視窗確認

TCP的一項功能就是確保每個資料段都能到達目的地。位於目的主機的TCP服務對接受到的資料進行確認,並向源應用程式傳送確認資訊。使用資料報頭序列號以及確認號來確認已收到包含在資料段的相關的資料位元組。

TCP在發回源裝置的資料段中使用確認號,指示接收裝置期待接收的下一位元組。這個過程稱為期待確認。

源主機在收到確認訊息之前可以傳輸的資料的大小稱為視窗大小。用於管理丟失資料和流量控制。

3.udp如何實現可靠性傳輸?

         UDP它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。

         傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。

         實現確認機制、重傳機制、視窗確認機制。

         如果你不利用Linux協議棧以及上層socket機制,自己通過抓包和發包的方式去實現可靠性傳輸,那麼必須實現如下功能:

         傳送:包的分片、包確認、包的重發

         接收:包的調序、包的序號確認

         目前有如下開源程式利用udp實現了可靠的資料傳輸。分別為RUDP、RTP、UDT。

3.1 RUDP

RUDP 提供一組資料服務質量增強機制,如擁塞控制的改進、重發機制及淡化伺服器演算法等,從而在包丟失和網路擁塞的情況下, RTP 客戶機(實時位置)面前呈現的就是一個高質量的 RTP 流。在不干擾協議的實時特性的同時,可靠 UDP 的擁塞控制機制允許 TCP 方式下的流控制行為。

3.2 RTP

         實時傳輸協議(RTP)為資料提供了具有實時特徵的端對端傳送服務,如在組播或單播網路服務下的互動式視訊音訊或模擬資料。應用程式通常在 UDP 上執行 RTP 以便使用其多路結點和校驗服務;這兩種協議都提供了傳輸層協議的功能。但是 RTP 可以與其它適合的底層網路或傳輸協議一起使用。如果底層網路提供組播方式,那麼 RTP 可以使用該組播表傳輸資料到多個目的地。

RTP 本身並沒有提供按時傳送機制或其它服務質量(QoS)保證,它依賴於底層服務去實現這一過程。 RTP 並不保證傳送或防止無序傳送,也不確定底層網路的可靠性。 RTP 實行有序傳送, RTP 中的序列號允許接收方重組傳送方的包序列,同時序列號也能用於決定適當的包位置,例如:在視訊解碼中,就不需要順序解碼。

3.3 UDT

         基於UDP的資料傳輸協議(UDP-basedData Transfer Protocol,簡稱UDT)是一種網際網路資料傳輸協議。UDT的主要目的是支援高速廣域網上的海量資料傳輸,而網際網路上的標準資料傳輸協議TCP在高頻寬長距離網路上效能很差。顧名思義,UDT建於UDP之上,並引入新的擁塞控制和資料可靠性控制機制。UDT是面向連線的雙向的應用層協議。它同時支援可靠的資料流傳輸和部分可靠的資料報傳輸。由於UDT完全在UDP上實現,它也可以應用在除了高速資料傳輸之外的其它應用領域,例如點到點技術(P2P),防火牆穿透,多媒體資料傳輸等等。

         因專案中的需要,現在詳細分析一下UDT是如何通過udp實現資料的可靠傳輸。通過閱讀原始碼的方式。