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