網絡協議之UDP協議
協議UDP協議 UDP是一個簡單的面向數據報的運輸層協議:進程的每個輸出操作都會產生一個UDP數據報,并組裝成一份待發送的IP數據報,這與面向字符流的協議不同,如TCP,應用程序產生的全體數據與真正發送的單個IP數據報可能沒有什么聯系(主要是在傳輸層就進行分段了,因此不會受IP分片的影響)。
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源站抑制差錯報文,這里要注意是“可能”。