UDP協議程序設計中的幾個問題

 

一、UDP報文丟失數據

      利用UDP協議進行數據收發的時候,在局域網內一般情況下數據的接收均能接收到發送方的數據,除非連接雙方的主機發生故障,否則不會發生接收不到數據的情況。 

1.UDP報文的正常發送過程

      Internet上,由於要經過多個路由器,正常情況下一個數據報文從主機C經過路由器A、路由器B、路由器C到達主機S 

2.UPD報文的丟失

      路由器要對轉發的數據進行存儲、處理、合法性判定、轉發等操作,容易出現錯誤,所以很可能在路由器轉發的過程中出現數據丟失的現象。對於數據丟失的原因,並不能通過一種簡單的方法獲得,例如,不能區分服務器發給客戶端的響應數據是在發送的路徑中被路由器丟棄,還是服務器沒有發送此響應數據。 

3.UDP報文丟失的對策

      UDP協議中的數據報文丟失是先天性的,因爲UDP是無連接的、不能保證發送數據的正確到達。對策:主機C發送的數據經過路由器,到達主機S後,主機S要發送一個接收到此數據報文的響應,主機C要對主機S的響應進行記錄,直到之前發送的數據報文1已經被主機S接收到。如果數據報文在經過路由的時候,被路由器丟棄,則主機C和主機S會對超時的數據進行重發。 

 二、UDP數據發送中的亂序

      UDP協議數據收發過程中,會出現數據的亂序現象。所謂亂髮送數據的順序和接收數據的順序不一致。 

1UDP數據順序收發的過程

      主機C向主機S發送數據包0、數據包1、數據包2、數據包3,各個數據包途中經過路由器A、路由器B、路由器C,先後到達主機S,在主機S端的循序仍然爲數據包0、數據包1、數據包2、數據包3,即發送數據時的順序和接收數據時的順序是一致的。 

2UDP數據的亂序

      UDP的數據包在網絡上傳輸的時候,有可能造成數據的順序更改,接收方的數據順序和發送方的數據順序發生了顛倒。這主要是由於路由的不同和路由的存儲轉發的順序不同造成的。

      1)路由器的存儲轉發有可能造成數據順序的更改。例如,主機C發送的數據在經過路由器A和路由器C的時候,順序均沒有發生順序更改。而在經過主機B的時候,數據的順序由數據0123變成0321,這樣主機C的數據0123順序經過路由器到達主機S的時候變爲了數據0321

      2UDP協議的數據經過路由器時的路徑造成了發送數據的混亂。從主機C發送的數據0123,其中數據03經過路由器B、路由器C到達S,數據1和數據2經過路由器A、路由器C到達主機S,所以數據由發送時的順序0123變成順序1032 

3UDP亂序的對策

      對於亂序的解決方法可以採用發送端在數據段中加入數據報序號的方法,這樣接收端對接收到數據的頭端進行簡單地處理就可以重新獲得原始順序的數據。 

4UDP協議中的connect()函數

UDP協議中使用connect()函數的作用僅僅表示確定了另一方的地址,並沒有其他的含議。

connect()函數在UDP協議中使用後會產生如下的副作用:

l  使用connect()函數綁定套接字後,發送操作不能再使用sendto()函數,要使用write()函數直接操作套接字文件描述符,不再指定目地址和端口號。

l  使用connect()函數綁定套接字後,接收操作不能再使用recvfrom()函數函數,要使用read()類的函數,函數不會返回發送方的地址和端口號。

l  在使用多次connect()函數的時候,會改變原來套接字綁定的目的地址和端口號,用新綁定的地址和端口號代替,原有的綁定狀態會失效。可以使用這種特定來斷開原來的連接。

5UDP缺乏流量控制

1 UDP缺乏流量控制的概念

       UDP協議沒有TCP協議所具有的滑動窗口概念,接收數據的時候直接將數據放到緩衝區中。如果用戶不有及時地從緩衝區中將數據複製出來,後面到來的數據會接着向緩衝區中放入。當緩衝區滿的時候,後面到來的數據會覆蓋之前的數據造成數據的丟失。

2 緩衝區溢出對策

       解決UDP接收緩衝區溢出的現象需要根據實際情況確定,一般可以用增大接收數據緩衝區和接收方接收單獨處理的方法來解決局部的UDP數據接收緩衝區溢出問題。

6UDP協議中的數據報文截斷

       當使用UDP協議接收數據的時候,如果應用程序傳入的接收緩衝區的大小小於到來的數據大小時,接收緩衝區會保存最大可能接收到的數據,其他的數據將會丟失,並且有MSG_TRUNC的標誌。

發佈了35 篇原創文章 · 獲贊 14 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章