0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

UDP/TCP中最大可傳輸單元MTU解析

嵌入式情報局 ? 來源:CSDN-LearnLHC ? 2023-08-24 10:56 ? 次閱讀

一、MTU 簡述 - 分包后數(shù)據(jù)包最大長度

1、定義

Maximum Transmission Unit(最大可傳輸單元) 的縮寫,它的單位是字節(jié)。在 *數(shù)據(jù)鏈路層* 定義

一個數(shù)據(jù)包穿過一個大的網(wǎng)絡,它其間會穿過多個網(wǎng)絡,每個網(wǎng)絡的 MTU 值是不同的。這個網(wǎng)絡中最小的 MTU 值,被稱為路徑 MTU。

假設:我們的接受/發(fā)送端都是以太網(wǎng),它們的 MTU 都是 1500,我們發(fā)送的時候,數(shù)據(jù)包會以 1500 來封裝,然而,不幸的是,傳輸中有一段X.25網(wǎng),它的 MTU 是 576,這會發(fā)生什么呢?

結(jié)論是顯而易見的,這個數(shù)據(jù)包會被再次分片,更重要的是,這種情況下,如果 IP 包被設置了“不允許分片標志”,那會發(fā)生些什么呢?

對,數(shù)據(jù)包將被丟棄,然事收到一份ICMP不可達差錯,告訴你,需要分片!

很顯然,MTU 值設置得過大或過小,都會在一定程度上影響我們上網(wǎng)的速度。

在應用程序中我們用到的 Data 的長度最大是多少,直接取決于底層的限制,即:MTU

以太網(wǎng)(Ethernet)的 數(shù)據(jù)幀 在鏈路層 IP包 在網(wǎng)絡層 TCP或UDP包 在傳輸層 TCP或UDP中的數(shù)據(jù)(Data)在應用層

它們的 關系是 數(shù)據(jù)幀{IP包{TCP或UDP包{Data}}}

2、網(wǎng)絡中 MTU 值的由來:

1>、最大值:

對于 IP 數(shù)據(jù)包來講,在 IP 包頭中,以 兩個字節(jié)(16 位)來描述 IP 包的長度,也就是說,一個 IP 包,最長可能是 65535字節(jié)(64K)。

那么加上以太網(wǎng)幀頭和尾,一個以太網(wǎng)幀的大小就是:65535 + 14 + 4 = 65553,看起來似乎很完美,發(fā)送方也不需要拆包,接收方也不需要重組

但,使用最大值真的可以嗎?我們往下看

2>、最佳值的推導:

a>、按最大值來推算:

IP 數(shù)據(jù)包按最大值 65535字節(jié) 來算,假設我們現(xiàn)在的帶寬是:100Mbps,因為以太網(wǎng)幀是傳輸中的最小可識別單元,再往下就是0101所對應的光信號了,所以我們的一條帶寬同時只能發(fā)送一個以太網(wǎng)幀。

如果同時發(fā)送多個,那么對端就無法重組成一個以太網(wǎng)幀了,在100Mbps的帶寬中(假設中間沒有損耗),我們計算一下發(fā)送這一幀需要的時間:

(65553*8)/(100*1024*1024)≈0.005(s)

在100M網(wǎng)絡下傳輸一幀就需要5ms,也就是說這5ms其他進程發(fā)送不了任何數(shù)據(jù)。如果是早先的電話撥號,網(wǎng)速只有2M的情況下:

(65553*8)/(2*1024*1024)≈0.100(s)

100ms,這簡直是噩夢。其實這就像紅綠燈,時間要設置合理,交替通行,不然同一個方向如果一直是綠燈,那么另一個方向就要堵成翔了。

小知識:

Mbps,其全稱為 Million bits per second,意為每秒傳輸百萬位(比特)數(shù)量的數(shù)據(jù)

而這里的 bit(比特,1比特等于1個位)是表示數(shù)字信號數(shù)據(jù)的最小單位。

1 字節(jié) = 8 比特,所以有 65553 * 8

b>、既然大了不行,那設置小一點可以么?

假設 MTU 值設置為100,那么單個幀傳輸?shù)臅r間,在 2Mbps 帶寬下需要:

(100*8)/(2*1024*1024)*1000≈5(ms)

時間上已經(jīng)能接受了,問題在于,不管 MTU 設置為多少,以太網(wǎng)頭幀尾大小是固定的,都是14 + 4,所以在 MTU 為 100 的時候,一個以太網(wǎng)幀的傳輸效率為:

