一、MTU 簡(jiǎn)述 - 分包后數(shù)據(jù)包最大長(zhǎng)度
1、定義
Maximum Transmission Unit(最大可傳輸單元) 的縮寫,它的單位是字節(jié)。在 *數(shù)據(jù)鏈路層* 定義
一個(gè)數(shù)據(jù)包穿過(guò)一個(gè)大的網(wǎng)絡(luò),它其間會(huì)穿過(guò)多個(gè)網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)的 MTU 值是不同的。這個(gè)網(wǎng)絡(luò)中最小的 MTU 值,被稱為路徑 MTU。
假設(shè):我們的接受/發(fā)送端都是以太網(wǎng),它們的 MTU 都是 1500,我們發(fā)送的時(shí)候,數(shù)據(jù)包會(huì)以 1500 來(lái)封裝,然而,不幸的是,傳輸中有一段X.25網(wǎng),它的 MTU 是 576,這會(huì)發(fā)生什么呢?
結(jié)論是顯而易見的,這個(gè)數(shù)據(jù)包會(huì)被再次分片,更重要的是,這種情況下,如果 IP 包被設(shè)置了“不允許分片標(biāo)志”,那會(huì)發(fā)生些什么呢?
對(duì),數(shù)據(jù)包將被丟棄,然事收到一份ICMP不可達(dá)差錯(cuò),告訴你,需要分片!
很顯然,MTU 值設(shè)置得過(guò)大或過(guò)小,都會(huì)在一定程度上影響我們上網(wǎng)的速度。
在應(yīng)用程序中我們用到的 Data 的長(zhǎng)度最大是多少,直接取決于底層的限制,即:MTU
以太網(wǎng)(Ethernet)的 數(shù)據(jù)幀 在鏈路層 IP包 在網(wǎng)絡(luò)層 TCP或UDP包 在傳輸層 TCP或UDP中的數(shù)據(jù)(Data)在應(yīng)用層
它們的 關(guān)系是 數(shù)據(jù)幀{IP包{TCP或UDP包{Data}}}
2、網(wǎng)絡(luò)中 MTU 值的由來(lái):
1>、最大值:
對(duì)于 IP 數(shù)據(jù)包來(lái)講,在 IP 包頭中,以 兩個(gè)字節(jié)(16 位)來(lái)描述 IP 包的長(zhǎng)度,也就是說(shuō),一個(gè) IP 包,最長(zhǎng)可能是 65535字節(jié)(64K)。
那么加上以太網(wǎng)幀頭和尾,一個(gè)以太網(wǎng)幀的大小就是:65535 + 14 + 4 = 65553,看起來(lái)似乎很完美,發(fā)送方也不需要拆包,接收方也不需要重組
但,使用最大值真的可以嗎?我們往下看
2>、最佳值的推導(dǎo):
a>、按最大值來(lái)推算:
IP 數(shù)據(jù)包按最大值 65535字節(jié) 來(lái)算,假設(shè)我們現(xiàn)在的帶寬是:100Mbps,因?yàn)橐蕴W(wǎng)幀是傳輸中的最小可識(shí)別單元,再往下就是0101所對(duì)應(yīng)的光信號(hào)了,所以我們的一條帶寬同時(shí)只能發(fā)送一個(gè)以太網(wǎng)幀。
如果同時(shí)發(fā)送多個(gè),那么對(duì)端就無(wú)法重組成一個(gè)以太網(wǎng)幀了,在100Mbps的帶寬中(假設(shè)中間沒有損耗),我們計(jì)算一下發(fā)送這一幀需要的時(shí)間:
(65553*8)/(100*1024*1024)≈0.005(s)
在100M網(wǎng)絡(luò)下傳輸一幀就需要5ms,也就是說(shuō)這5ms其他進(jìn)程發(fā)送不了任何數(shù)據(jù)。如果是早先的電話撥號(hào),網(wǎng)速只有2M的情況下:
(65553*8)/(2*1024*1024)≈0.100(s)
100ms,這簡(jiǎn)直是噩夢(mèng)。其實(shí)這就像紅綠燈,時(shí)間要設(shè)置合理,交替通行,不然同一個(gè)方向如果一直是綠燈,那么另一個(gè)方向就要堵成翔了。
小知識(shí):
Mbps,其全稱為 Million bits per second,意為每秒傳輸百萬(wàn)位(比特)數(shù)量的數(shù)據(jù)
而這里的 bit(比特,1比特等于1個(gè)位)是表示數(shù)字信號(hào)數(shù)據(jù)的最小單位。
1 字節(jié) = 8 比特,所以有 65553 * 8
b>、既然大了不行,那設(shè)置小一點(diǎn)可以么?
假設(shè) MTU 值設(shè)置為100,那么單個(gè)幀傳輸?shù)臅r(shí)間,在 2Mbps 帶寬下需要:
(100*8)/(2*1024*1024)*1000≈5(ms)
時(shí)間上已經(jīng)能接受了,問(wèn)題在于,不管 MTU 設(shè)置為多少,以太網(wǎng)頭幀尾大小是固定的,都是14 + 4,所以在 MTU 為 100 的時(shí)候,一個(gè)以太網(wǎng)幀的傳輸效率為:
(100-14-4)/100=82%
寫成公式就是:( T - 14 - 4 ) / T,當(dāng)T趨于無(wú)窮大的時(shí)候,效率接近100%,也就是MTU的值越大,傳輸效率最高,但是基于上一點(diǎn)傳輸時(shí)間的問(wèn)題,來(lái)個(gè)折中的選擇吧,既然頭加尾是18,那就湊個(gè)整來(lái)個(gè)1500,總大小就是1518,傳輸效率:
1500/1518=98.8%
100Mbps傳輸時(shí)間:
(1518*8)/(100*1024*1024)*1000=0.11(ms)
2Mbps傳輸時(shí)間:
(1518*8)/(2*1024*1024)*1000=5.79(ms)
總體上時(shí)間都還能接受。
故,得出 MTU 為 1500字節(jié) 這個(gè)經(jīng)驗(yàn)值。
3>、最佳值:
在 Ethernet 中,MTU 為 1500字節(jié);
在 FDDI 中,MTU 為 4352字節(jié);
在 IP over ATM 中,MTU 為 9180字節(jié)。
其實(shí)一個(gè)標(biāo)準(zhǔn)的 以太網(wǎng) 數(shù)據(jù)幀大小是:1518,頭信息有 14 字節(jié),尾部校驗(yàn)和 FCS 占了 4 字節(jié)
4>、最小值:
最小值被限制在 64 = *46*(IP包大小) + 14 (以太網(wǎng)頭) + 4 (尾部校驗(yàn)和 FCS)
為什么是 64 呢?
這個(gè)其實(shí)和以太網(wǎng)幀在半雙工下的碰撞有關(guān),感興趣的同學(xué)可以自行去搜索。
5>、碎片與特大數(shù)據(jù)包:
在以太網(wǎng)中,數(shù)據(jù)包的大小范圍是在 64—1518 字節(jié)之間,如果除去頭部開銷,則實(shí)際的數(shù)據(jù)大小為 46—1500 字節(jié)之間。
一般情況下,數(shù)據(jù)包的大小都是在這個(gè)范圍內(nèi),如果數(shù)據(jù)包 小于64 字節(jié),稱為 碎片;
而如果 大于1518 字節(jié),稱為 特大數(shù)據(jù)包。
這兩種類型的數(shù)據(jù)包都是非正常的以太網(wǎng)數(shù)據(jù)包,它們將影響網(wǎng)絡(luò)的正常運(yùn)行。
無(wú)論是碎片或特大數(shù)據(jù)包,都會(huì)增加網(wǎng)絡(luò)的負(fù)載,導(dǎo)致網(wǎng)絡(luò)故障的發(fā)生。
所以,我們?cè)趯?duì)網(wǎng)絡(luò)進(jìn)行分析的時(shí)候,對(duì)數(shù)據(jù)包大小的判斷也是不可缺少的一個(gè)環(huán)節(jié)。
6>、發(fā)送小于最小值的包,會(huì)出現(xiàn)什么情況呢?
正常接收:
在用 UDP 局域網(wǎng)通信時(shí),經(jīng)常發(fā)生 “Hello World” 來(lái)進(jìn)行測(cè)試,
但是 “Hello World” 并不滿足最小有效數(shù)據(jù) (46) 的要求,為什么小于 46 個(gè)字節(jié),對(duì)方仍然可用收到呢?
因?yàn)樵?鏈路層 的 MAC 子層中會(huì)進(jìn)行數(shù)據(jù)補(bǔ)齊,不足 46 個(gè)字節(jié)的用 0 補(bǔ)齊。
收不到數(shù)據(jù):
但當(dāng)服務(wù)器在公網(wǎng),客戶端在內(nèi)網(wǎng),發(fā)生小于 46 個(gè)字節(jié)的數(shù)據(jù),就會(huì)出現(xiàn)接收端 收不到數(shù)據(jù)的情況。
7>、應(yīng)用層 TCP/UDP 發(fā)送的源數(shù)據(jù)大小限制
小知識(shí):
TCP 包頭中,是沒有對(duì) 數(shù)據(jù)包總大小 的定義 - 數(shù)理論上沒有大小限制。
UDP 包頭中,用 兩個(gè)字節(jié)(28=16bits) 來(lái)定義 數(shù)據(jù)包的總大小 -- 2^16 = 65535字節(jié) **即:***64k**
1、****TCP**** 是以 數(shù)據(jù)流 形式傳輸數(shù)據(jù),所以使用 send 函數(shù)理論上沒有大小限制。
一般數(shù)據(jù)包太長(zhǎng)的話會(huì)進(jìn)行多次拆包傳輸,數(shù)據(jù)包短的話會(huì)放到下一次數(shù)據(jù)傳輸時(shí)發(fā)送。
2、UDP 協(xié)議發(fā)送時(shí),用 sendto 函數(shù)最大能發(fā)送數(shù)據(jù)的長(zhǎng)度為:65535- IP頭(20) - UDP頭(8)=65507字節(jié)。
用 sendt o函數(shù)發(fā)送數(shù)據(jù)時(shí),如果發(fā)送數(shù)據(jù)長(zhǎng)度大于該值,則函數(shù)會(huì)返回錯(cuò)誤
3、UDP 協(xié)議分成若干個(gè)包發(fā)送,會(huì)發(fā)送整個(gè)數(shù)據(jù)丟失問(wèn)題
如果數(shù)據(jù)小于 65507字節(jié) ,則:按照 MTU 的值進(jìn)行分包,分成若干個(gè)包,然后發(fā)送出去;
而 接收方 IP 層就需要進(jìn)行數(shù)據(jù)報(bào)的重組。當(dāng) IP 層組包發(fā)生錯(cuò)誤,那么包就會(huì)被丟棄。
接收方無(wú)法重組數(shù)據(jù)報(bào),將導(dǎo)致丟棄整個(gè) IP 數(shù)據(jù)報(bào)。
3、OSI 七層結(jié)構(gòu):
OSI模型 | 功能 | 主要協(xié)議 | 單位 |
---|---|---|---|
應(yīng)用層 | 文件傳輸,電子郵件,文件服務(wù),虛擬終端 | Telnet、FTP,HTTP(S),SNMP,TFTP,SMTP,DNS | 數(shù)據(jù)流 |
表示層 | 數(shù)據(jù)格式化,代碼轉(zhuǎn)換,數(shù)據(jù)加密 | CSS、GIF、HTML、JSON、XML | 數(shù)據(jù)流 |
會(huì)話層 | 解除或建立與別的接點(diǎn)的聯(lián)系 | FTP、SSH、TLS、HTTP(S)、SQL | 數(shù)據(jù)流 |
傳輸層 | 提供端對(duì)端的接口 | TCP,UDP | 數(shù)據(jù)段 |
網(wǎng)絡(luò)層 | 為數(shù)據(jù)包選擇路由 | IP,ICMP,RIP,OSPF,BGP,IGMP | 數(shù)據(jù)包 |
數(shù)據(jù)鏈路層 | 傳輸有地址的幀以及錯(cuò)誤檢測(cè)功能 | MTU、SLIP,CSLIP,PPP,ARP,RARP,802.2、HDLC | 幀 |
物理層 | 以二進(jìn)制數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù) | ISO2110,IEEE802,IEEE802.2,V.35,EIA/TIA-232 | 比特流 |
img
網(wǎng)絡(luò)中的數(shù)據(jù)傳輸過(guò)程:
**在 **傳輸層**,切割成 *數(shù)據(jù)段*;
**在 **網(wǎng)絡(luò)層**,打成 IP 包 *數(shù)據(jù)包*;
**在 **數(shù)據(jù)鏈路層**,切割成 *數(shù)據(jù)幀*。
**在 **物理層**,轉(zhuǎn)變成 *比特流*。
二、計(jì)算 udp 或 tcp 包的最佳大?。?/p>
img
從上圖可知:本地 MTU 值 = 1500,那么:
UDP 包的大小: 1500 - IP頭(20) - UDP頭(8) = 1472(Bytes)
TCP 包的大小: 1500 - IP頭(20) - TCP頭(20) = 1460 (Bytes)
三、MTU 對(duì) UDP、TCP 的影響
1、MTU 對(duì) UDP 的影響:
一旦 UDP 攜帶的數(shù)據(jù) 超過(guò)1472(1500-20(IP首部)-8(UDP首部)),那么 UDP 數(shù)據(jù)就會(huì)在網(wǎng)絡(luò)層被分成多個(gè) IP 數(shù)據(jù)報(bào)
既:發(fā)送方 IP 層就需要將數(shù)據(jù)包分成若干片,而接收方 IP 層就需要進(jìn)行數(shù)據(jù)報(bào)的重組。
更嚴(yán)重的是,如果使用 UDP 協(xié)議,當(dāng) IP 層組包發(fā)生錯(cuò)誤,那么包就會(huì)被丟棄。
接收方無(wú)法重組數(shù)據(jù)報(bào),將導(dǎo)致丟棄整個(gè) IP 數(shù)據(jù)報(bào)。
UDP不保證可靠傳輸;但是 TCP發(fā)生組包錯(cuò)誤時(shí),該包會(huì)被重傳,保證可靠傳輸。
2、MTU 對(duì) TCP 的影響:
TCP 的一個(gè)數(shù)據(jù)報(bào)也不可能無(wú)限大,還是受制于 MTU,TCP 單個(gè)數(shù)據(jù)報(bào)的最大消息長(zhǎng)度,稱為 MSS
TCP 在建立連接的過(guò)程中,雙方會(huì)進(jìn)行 MSS 協(xié)商
最理想的情況下,MSS 的值正好是在 IP 不會(huì)被分片處理的最大長(zhǎng)度(這個(gè)長(zhǎng)度受限于數(shù)據(jù)鏈路層的 MTU)
雙方在發(fā)送 SYN 的時(shí)候會(huì)在 TCP 的頭部寫入字節(jié)能支持的 MSS 值
然后雙方得知對(duì)方的 MSS 值之后,選擇較小的作為最終 MSS
MMS 的值就在 TCP 首部的 40 字節(jié)變長(zhǎng)選項(xiàng)中(kind=2)
MTU 通過(guò)限制 MSS(單個(gè)數(shù)據(jù)報(bào)的最大消息長(zhǎng)度) 的取值,來(lái)限制單個(gè) TCP 包的長(zhǎng)度
3、MTU 和 MSS的關(guān)系
MTU:最大傳輸單元,由不同的數(shù)據(jù)鏈路層對(duì)應(yīng)物理層產(chǎn)生的(硬件規(guī)定),以太網(wǎng)的MTU=1500
MSS:最大分節(jié)大小,為 TCP 數(shù)據(jù)包每次傳輸?shù)淖畲髷?shù)據(jù)分段大小
MSS 的取值受限于 MTU
四、如何測(cè)出當(dāng)前網(wǎng)絡(luò)最佳MTU值
1、首先,我們必須明白什么才是最佳的 MTU 值。
1)當(dāng)本地 MTU 值 > 網(wǎng)絡(luò) MTU 值,網(wǎng)絡(luò)會(huì)進(jìn)行拆包,這樣一來(lái)數(shù)據(jù)包數(shù)量增多,二來(lái)也增加了拆包組包的時(shí)間
2)當(dāng)本地 MTU 值 < 網(wǎng)絡(luò) MTU 值,雖然可以直接傳輸,但是卻沒有完全利用網(wǎng)絡(luò)的性能,沒有發(fā)揮出最大傳輸能力
因此,設(shè)置最合適的本地 MTU 值,就是要讓本地 MTU 值 = 網(wǎng)絡(luò) MTU 值。
2、小知識(shí):
如果 MTU 過(guò)大,在碰到路由器時(shí)會(huì)被拒絕轉(zhuǎn)發(fā),因?yàn)樗荒芴幚磉^(guò)大的包。
如果太小,因?yàn)閰f(xié)議一定要在包(或幀)上加上包頭,那實(shí)際傳送的數(shù)據(jù)量就會(huì)過(guò)小,這樣也劃不來(lái)。
大部分操作系統(tǒng)會(huì)提供給用戶一個(gè)默認(rèn)值,該值一般對(duì)用戶是比較合適的。
3、怎樣才能知道自己的當(dāng)前網(wǎng)絡(luò)環(huán)境的 MTU 值是多少呢?
下面便來(lái)介紹測(cè)試方法。
步驟一:
打開命令提示符窗口輸入以下命令(建議直接復(fù)制,以免誤將小寫字母 l 寫為數(shù)字 1),回車。
這條命令的意思是向 www.baidu.com(百度主頁(yè))發(fā)送一個(gè)探測(cè)請(qǐng)求,請(qǐng)求將一個(gè)不允許分割的 1480 字節(jié)的數(shù)據(jù)包發(fā)送出去。
步驟二:
若是出現(xiàn)傳輸失敗,提示需要拆分?jǐn)?shù)據(jù)包的情況,則說(shuō)明當(dāng)前網(wǎng)絡(luò)的 MTU 值要比指定的 1480 小,因此我們就適當(dāng)調(diào)小數(shù)據(jù)包的大小,再發(fā)送一條類似的命令
若是出現(xiàn)傳輸成功,則說(shuō)明當(dāng)前網(wǎng)絡(luò)的 MTU 值比 輸入的 要大。于是我們需要稍微調(diào)大數(shù)值,以便求得最為精確的網(wǎng)絡(luò) MTU 值
步驟三:
如此這般,通過(guò)不斷修正數(shù)據(jù)包的大小,我們可以最終得到當(dāng)前網(wǎng)絡(luò)的 MTU 值。
img
4、ping 命令使用的是 ICMP 協(xié)議
ping 命令使用的,既不是 tcp 報(bào)文,也不是 udp 報(bào)文
它用的是 ICMP 協(xié)議,與 IP 協(xié)議同級(jí),屬于 網(wǎng)絡(luò)層,位于 tcp、udp(傳輸層)的下一層?!緫?yīng)用層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層、物理層】
5、計(jì)算結(jié)果分析
最后測(cè)試得出:最大數(shù)據(jù)傳輸為 1472 字節(jié)的數(shù)據(jù)包,則:
MTU = 1472 + 20字節(jié) IP 首部 + 8字節(jié) ICMP 首部 = 1500 字節(jié)
審核編輯:湯梓紅
-
TCP
+關(guān)注
關(guān)注
8文章
1371瀏覽量
79137 -
UDP
+關(guān)注
關(guān)注
0文章
326瀏覽量
33989
原文標(biāo)題:UDP/TCP 包的大小限制是多少?
文章出處:【微信號(hào):技術(shù)讓夢(mèng)想更偉大,微信公眾號(hào):技術(shù)讓夢(mèng)想更偉大】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論