網(wǎng)絡協(xié)議之UDP協(xié)議
協(xié)議UDP協(xié)議 UDP是一個簡單的面向數(shù)據(jù)報的運輸層協(xié)議:進程的每個輸出操作都會產(chǎn)生一個UDP數(shù)據(jù)報,并組裝成一份待發(fā)送的IP數(shù)據(jù)報,這與面向字符流的協(xié)議不同,如TCP,應用程序產(chǎn)生的全體數(shù)據(jù)與真正發(fā)送的單個IP數(shù)據(jù)報可能沒有什么聯(lián)系(主要是在傳輸層就進行分段了,因此不會受IP分片的影響)。
UDP的校驗和
至于UDP的校驗和,這里注意下區(qū)別就好了,UDP對首部和數(shù)據(jù)部分都進行校驗,而IP首部的校驗和僅對IP的首部進行校驗,順帶提下TCP,TCP的校驗和也是對首部和數(shù)據(jù)部分都進行校驗,另外,UDP的校驗和是可選的,而TCP的是必選的。
不可靠協(xié)議
UDP是不可靠的協(xié)議,沒有超時和重傳功能,當UDP數(shù)據(jù)封裝到IP數(shù)據(jù)報傳輸時,如果丟失,會發(fā)送一個ICMP差錯報文給源主機,另外,如果UDP數(shù)據(jù)報的發(fā)送端沒打開UDP校驗和,而接收端計算校驗和有差錯,那么UDP數(shù)據(jù)報將會被丟掉,也不會發(fā)送ICMP差錯報文。
路徑MTU發(fā)現(xiàn)
可以修改Traceroute程序來確定路徑MTU。要做的是發(fā)送分組,并設置將IP首部設置為不分片,發(fā)送的***個分組的長度正好于出口MTU相等,每次收到ICMP不可分片的差錯報文時,就減小分組長度,使新的ICMP不可分片差錯報文中返回更小的MTU,每次用更小的MTU值來傳送,這樣能找到更小的MTU值。
利用路徑MTU發(fā)現(xiàn)機制,應用程序可以充分利用更大的MTU來發(fā)送報文。
UDP***長度
理論上IP數(shù)據(jù)報的***長度為65535字節(jié),因此理論上的UDP數(shù)據(jù)報的***長度為65507(65535-20-8)字節(jié),但是,大多數(shù)實現(xiàn)所提供的長度比這個***值小。一般有兩個因素的限制(書上給出了一些例子,見P120):
1、應用程序可能胡受到其程序接口的限制,一些API的實現(xiàn)中可能有限定UDP數(shù)據(jù)報的***長度。另外,現(xiàn)在大部分系統(tǒng)都默認提供了可讀寫大于8192字節(jié)的UDP數(shù)據(jù)報。
2、受限于TCP/IP內(nèi)核的實現(xiàn),可能存在一些實現(xiàn)特性,使IP數(shù)據(jù)報長度小于65535字節(jié)。
數(shù)據(jù)報截斷
正是由于UDP***數(shù)據(jù)報的限制(受限于上面的兩個因素,一般都會小于65507),大于這個限制的數(shù)據(jù)報會被截斷,從而發(fā)生數(shù)據(jù)丟失,且不會有任何數(shù)據(jù)丟失的通知,這也是UDP協(xié)議不可靠傳輸?shù)牧硪粋€體現(xiàn)。而TCP則沒有任何信息邊界,TCP首部中沒有對TCP最長報文段的限制,因此TCP以應用程序讀操作時所要求的長度來傳送數(shù)據(jù)(理論上一次可以發(fā)送很大的數(shù)據(jù),但考慮到網(wǎng)絡的傳輸性能,***不要一次傳輸太大的數(shù)據(jù)),當然在超過MSS值時會產(chǎn)生分段,因此不會發(fā)生數(shù)據(jù)截斷。
ICMP源站抑制差錯
當一個系統(tǒng)中的某主機或路由器處理數(shù)據(jù)的速度趕不上接受數(shù)據(jù)的速度時,因為接收主機的IP緩存會被占滿,可能會產(chǎn)生這個差錯,從而發(fā)送一個ICMP源站抑制差錯報文,這里要注意是“可能”。