TCP-MSS

什麼是 MSS , MSS 的動機是什麼

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

    原文鏈接:https://blog.csdn.net/meihualing/article/details/113739693

    我們都知道,如果TCP/UDP往IP層發送數據時,因爲物理網絡層一般要限制每次發送數據幀的最大長度。所以IP層接收到一份要發送的IP數據報時,它要判斷向本地哪個接口發送數據(選路),並查詢該接口獲得其MTU。
    
    IP把MTU與數據報長度進行比較,如果太長了一次發送不下(超過MTU)則需要則進行分片。分片可以發生在原始發送端主機上,也可以發生在中間路由器上。

    UDP無法避免分片(除非應用層知道路徑MTU並控制UDP報文大小),TCP則通過MSS協商來避免分片發生。

假設 MTU= 1500 byte,那麼 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果應用層有 2000 byte 發送,那麼需要兩個切片纔可以完成發送,第一個 TCP 切片 = 1460,第二個 TCP 切片 = 540。

MSS 的大小與 MTU 有關, 爲:

MTU - (TCP 標頭 + IP 標頭) = MSS

MSS 共同協商

上面我們已經知道了,

1297993-20210614223334719-773129879.jpg

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

三次握手中協商了MSS就不會改變了嗎?

不是,每次執行TCP發送消息時,會重新計算一次MSS,再進行分段操作。

對端不傳MSS會怎麼樣?

我們再看TCP的報頭。

img

其中 MSS 位於可選項中, 假如對方不傳 ,那麼 MSS 默認爲 : 536 byte , 爲什麼是這個數字是因爲 :

536(data) + 20(tcp頭)+20(ip頭)= 576Byte

默認 MSS 大小的考慮有兩方面 :

  • 太小 , tcp 頭有20個字節, ip頭也有20個字節, MSS 太小的話 ,利用率會不高
  • 太大 , MSS 太大的話會造成 IP 重傳

576字節正好是 IP 最小重組緩衝區的大小, 我們想想要是這個 IP 包發送途中丟失了 , 那麼TCP 的重傳機制肯定會再次發起重新傳輸 , 而IP 最小重組緩衝區的大小正好避免了重傳 .

爲什麼IP層會分片,TCP還要分段

這是因爲假如 TCP 不分段的話, 需要傳輸一大份數據的時候 ,有可能數據丟失了, 那麼 TCP 就得傳輸整份完整的數據 ,而分段的話, 丟失了哪一塊就傳哪一塊 ,提高了效率.

TCP分段了,IP層就一定不會分片了嗎

上面提到了,在發送端,TCP分段後,IP層就不會再分片了。

但是整個傳輸鏈路中,可能還會有其他網絡層設備,而這些設備的MTU可能小於發送端的MTU。此時雖然數據包在發送端已經分段過了,但是在IP層就還會再分片一次。
如果鏈路上還有設備有更小的MTU,那麼還會再分片,最後所有的分片都會在接收端處進行組裝。

因此,就算TCP分段過後,在鏈路上的其他節點的IP層也是有可能再分片的,而且哪怕數據被第一次IP分片過了,也是有可能被其他機器的IP層進行二次、三次、四次….分片的。

因此要想整個鏈路不發生分包, 那麼可以使用上一個章節講到的 PMTU , 這樣IP就不會發生分片了.

MTU 和 MSS 的聯繫

    來自 : https://blog.csdn.net/liangzhiyang/article/details/121774339

(發生在發送端)發送端進行TCP分段後就一定不會在IP層進行分片,因爲MSS本身就是基於MTU推導而來,TCP層分段滿足了MSS限制,也就滿足了MTU的物理限制。但在TCP分段發生後仍然可能發生IP分片(發生在傳輸過程中),這是因爲TCP分段僅滿足了通信兩端的MTU要求,傳輸路徑上如經過MTU值比該MTU值更小的鏈路,那麼在轉發分片到該條鏈路的設備中仍會以更小的MTU值作爲依據再次分片。當然如果兩個通信主機直連,那麼TCP連接協商得到的MTU值(兩者網卡MTU較小值)就是端到端的路徑MTU值,故發送端只要做了TCP分段,則在整個通信過程中一定不會發生IP分片。

特別地,對中途發生分片的數據報而言,即使只丟失其中一片數據也要重傳整個數據報(這裏既然有重傳,說明傳輸層使用的是具有重傳功能的協議,如TCP協議。而UDP協議不可靠,即使丟包了也不在意更不會重傳,所以必須在應用層實現可靠通信的邏輯),這是因爲IP本身沒有重傳機制,只能由更高層,比如傳輸層的TCP協議,來負責重傳以確保可靠傳輸。於是,當來自同一個TCP報文段封裝得到的原始IP數據報中的的某一片丟失後,接收端TCP遲遲接受不到完整報文段,它就會認爲該報文段(包括全部IP分片)已丟失,TCP之後由於超時會收到三個冗餘ACK就會重傳整個TCP報文段,該報文段對應於一份IP數據報,可能有多個IP分片,但沒有辦法單獨重傳其中某一個數據分片,只能重傳整個報文段。

經常遇到的 Socket粘包是怎麼回事

爲什麼會黏包, 因爲socket 裏面的數據是業務數據 ,而傳過來的時候有可能是經過分段的到達的, 我們並不知道到哪才截止, 所以有可能導致數據粘包 , 解決的方法也非常簡單 , 只要加上一個長度就夠了.

總結

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

參考資料

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