TCP和IP什么情況分包


概述

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

1297993-20210603114724241-1967695471.jpg

1297993-20210603114737761-1669325959.png

1297993-20210603114752660-1139807112.png

MTU

MTU 最大傳輸單元(Maximum Transmission Unit,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 個字節的數據就會分包發送,那么我們反推一下 ,

IP 整體大小 = IP Header + TCP = 20 + 1480 = 1500 
TCP 整體大小 = TCP Header + TCP Playload = 20 + 1460 = 1480 

也就是說我只要在TCP 三次握手MSS 協商的時候傳輸的數據小於 1480 不就行了嗎? MSS 能完全避免 IP 分片嗎,肯定不行, MTU 有可能會變呀 ,而且由於網絡異常等原因或是物理設備等原因 .

IP 中的 MTU 是物理設備上的限制,它限制了路徑能夠發送數據包的上限,那么如何知道某一個鏈路中的 MTU , 下面我們將介紹 路徑最大傳輸單元發現(Path MTU Discovery,PMTUD)

看一個例子

    例子來源 : 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 數據包達到目的主機;

MSS 協商

1297993-20210614223334719-773129879.jpg

我們可以看到在三次握手的時候就雙方就進行過協商,最大程度地減少數據傳輸到 IP 層然后進行分包的可能.

需要注意的知識點

  • IP 協議的 MTU 是物理設備上的限制,它限制了路徑能夠發送數據包的上限,而 TCP 協議的 MSS 是操作系統內核層面的限制,通信雙方會在三次握手時確定這次連接的 MSS。一旦確定了 MSS,TCP 協議就會對應用層交給 TCP 協議發送的數據進行拆分,構成多個數據段。IP 的 MTU 大小對上面 TCP 是透明 , 可以讓上層協議讀取得到的.
  • TCP 協議拆分數據是為了保證傳輸的可靠性和順序,作為可靠的傳輸協議,為了保證數據的傳輸順序,它需要為每一個數據段增加包含序列號的 TCP 協議頭,如果數據段大小超過了 IP 協議的 MTU 限制, 就會帶來更多額外的重傳和重組開銷,影響性能

總結

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

參考資料

  • https://mp.weixin.qq.com/s/RP6w69I-q5ai9Bx_SzjUfQ
  • https://draveness.me/whys-the-design-tcp-three-way-handshake/
  • https://zhuanlan.zhihu.com/p/139537936


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM