华南俳烁实业有限公司

考試首頁 | 考試用書 | 培訓課程 | 模擬考場 | 考試論壇  
  當前位置:Linux認證 > 綜合輔導 > 文章內(nèi)容
  

Linux教程:淺談UDP(數(shù)據(jù)包長度,收包能力,丟包及進程結(jié)構(gòu)選擇)

來源:Linux社區(qū)  [ 2016年3月1日 ] 【

UDP數(shù)據(jù)包長度

UDP數(shù)據(jù)包的理論長度

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é)議的制約。

MTU相關(guān)概念

以太網(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跳的最大傳輸單元的最小值。

需要注意的是,loopbackMTU不受上述限制,查看loopback MTU值:

[root@bogon ~]# cat /sys/class/net/lo/mtu 

65536

IP分包udp數(shù)據(jù)包長度的影響

如上所述,由于網(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丟包

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丟包。

首頁 1 2 3 4 尾頁
本文糾錯】【告訴好友】【打印此文】【返回頂部
將考試網(wǎng)添加到收藏夾 | 每次上網(wǎng)自動訪問考試網(wǎng) | 復制本頁地址,傳給QQ/MSN上的好友 | 申請鏈接 | 意見留言 TOP
關(guān)于本站  網(wǎng)站聲明  廣告服務  聯(lián)系方式  站內(nèi)導航  考試論壇
Copyright © 2007-2013 中華考試網(wǎng)(Examw.com) All Rights Reserved
弥勒县| 莎车县| 伊川县| 宣汉县| 库车县| 射洪县| 瑞安市| 淮阳县| 周口市| 仁布县| 临武县| 三门县| 道孚县| 舞钢市| 新巴尔虎右旗| 华安县| 武威市| 定远县| 韶关市| 梅河口市| 沙坪坝区| 湄潭县| 商洛市| 怀来县| 肇东市| 石城县| 黄浦区| 鄯善县| 科技| 保山市| 吐鲁番市| 信丰县| 临漳县| 仲巴县| 平昌县| 左贡县| 海丰县| 巨鹿县| 香河县| 海盐县| 保康县|