IP-MTU

問題 :

  • 什麼是 MTU
  • MTU 爲什麼是 1500 個字節
  • ip 協議的分包
  • 什麼是 MSS
  • tcp 協議的分段

概述

我們知道知道數據經過層層封裝後最後通過數據鏈路層發往另外一個終端 , 那麼當發往的數據的大小太大了,TCP/IP 就會通過分包(一個變多個),然後再傳到鏈路層進行發送 .
我們先來看一下網絡分層

1297993-20210603114724241-1967695471.jpg

1297993-20210603114737761-1669325959.png

1297993-20210603114752660-1139807112.png

什麼是 MTU

MTU 最大傳輸單元(Maximum Transmission Unit,MTU) , 最大傳輸單元MTU(Maximum Transmission Unit,MTU),是指網絡能夠傳輸的最大數據包大小,以字節爲單位。MTU的大小決定了發送端一次能夠發送報文的最大字節數。
如果MTU超過了接收端所能夠承受的最大值,或者是超過了發送路徑上途經的某臺設備所能夠承受的最大值,就會造成報文分片甚至丟棄,加重網絡傳輸的負擔。
如果太小,那實際傳送的數據量就會過小,影響傳輸效率。在不同的協議中 MTU 的值是不同的 , 例如 :

1297993-20210614221201655-524755509.png

如果IP層有一個數據報要傳,而且數據幀的長度比鏈路層的MTU還大,那麼IP層就需要進行分片( fragmentation),即把數據報分成乾片,這樣每一片就都小於MTU . 爲了解釋 MTU 的概念可以看下面的例子 ,

MTU 的值不是越大越好,更大的 MTU 意味着更低的額外開銷,更小的 MTU 意味着更低的網絡延遲。每一個物理設備都有自己的 MTU,兩個主機之間的 MTU 依賴於底層的網絡能力,它由整個鏈路上 MTU 最小的物理設備決定3,
如下圖所示,網絡路徑的 MTU 由 MTU 最小的紅色物理設備決定,即 1000:

1297993-20210614221605731-265975676.png

圖片來源 : https://draveness.me/whys-the-design-tcp-segment-ip-packet/

兩臺主機通信路徑中的最小MTU,稱爲路徑MTU( Path mtu,PMTU),也就是上面的這個 1000 個字節爲該連接的 PMTU
你也看到了以太網MTU一般爲 1500 個字節, 也就是說超過 1500 個字節的數據就會分包發送,那麼我們反推一下 ,

    下面兩個章節來自 :  https://info.support.huawei.com/info-finder/encyclopedia/zh/MTU.html  非原創

爲什麼以太網MTU通常被設置爲1500?

RFC標準定義以太網的默認MTU值爲1500。那麼這1500的取值是怎麼來的呢?
早期的以太網使用共享鏈路的工作方式,爲了保證CSMA/CD(載波多路複用/衝突檢測)機制,所以規定了以太幀長度最小爲64字節,最大爲1518字節。最小64字節是爲了保證最極端的衝突能被檢測到,64字節是能被檢測到的最小值;最大不超過1518字節是爲了防止過長的幀傳輸時間過長而佔用共享鏈路太長時間導致其他業務阻塞。
所以規定以太網幀大小爲64~1518字節,雖然技術不斷髮展,但協議一直沒有更改。
以太網最大的數據幀是1518字節,這樣刨去幀頭14字節和幀尾CRC校驗部分4字節,那麼剩下承載上層IP報文的地方最大就只有1500字節,這個值就是以太網的默認MTU值。
這個MTU就是網絡層協議非常關心的地方,因爲網絡層協議比如IP協議會根據這個值來決定是否把上層傳下來的數據進行分片,如果單個IP報文長度大於MTU,則會在發送出接口前被分片,被切割爲小於或等於MTU長度的IP包。

MTU示意圖

實際上,不同的廠商,甚至同一廠商的不同產品型號對MTU的定義也不盡相同,通常分爲以下幾種:

  • MTU用以指示整個IP報文的最大長度(IP頭+三層Payload),MTU是一個三層的定義,即MTU = IP MTU。例如在Huawei NetEngine系列路由、CloudEngine系列交換機上,MTU是三層的定義,指IP MTU。
  • MTU的值等於IP報文與以太幀頭的總和,即MTU = IP MTU + 14字節。例如在Cisco部分設備上,MTU是指IP MTU + 以太幀頭。
  • MTU的值等於IP報文與以太幀頭、CRC部分的總和,即MTU = IP MTU + 18字節。例如在Juniper部分設備上,MTU是指IP MTU + 以太幀頭 + CRC部分。