(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字節(jié) 這個經(jīng)驗值。

3>、最佳值:

在 Ethernet 中,MTU 為 1500字節(jié);

在 FDDI 中,MTU 為 4352字節(jié);

在 IP over ATM 中,MTU 為 9180字節(jié)。

其實一個標準的 以太網(wǎng) 數(shù)據(jù)幀大小是:1518,頭信息有 14 字節(jié),尾部校驗和 FCS 占了 4 字節(jié)

4>、最小值:

最小值被限制在 64 = *46*(IP包大小) + 14 (以太網(wǎng)頭) + 4 (尾部校驗和 FCS)

為什么是 64 呢?

這個其實和以太網(wǎng)幀在半雙工下的碰撞有關,感興趣的同學可以自行去搜索。

5>、碎片與特大數(shù)據(jù)包:

在以太網(wǎng)中,數(shù)據(jù)包的大小范圍是在 64—1518 字節(jié)之間,如果除去頭部開銷,則實際的數(shù)據(jù)大小為 46—1500 字節(jié)之間。

一般情況下,數(shù)據(jù)包的大小都是在這個范圍內(nèi),如果數(shù)據(jù)包 小于64 字節(jié),稱為 碎片;

而如果 大于1518 字節(jié),稱為 特大數(shù)據(jù)包。

這兩種類型的數(shù)據(jù)包都是非正常的以太網(wǎng)數(shù)據(jù)包,它們將影響網(wǎng)絡的正常運行。

無論是碎片或特大數(shù)據(jù)包,都會增加網(wǎng)絡的負載,導致網(wǎng)絡故障的發(fā)生。

所以,我們在對網(wǎng)絡進行分析的時候,對數(shù)據(jù)包大小的判斷也是不可缺少的一個環(huán)節(jié)。

6>、發(fā)送小于最小值的包,會出現(xiàn)什么情況呢?

正常接收:

在用 UDP 局域網(wǎng)通信時,經(jīng)常發(fā)生 “Hello World” 來進行測試,

但是 “Hello World” 并不滿足最小有效數(shù)據(jù) (46) 的要求,為什么小于 46 個字節(jié),對方仍然可用收到呢?

因為在 鏈路層 的 MAC 子層中會進行數(shù)據(jù)補齊,不足 46 個字節(jié)的用 0 補齊。

收不到數(shù)據(jù):

但當服務器在公網(wǎng),客戶端在內(nèi)網(wǎng),發(fā)生小于 46 個字節(jié)的數(shù)據(jù),就會出現(xiàn)接收端 收不到數(shù)據(jù)的情況。

7>、應用層 TCP/UDP 發(fā)送的源數(shù)據(jù)大小限制

小知識:

TCP 包頭中,是沒有對 數(shù)據(jù)包總大小 的定義 - 數(shù)理論上沒有大小限制

UDP 包頭中,用 兩個字節(jié)(28=16bits) 來定義 數(shù)據(jù)包的總大小 -- 2^16 = 65535字節(jié) **即:***64k**

1、TCP 是以 數(shù)據(jù)流 形式傳輸數(shù)據(jù),所以使用 send 函數(shù)理論上沒有大小限制。

一般數(shù)據(jù)包太長的話會進行多次拆包傳輸,數(shù)據(jù)包短的話會放到下一次數(shù)據(jù)傳輸時發(fā)送。

2、UDP 協(xié)議發(fā)送時,用 sendto 函數(shù)最大能發(fā)送數(shù)據(jù)的長度為:65535- IP頭(20) - UDP頭(8)=65507字節(jié)。

用 sendt o函數(shù)發(fā)送數(shù)據(jù)時,如果發(fā)送數(shù)據(jù)長度大于該值,則函數(shù)會返回錯誤

3、UDP 協(xié)議分成若干個包發(fā)送,會發(fā)送整個數(shù)據(jù)丟失問題

如果數(shù)據(jù)小于 65507字節(jié) ,則:按照 MTU 的值進行分包,分成若干個包,然后發(fā)送出去;

而 接收方 IP 層就需要進行數(shù)據(jù)報的重組。當 IP 層組包發(fā)生錯誤,那么包就會被丟棄。

接收方無法重組數(shù)據(jù)報,將導致丟棄整個 IP 數(shù)據(jù)報。

3、OSI 七層結(jié)構(gòu):

OSI模型 功能 主要協(xié)議 單位
應用層 文件傳輸,電子郵件,文件服務,虛擬終端 Telnet、FTP,HTTP(S),SNMP,TFTP,SMTP,DNS 數(shù)據(jù)流
表示層 數(shù)據(jù)格式化,代碼轉(zhuǎn)換,數(shù)據(jù)加密 CSS、GIF、HTML、JSON、XML 數(shù)據(jù)流
會話層 解除或建立與別的接點的聯(lián)系 FTP、SSH、TLS、HTTP(S)、SQL 數(shù)據(jù)流
傳輸層 提供端對端的接口 TCP,UDP 數(shù)據(jù)段
網(wǎng)絡層 為數(shù)據(jù)包選擇路由 IP,ICMP,RIP,OSPF,BGP,IGMP 數(shù)據(jù)包
數(shù)據(jù)鏈路層 傳輸有地址的幀以及錯誤檢測功能 MTU、SLIP,CSLIP,PPP,ARP,RARP,802.2、HDLC
物理層 以二進制數(shù)據(jù)形式在物理媒體上傳輸數(shù)據(jù) ISO2110,IEEE802,IEEE802.2,V.35,EIA/TIA-232 比特流

df607186-41b9-11ee-a2ef-92fbcf53809c.jpgimg

網(wǎng)絡中的數(shù)據(jù)傳輸過程:

**在 **傳輸層**,切割成 *數(shù)據(jù)段*;

**在 **網(wǎng)絡層**,打成 IP 包 *數(shù)據(jù)包*;

**在 **數(shù)據(jù)鏈路層**,切割成 *數(shù)據(jù)幀*。

**在 **物理層**,轉(zhuǎn)變成 *比特流*。

二、計算 udp 或 tcp 包的最佳大小:

df9afec8-41b9-11ee-a2ef-92fbcf53809c.pngimg

從上圖可知:本地 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 攜帶的數(shù)據(jù) 超過1472(1500-20(IP首部)-8(UDP首部)),那么 UDP 數(shù)據(jù)就會在網(wǎng)絡層被分成多個 IP 數(shù)據(jù)報

既:發(fā)送方 IP 層就需要將數(shù)據(jù)包分成若干片,而接收方 IP 層就需要進行數(shù)據(jù)報的重組。

更嚴重的是,如果使用 UDP 協(xié)議,當 IP 層組包發(fā)生錯誤,那么包就會被丟棄。

接收方無法重組數(shù)據(jù)報,將導致丟棄整個 IP 數(shù)據(jù)報。

UDP不保證可靠傳輸;但是 TCP發(fā)生組包錯誤時,該包會被重傳,保證可靠傳輸。

2、MTU 對 TCP 的影響:

TCP 的一個數(shù)據(jù)報也不可能無限大,還是受制于 MTU,TCP 單個數(shù)據(jù)報的最大消息長度,稱為 MSS

TCP 在建立連接的過程中,雙方會進行 MSS 協(xié)商

最理想的情況下,MSS 的值正好是在 IP 不會被分片處理的最大長度(這個長度受限于數(shù)據(jù)鏈路層的 MTU)

雙方在發(fā)送 SYN 的時候會在 TCP 的頭部寫入字節(jié)能支持的 MSS 值

然后雙方得知對方的 MSS 值之后,選擇較小的作為最終 MSS

MMS 的值就在 TCP 首部的 40 字節(jié)變長選項中(kind=2)

MTU 通過限制 MSS(單個數(shù)據(jù)報的最大消息長度) 的取值,來限制單個 TCP 包的長度

3、MTU 和 MSS的關系

MTU:最大傳輸單元,由不同的數(shù)據(jù)鏈路層對應物理層產(chǎn)生的(硬件規(guī)定),以太網(wǎng)的MTU=1500

MSS:最大分節(jié)大小,為 TCP 數(shù)據(jù)包每次傳輸?shù)淖畲髷?shù)據(jù)分段大小

