TCP(三) -- MTU/MSS

一:摘要概述

經過系列文章第二篇TCP(二) – 三次握手之後,已經清晰TCP建立連接過程。但是最終的的操作還是要落地到數據傳輸,不管怎麼設計每一步都是爲數據傳輸做鋪墊與保障。當客戶端亦或是服務端需要向對方發送100M數據,會直接一次性發送?如果不是一次性發送那麼會對該數據包做什麼操作?這些操作的根據又是什麼?接下來就需要帶着問題一一解答
在這裏插入圖片描述

二:以太網限制

網絡傳輸中數據經由應用層 – 傳輸層 – 網絡層,最終的落腳點都在鏈路層。鏈路層數據的傳輸將會是以幀爲單位進行傳輸交互,以太網幀格式如下圖所示:圖中可以看到以太網幀的範圍46 - 1500字節,也就是說當傳輸的數據量超過這個範圍的時候將會承受不住。如第一節示例圖,好兄弟你得砍它
在這裏插入圖片描述

三:網絡層分片

網絡層與鏈路層直接交互,該層會對完整的數據包進行操作適應鏈路層取值範圍麼?接下來跟着看如下實踐

// 217服務器ping 74服務器,指定數據包字節數爲3000
ping  -s 3000 192.168.15.74

// 217服務器tcpdump抓包存儲爲MTU.pkt文件供WireShark分析
tcpdump -i any -nn -vv -w /home/MTU.pkt host 192.168.15.74 

解釋一下圖中紅圈位置ping -s會增加8字節的ICMP頭,所以傳輸3000字節內容時會顯示爲3008
在這裏插入圖片描述
下圖見證奇蹟的時刻,查看第一個包詳細顯示數據包總大小爲1500字節,發生了什麼???爲什麼3000的數據包會變成1500,這就是MTU的限制!!!MTU(Maximum Transmission Unit)最大傳輸單元,當IP協議發現數據包大小超過該數值時就會對數據包進行分片操作,將完整的數據包切割爲合適傳輸的數據包大小
在這裏插入圖片描述
再深入查看一下分片的信息,上圖中紅框圈出兩個屬性:

  • More fragment:表示是否還有更多的分片
  • Fragment offset:表示分片的位移量

看如下第二個數據包就能清晰的印證這一點,你會好奇爲什麼會是185。實則是這個數據被Wireshark除以8進行的展示,換算過來就是185 * 8 = 1480。上面不是說1500麼?爲什麼會是1480了?因爲1500包含了20字節頭部大小,真正的數據區域只有1480字節。請查看Data區域大小數值
在這裏插入圖片描述

四:MTU取值

MTU在每個服務器上都可以有自己的配置,使用如下命令查看:顯示正好MTU爲1500,與第三節實驗對應

netstat -i

在這裏插入圖片描述
數據傳輸很多情況下不可能是客戶端與服務端的直接交互,中間會經過層層路由轉發,那麼當中間過程MTU不一致的時候分片的限制又是什麼?記住木桶效應,決定權的永遠是最短的木板上

在這裏插入圖片描述

五:MSS限制

正常情況下經過網絡層的處理已經可以滿足數據傳輸的要求,但是如果傳輸層爲TCP協議會不會存在問題呢?琢磨一下這個問題:當TCP交給IP協議的數據包被IP協議進行分片操作後某個分片的數據包丟失,那麼這時候TCP協議是重新傳遞丟失的分片數據呢還是整個完整的數據包?仔細琢磨很明顯,分片的操作TCP肯定是不允許交給IP協議去完成的,肯定要保持可控性

// MSS(Max Segment Size)限制,最大分段大小
 MSS = MTU - TCP協議頭 - IP協議頭

綜上所述,對於TCP協議而言,當應用層傳輸數據包超過MSS限制大小之後就會將其進行分段,滿足MTU要求後交給網絡層,避免IP協議將數據包進行分片。TCP協議會在三次握手的過程中通過options選項字段交互告訴對方自己的MSS
在這裏插入圖片描述

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