在實際設置MTU值時,需要特別關注各廠商、產品對於MTU的定義。

IP 分片

IP 報文格式

img

IP 分片過程

以太網缺省MTU=1500字節,這是以太網接口對IP層的約束,如果IP層有<=1500字節需要發送,只需要一個IP包就可以完成發送任務;如果IP層有>1500字節數據需要發送,需要分片才能完成發送。

以主機發送一個數據載荷長度爲2000字節的報文爲例說明其分片的過程(假設出接口的MTU值爲1500)。在網絡層會對報文進行封裝,其結構組成:IP頭部20字節+數據載荷長度2000字節,報文封裝後,整個報文長度爲2020字節。在出接口進行轉發的時候,發現IP報文的長度超過了MTU的值1500,因此要進行分片處理,詳情見下圖。

img

第一片報文,IP報文頭固定20字節,數據載荷可以封裝1480字節(MTU值1500字節-IP報文頭20字節,數據載荷長度須是8的倍數);

第二片報文,複製第一片的IP頭,IP報文頭固定20字節,數據載荷爲剩餘的520字節(總數據載荷長度2000字節減去第一片中已封裝的1480字節)。如果最後一片報文的長度不足46字節,會自動填充至46字節。

所有分片報文在發送至目的主機後,在目的主機進行分片重組,恢復爲原報文。在進行重組時,通過IP標誌位中的MF用來分辨這是不是最後一個分片,片偏移用來分辨這個分片相對原數據報的位置。通過這幾個字段,可以準確的完成數據報的重組操作。

PMTU

顧名思義,Path MTU就是指傳輸路徑的MTU,無需分片就能穿過某路徑的數據包最大長度。在從發送端到接收端的傳輸路徑上,如果網元的MTU設置不一致,則決定該路徑可用MTU的,其實是整條路徑上的最小MTU值。以Path MTU作爲IP包長髮送數據,既高效又能避免分片。

img

img

看一個例子

    例子來源 : https://zhuanlan.zhihu.com/p/139537936

MSS(Maximum Segment Size,最大報文長度),是TCP協議定義的一個選項,MSS選項用於在TCP連接建立時,收發雙方協商通信時每一個報文段所能承載的最大數據長度

一旦DF位置一,(DF位爲1的話則不允許分片)將不允許中間設備對該報文進行分片,那麼在遇到IP報文長度超過中間設備轉發接口的MTU值時,該IP報文將會被中間設備丟棄。在丟棄之後,中間設備會向發送方發送ICMP差錯報文(告訴發送者,你發送的數據大小超過了我的MTU , 需要發小點體積的數據).這個過程如下 :

1297993-20210614222953924-1597264926.jpg

通過抓包

1297993-20210614223036636-2047307795.jpg

我們可以看到其差錯類型爲3,代碼爲4,並且告知了下一跳的MTU值爲1478。在ICMP差錯報文裏封裝導致此差錯的原始IP報文的報頭(包含IP報頭和四層報頭)。

一旦出現這種因DF位置一而引起丟包,如果客戶端無法正常處理的話,將會導致業務應用出現異常,外在表現爲頁面無法打開、頁面打開不全、某些大文件無法傳輸等等,這將嚴重影響業務的正常運行。
那麼客戶端如何處理這種狀況呢?
TCP主要通過兩種方式來應對:

  1. 協商MSS,在交互之前避免分片的產生
  2. 路徑MTU發現(PMTUD)

PMTUD

    這裏引用來自 : https://draveness.me/whys-the-design-tcp-segment-ip-packet/ 的例子 ,非原創 

步驟一 : 向目的主機發送 IP 頭中 DF 控制位爲 1 的數據包,DF 是不分片(Don’t Fragment,DF)的縮寫;路徑上的網絡設備根據數據包的大小和自己的 MTU 做出不同的決定:
(1) 如果數據包大於設備的 MTU,就會丟棄數據包併發回一個包含該設備 MTU 的 ICMP 消息;順便帶回去建議的MTU 大小
(2) 如果數據包小於設備的 MTU,就會繼續向目的主機傳遞數據包;

步驟二 : 源主機收到 ICMP 消息後,會不斷使用新的 MTU (根據帶回來別人建議的 MTU 大小)發送 IP 數據包,直到 IP 數據包達到目的主機;

然後這裏看一下我自己做的抓包實驗 :

img

可以看到這裏就是置爲 不分片的情況 .

總結

TCP/IP 的 PMTU 的發現機制儘可能地爲了減少分片的可能 , 我們在優化的時候要將這個原則考慮進去 .

參考資料

百萬連接 :

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章