udp數(shù)據(jù)包的理論長度是多少,合適的udp數(shù)據(jù)包應該是多少呢?從TCP-IP詳解卷一第11章的udp數(shù)據(jù)包的包頭可以看出,udp的最大包長度是2^16-1的個字節(jié)。由于udp包頭占8個字節(jié),而在ip層進行封裝后的ip包頭占去20字節(jié),所以這個是udp數(shù)據(jù)包的最大理論長度是 2^16-1-8-20=65507。
然而這個只是udp數(shù)據(jù)包的最大理論長度。首先,我們知道,TCP/IP通常被認為是一個四層協(xié)議系統(tǒng),包括鏈路層、網(wǎng)絡層、運輸層、應用層。 UDP屬于運輸層,在傳輸過程中,udp包的整體是作為下層協(xié)議的數(shù)據(jù)字段進行傳輸?shù),它的長度大小受到下層ip層和數(shù)據(jù)鏈路層協(xié)議的制約。
以太網(wǎng)(Ethernet)數(shù)據(jù)幀的長度必須在46-1500字節(jié)之間,這是由以太網(wǎng)的物理特性決定的。這個1500字節(jié)被稱為鏈路層的MTU(最大傳輸單元)。因特網(wǎng)協(xié)議允許IP分片,這樣就可以將數(shù)據(jù)包分成足夠小的片段以通過那些最大傳輸單元小于該數(shù)據(jù)包原始大小的鏈路了。這一分片過程發(fā)生在網(wǎng)絡層,它使用的是將分組發(fā)送到鏈路上的網(wǎng)絡接口的最大傳輸單元的值。這個最大傳輸單元的值就是MTU(Maximum Transmission Unit)。它是指一種通信協(xié)議的某一層上面所能通過的最大數(shù)據(jù)包大。ㄒ宰止(jié)為單位)。最大傳輸單元這個參數(shù)通常與通信接口有關(guān)(網(wǎng)絡接口卡、串口等)。
在因特網(wǎng)協(xié)議中,一條因特網(wǎng)傳輸路徑的“路徑最大傳輸單元”被定義為從源地址到目的地址所經(jīng)過“路徑”上的所有IP跳的最大傳輸單元的最小值。
需要注意的是,loopback的MTU不受上述限制,查看loopback MTU值:
[root@bogon ~]# cat /sys/class/net/lo/mtu
65536
如上所述,由于網(wǎng)絡接口卡的制約,mtu的長度被限制在1500字節(jié),這個長度指的是鏈路層的數(shù)據(jù)區(qū)。對于大于這個數(shù)值的分組可能被分片,否則無法發(fā)送,而分組交換的網(wǎng)絡是不可靠的,存在著丟包。IP 協(xié)議的發(fā)送方不做重傳。接收方只有在收到全部的分片后才能 reassemble并送至上層協(xié)議處理代碼,否則在應用程序看來這些分組已經(jīng)被丟棄。
假定同一時刻網(wǎng)絡丟包的概率是均等的,那么較大的IP datagram必然有更大的概率被丟棄,因為只要丟失了一個fragment,就導致整個IP datagram接收不到。不超過MTU的分組是不存在分片問題的。
MTU的值并不包括鏈路層的首部和尾部的18個字節(jié)。所以,這個1500字節(jié)就是網(wǎng)絡層IP數(shù)據(jù)報的長度限制。因為IP數(shù)據(jù)報的首部為20字節(jié),所以IP數(shù)據(jù)報的數(shù)據(jù)區(qū)長度最大為1480字節(jié)。而這個1480字節(jié)就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數(shù)據(jù)報的。又因為UDP數(shù)據(jù)報的首部8字節(jié),所以UDP數(shù)據(jù)報的數(shù)據(jù)區(qū)最大長度為1472字節(jié)。這個1472字節(jié)就是我們可以使用的字節(jié)數(shù)。
當我們發(fā)送的UDP數(shù)據(jù)大于1472的時候會怎樣呢?這也就是說IP數(shù)據(jù)報大于1500字節(jié),大于MTU。這個時候發(fā)送方IP層就需要分片 (fragmentation)。把數(shù)據(jù)報分成若干片,使每一片都小于MTU。而接收方IP層則需要進行數(shù)據(jù)報的重組。而更嚴重的是,由于UDP的特性,當某一片數(shù)據(jù)傳送中丟失時,接收方便無法重組數(shù)據(jù)報。將導致丟棄整個UDP數(shù)據(jù)報。因此,在普通的局域網(wǎng)環(huán)境下,將UDP的數(shù)據(jù)控制在1472字節(jié)以下為好。
進行Internet編程時則不同,因為Internet上的路由器可能會將MTU設為不同的值。如果我們假定MTU為1500來發(fā)送數(shù)據(jù)的,而途經(jīng)的某個網(wǎng)絡的MTU值小于1500字節(jié),那么系統(tǒng)將會使用一系列的機制來調(diào)整MTU值,使數(shù)據(jù)報能夠順利到達目的地。鑒于Internet上的標準 MTU值為576字節(jié),所以在進行Internet的UDP編程時,最好將UDP的數(shù)據(jù)長度控件在548字節(jié)(576-8-20)以內(nèi)。
udp丟包是指網(wǎng)卡接收到數(shù)據(jù)包后,linux內(nèi)核的tcp/ip協(xié)議棧在udp數(shù)據(jù)包處理過程中的丟包,主要原因有兩個:
1、udp數(shù)據(jù)包格式錯誤或校驗和檢查失敗。
2、應用程序來不及處理udp數(shù)據(jù)包。
對于原因1,udp數(shù)據(jù)包本身的錯誤很少見,應用程序也不可控,本文不討論。
首先介紹通用的udp丟包檢測方法,使用netstat命令,加-su參數(shù)。
# netstat -su
Udp:
2495354 packets received
2100876 packets to unknown port received.
3596307 packet receive errors
14412863 packets sent
RcvbufErrors: 3596307
SndbufErrors: 0
從上面的輸出中,可以看到有一行輸出包含了"packet receive errors",如果每隔一段時間執(zhí)行netstat -su,發(fā)現(xiàn)行首的數(shù)字不斷變大,表明發(fā)生了udp丟包。
2015職稱計算機考試書PowerPoint2007中 .. 定價:¥45 優(yōu)惠價:¥42 更多書籍 | |
2015年全國職稱計算機考試教材(2007模 .. 定價:¥225 優(yōu)惠價:¥213 更多書籍 |