MSS 的取值受限于 MTU

四、如何測出當前網(wǎng)絡最佳MTU值

1、首先,我們必須明白什么才是最佳的 MTU 值。

1)當本地 MTU 值 > 網(wǎng)絡 MTU 值,網(wǎng)絡會進行拆包,這樣一來數(shù)據(jù)包數(shù)量增多,二來也增加了拆包組包的時間

2)當本地 MTU 值 < 網(wǎng)絡 MTU 值,雖然可以直接傳輸,但是卻沒有完全利用網(wǎng)絡的性能,沒有發(fā)揮出最大傳輸能力

因此,設置最合適的本地 MTU 值,就是要讓本地 MTU 值 = 網(wǎng)絡 MTU 值。

2、小知識:

如果 MTU 過大,在碰到路由器時會被拒絕轉(zhuǎn)發(fā),因為它不能處理過大的包。

如果太小,因為協(xié)議一定要在包(或幀)上加上包頭,那實際傳送的數(shù)據(jù)量就會過小,這樣也劃不來。

大部分操作系統(tǒng)會提供給用戶一個默認值,該值一般對用戶是比較合適的。

3、怎樣才能知道自己的當前網(wǎng)絡環(huán)境的 MTU 值是多少呢?

下面便來介紹測試方法。

步驟一:

