【網路協議】UDP協議

蘭亭風雨發表於2014-06-13

    UDP是一個簡單的面向資料包的運輸層協議:程式的每個輸出操作都會產生一個UDP資料包,並組裝成一份待傳送的IP資料包,這與面向位元組流的協議不同,如TCP,應用程式產生的全體資料與真正傳送的單個IP資料包可能沒有什麼聯絡(主要是在傳輸層就進行分段了,因此不會受IP分片的影響)。

    UDP的首部一共8個位元組,很簡單,可以參考書上,這裡也不再詳說。

    UDP的校驗和

    至於UDP的校驗和,這裡注意下區別就好了,UDP對首部和資料部分都進行校驗,而IP首部的校驗和僅對IP的首部進行校驗,順帶提下TCP,TCP的校驗和也是對首部和資料部分都進行校驗,另外,UDP的校驗和是可選的,而TCP的是必選的。

    不可靠協議

    UDP是不可靠的協議,沒有超時和重傳功能,當UDP資料封裝到IP資料包傳輸時,如果丟失,會傳送一個ICMP差錯報文給源主機,另外,如果UDP資料包的傳送端沒開啟UDP校驗和,而接收端計算校驗和有差錯,那麼UDP資料包將會被丟掉,也不會傳送ICMP差錯報文。

    路徑MTU發現

    可以修改Traceroute程式來確定路徑MTU。要做的是傳送分組,並設定將IP首部設定為不分片,傳送的第一個分組的長度正好於出口MTU相等,每次收到ICMP不可分片的差錯報文時,就減小分組長度,使新的ICMP不可分片差錯報文中返回更小的MTU,每次用更小的MTU值來傳送,這樣能找到更小的MTU值。

    利用路徑MTU發現機制,應用程式可以充分利用更大的MTU來傳送報文。

    UDP最大長度

    理論上IP資料包的最大長度為65535位元組,因此理論上的UDP資料包的最大長度為65507(65535-20-8)位元組,但是,大多數實現所提供的長度比這個最大值小。一般有兩個因素的限制(書上給出了一些例子,見P120):

    1、應用程式可能胡受到其程式介面的限制,一些API的實現中可能有限定UDP資料包的最大長度。另外,現在大部分系統都預設提供了可讀寫大於8192位元組的UDP資料包。

    2、受限於TCP/IP核心的實現,可能存在一些實現特性,使IP資料包長度小於65535位元組。

    資料包截斷

    正是由於UDP最大資料包的限制(受限於上面的兩個因素,一般都會小於65507),大於這個限制的資料包會被截斷,從而發生資料丟失,且不會有任何資料丟失的通知,這也是UDP協議不可靠傳輸的另一個體現。而TCP則沒有任何資訊邊界,TCP首部中沒有對TCP最長報文段的限制,因此TCP以應用程式讀操作時所要求的長度來傳送資料(理論上一次可以傳送很大的資料,但考慮到網路的傳輸效能,最好不要一次傳輸太大的資料),當然在超過MSS值時會產生分段,因此不會發生資料截斷。

    ICMP源站抑制差錯

    當一個系統中的某主機或路由器處理資料的速度趕不上接受資料的速度時,因為接收主機的IP快取會被佔滿,可能會產生這個差錯,從而傳送一個ICMP源站抑制差錯報文,這裡要注意是“可能”。


    PS:終於要開題了,明天上午第一個上臺,希望一切順利。

    

相關文章