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