打開命令提示符窗口輸入以下命令(建議直接復制,以免誤將小寫字母 l 寫為數(shù)字 1),回車。

ping -l 1480 -f www.baidu.com

這條命令的意思是向 www.baidu.com(百度主頁)發(fā)送一個探測請求,請求將一個不允許分割的 1480 字節(jié)的數(shù)據(jù)包發(fā)送出去。

步驟二:

若是出現(xiàn)傳輸失敗,提示需要拆分數(shù)據(jù)包的情況,則說明當前網(wǎng)絡的 MTU 值要比指定的 1480 小,因此我們就適當調(diào)小數(shù)據(jù)包的大小,再發(fā)送一條類似的命令

若是出現(xiàn)傳輸成功,則說明當前網(wǎng)絡的 MTU 值比 輸入的 要大。于是我們需要稍微調(diào)大數(shù)值,以便求得最為精確的網(wǎng)絡 MTU 值

步驟三:

如此這般,通過不斷修正數(shù)據(jù)包的大小,我們可以最終得到當前網(wǎng)絡的 MTU 值。

dfae1030-41b9-11ee-a2ef-92fbcf53809c.pngimg

4、ping 命令使用的是 ICMP 協(xié)議

ping 命令使用的,既不是 tcp 報文,也不是 udp 報文

它用的是 ICMP 協(xié)議,與 IP 協(xié)議同級,屬于 網(wǎng)絡層,位于 tcp、udp(傳輸層)的下一層。【應用層、傳輸層、網(wǎng)絡層、數(shù)據(jù)鏈路層、物理層】

5、計算結(jié)果分析

最后測試得出:最大數(shù)據(jù)傳輸為 1472 字節(jié)的數(shù)據(jù)包,則:

MTU = 1472 + 20字節(jié) IP 首部 + 8字節(jié) ICMP 首部 = 1500 字節(jié)



審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • TCP
    TCP
    +關注

    關注

    8

    文章

    1324

    瀏覽量

    78757
  • UDP
    UDP
    +關注

    關注

    0

    文章

    317

    瀏覽量

    33801
  • Ping
    +關注

    關注

    0

    文章

    68

    瀏覽量

    15895
  • 命令
    +關注

    關注

    5

    文章

    658

    瀏覽量

    21929
  • 最大傳輸單元

    關注

    0

    文章

    2

    瀏覽量

    5398

原文標題:UDP/TCP 最大可傳輸單元細節(jié)可不少~

