基於UDP協議的伺服器/客戶端
基於UDP協議的客戶端/伺服器是不可靠的,無連線的,所以相比於TCP來說,伺服器端就不需要listen和accept操作,而客戶端也就不需要connect操作。
先來認識一下UDP socket裡的兩個函式:
sockfd就是建立的套接字,buf就是用來存資料的緩衝區,len就是傳送和接收資料的長度,flags引數一般設定為0表示阻塞式等待,src_addr表示從哪裡接收資料報,addrlen表示資料報的大小,dest_addr表示資料報要發往哪裡,addrlen表示資料報的大小。
程式碼如下:
server.c
client.c:
執行結果如下顯示:
如上就實現了基於UDP的伺服器和客戶端間的通訊。
UDP如何實現它的可靠性傳輸?
UDP它不屬於連線型協議,因而具有資源消耗小,處理速度快的優點,所以通常音訊、視訊和普通資料在傳送時使用UDP較多,因為它們即使偶爾丟失一兩個資料包,也不會對接收結果產生太大影響。
傳輸層無法保證資料的可靠傳輸,只能通過應用層來實現了。實現的方式可以參照tcp可靠性傳輸的方式,只是實現不在傳輸層,實現轉移到了應用層。
實現確認機制、重傳機制、視窗確認機制。
如果不利用Linux協議棧以及上層socket機制,自己通過抓包和發包的方式去實現可靠性傳輸,那麼必須實現如下功能:
傳送:包的分片、包確認、包的重發
接收:包的調序、包的序號確認
目前有如下開源程式利用udp實現了可靠的資料傳輸。分別為RUDP、RTP、UDT。
RUDP:RUDP 提供一組資料服務質量增強機制,如擁塞控制的改進、重發機制及淡化伺服器演算法等,從而在包丟失 和網路擁塞的情況下, RTP 客戶機(實時位置)面前呈現的就是一個高質量的 RTP 流。在不干擾協議的實時 特性的同時,可靠 UDP 的擁塞控制機制允許 TCP 方式下的流控制行為。
RTP:實時傳輸協議(RTP)為資料提供了具有實時特徵的端對端傳送服務,如在組播或單播網路服務下的互動式視 頻音訊或模擬資料。應用程式通常在 UDP 上執行 RTP 以便使用其多路結點和校驗服務;這兩種協議都提供了 傳輸層協議的功能。但是 RTP 可以與其它適合的底層網路或傳輸協議一起使用。如果底層網路提供組播方 式,那麼 RTP 可以使用該組播表傳輸資料到多個目的地。
RTP 本身並沒有提供按時傳送機制或其它服務質量(QoS)保證,它依賴於底層服務去實現這一過程。 RTP 並 不保證傳送或防止無序傳送,也不確定底層網路的可靠性。 RTP 實行有序傳送, RTP 中的序列號允許接收方 重組傳送方的包序列,同時序列號也能用於決定適當的包位置,例如:在視訊解碼中,就不需要順序解碼。
UDT:基於UDP的資料傳輸協議(UDP-basedData Transfer Protocol,簡稱UDT)是一種網際網路資料傳輸協議。 UDT的主要目的是支援高速廣域網上的海量資料傳輸,而網際網路上的標準資料傳輸協議TCP在高頻寬長距離網 絡上效能很差。顧名思義,UDT建於UDP之上,並引入新的擁塞控制和資料可靠性控制機制。UDT是面向連線 的雙向的應用層協議。它同時支援可靠的資料流傳輸和部分可靠的資料報傳輸。由於UDT完全在UDP上實現, 它也可以應用在除了高速資料傳輸之外的其它應用領域,例如點到點技術(P2P),防火牆穿透,多媒體資料 傳輸等等。