文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    求助關于TCP/UDP傳輸的問題

    本帖最后由 思想的小魚 于 2016-5-20 10:47 編輯 樓主完成了UDPTCP傳輸的模塊,但目的是實現(xiàn)UDP傳輸和接收命令
    發(fā)表于 05-20 10:43

    MTU原理及相關問題分析

    Mtu最大傳輸單元,全稱為Maximum Transmission Unit,是指通信協(xié)議的某一層上面所能通過的最大數(shù)據(jù)包大小。
    發(fā)表于 12-02 15:04 ?3897次閱讀
    <b class='flag-5'>MTU</b>原理及相關問題分析

    TCPUDP的區(qū)別分析

      傳輸層協(xié)議主要有TCPUDPUDP提供無連接的通信,不能保證數(shù)據(jù)包被發(fā)送到目標地址,典型的即時傳輸少量數(shù)據(jù)的應用程序通常使用
    發(fā)表于 09-18 10:29 ?2次下載

    tcpudp協(xié)議的異同

    UDP 協(xié)議 UDP 協(xié)議是無連接、不可靠的一個傳輸層協(xié)議。下圖是 UDP 數(shù)據(jù)報格式。 端口號用來區(qū)分發(fā)送進程和接收進程。UDP 總長度表
    的頭像 發(fā)表于 11-12 14:45 ?3843次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>udp</b>協(xié)議的異同

    UDP/TCP包的大小限制知多少

    Maximum Transmission Unit(最大可傳輸單元) 的縮寫,它的單位是字節(jié)。
    的頭像 發(fā)表于 11-23 10:21 ?4832次閱讀

    基于Socket的UDPTCP編程解析 1

    TCP傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議是網(wǎng)絡體系結(jié)TCP/IP模型中傳輸層一層中的兩個不同的通信協(xié)議。
    的頭像 發(fā)表于 05-18 17:22 ?858次閱讀
    基于Socket的<b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b>編程<b class='flag-5'>解析</b> 1

    基于Socket的UDPTCP編程解析 2

    TCP傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報協(xié)議是網(wǎng)絡體系結(jié)TCP/IP模型中傳輸層一層中的兩個不同的通信協(xié)議。
    的頭像 發(fā)表于 05-18 17:22 ?560次閱讀
    基于Socket的<b class='flag-5'>UDP</b>和<b class='flag-5'>TCP</b>編程<b class='flag-5'>解析</b> 2

    科普一下MTU是什么,如何設置MTU

    歡迎來到東用知識小課堂,下面我們就來科普一下一下MTU是什么,如何設置MTUMTU是最大傳輸單元的意思,代指一類通訊協(xié)議某一層上所能通過的最大
    的頭像 發(fā)表于 10-29 06:00 ?4317次閱讀
    科普一下<b class='flag-5'>MTU</b>是什么,如何設置<b class='flag-5'>MTU</b>

    TCPUDP可以同時綁定相同的端口嗎?

    (InternetProtocol)的獨立的兩個協(xié)議,他們都工作在OSI模型中的網(wǎng)絡層。其中TCPUDP最大的區(qū)別就是面向連接和面向無連接。TCP當需要
    的頭像 發(fā)表于 02-06 11:16 ?1636次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>可以同時綁定相同的端口嗎?

    UDP能否像TCP一樣實現(xiàn)可靠傳輸?

    UDP(UserDatagramProtocol)是一種無連接的協(xié)議,基于數(shù)據(jù)報的傳輸方式。在網(wǎng)絡通信中,它通常用于快速傳輸數(shù)據(jù)包,但卻無法保證數(shù)據(jù)包的可靠傳輸。與
    的頭像 發(fā)表于 06-08 14:50 ?819次閱讀
    <b class='flag-5'>UDP</b>能否像<b class='flag-5'>TCP</b>一樣實現(xiàn)可靠<b class='flag-5'>傳輸</b>?

    udp是什么協(xié)議 TCPUDP的區(qū)別

    TCP協(xié)議提供可靠的數(shù)據(jù)傳輸UDP協(xié)議提供盡量高效的數(shù)據(jù)傳輸。TCP協(xié)議通過使用序列號、確認應答等機制,保證數(shù)據(jù)
    的頭像 發(fā)表于 06-26 17:47 ?1.1w次閱讀

    TCPUDP的區(qū)別

    是可靠傳輸,使用流量控制和擁塞控制;UDP是不可靠傳輸 TCP首部最小20字節(jié),最大60字節(jié);UDP
    的頭像 發(fā)表于 11-09 09:35 ?3347次閱讀
    <b class='flag-5'>TCP</b>和<b class='flag-5'>UDP</b>的區(qū)別

    TCPUDP的基本區(qū)別

    TCPUDP基本區(qū)別 基于連接與無連接 TCP要求系統(tǒng)資源較多,UDP較少; UDP程序結(jié)構(gòu)較簡單 流模式(
    的頭像 發(fā)表于 11-13 15:27 ?4398次閱讀
    <b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b>的基本區(qū)別

    UDPTCP的主要區(qū)別 UDP能否像TCP一樣實現(xiàn)可靠傳輸?

    UDPTCP的主要區(qū)別 UDP能否像TCP一樣實現(xiàn)可靠傳輸?TCP如何實現(xiàn)可靠性
    的頭像 發(fā)表于 01-22 16:10 ?612次閱讀

    深度解析TCPUDP協(xié)議

    TCP/IP 中有兩個具有代表性的傳輸層協(xié)議。接下來我將對TCPUDP展開深入分析,幫助大家更好地理解網(wǎng)絡傳輸協(xié)議。
    的頭像 發(fā)表于 09-02 14:53 ?180次閱讀
    深度<b class='flag-5'>解析</b><b class='flag-5'>TCP</b>與<b class='flag-5'>UDP</b>協(xié)議