什么是 MTU, 什么是 MSS,什么是TCP Window Size


  MTU 到底是怎么來的
  MTU 指的是在三層(L3)上傳輸的最大數據報單元, 而 MTU 的大小一般由數據鏈路層(L2)設備決定. 比如生活中使用最廣泛的以太網(Ethernet, IEEE 802.3)的幀大小是 1518 字節, 根據 Ethernet Frame 的定義, L2 Frame 由 14 字節 Header 和 4 字節 Trailer 組成, 所以 L3 層(也就是 IP 層)最多只能填充 1500 字節大小, 這就是 MTU 的由來。
  MTU即物理接口(數據鏈路層)提供給其上層(通常是IP層)最大一次傳輸數據的大小;以普遍使用的以太網接口為例,缺省MTU=1500 Byte,這是以太網接口對IP層的約束,如果IP層有<=1500 byte 需要發送,只需要一個IP包就可以完成發送任務;如果IP層有> 1500 byte 數據需要發送,需要分片才能完成發送,這些分片有一個共同點,即IP Header ID相同。

  802.3 Ethernet MTU

+-------------+------------+-----------------+---------+----------------+ | Dest MAC(6) | Src MAC(6) | Eth Type/Len(2) | Payload | CRC Trailer(4) | 
+-------------+------------+-----------------+---------+----------------+

  所以說, 當使用 Ethernet 介質時確定只能傳最大 1518 字節的幀后, 減去 18 字節的 L2 頭和尾, 留給 IP 層的就只有 1500 字節了.

 PS: 標准文檔中中所說的 LLC 層因為在實際應用中基本不存在, 所以 802.3 標准 MTU 是 1492, 但是實際使用中的 MTU 是 1500.

  L2, L3 示意圖

+-------------------------------+
| IP Layer(1500) | +-------------------------------+
| Link Layer(1518) | +-------------------------------+

 

  PPPoE MTU
  另一個典型的 MTU 是撥號上網( PPPoE )的 1492 字節, 通過以太網接入的 PPPoE 的封包結構上會在 L2 和 L3 之間插入兩層, 一層 PPP 協議和一層 PPPoE 協議. 但是因為傳輸的底層仍然使用的是以太網, 所以上層包大小仍然受 L2 大小限制. MTU 這樣算, Link Layer 長 1518 字節, 所以 PPPoE Layer 最長 1500 字節, 然后 PPPoE 頭占用 6 字節, PPP 頭占用 2 字節, 所以留給 IP 層的最大空間就剩下了 1492 字節:

+-------------------------------+
| IP Layer(1492) | +-------------------------------+
| PPP Layer(1494) | +-------------------------------+
| PPPoE Layer(1500) | +-------------------------------+
| Link Layer(1518) | +-------------------------------+


  VLAN(802.1Q) MTU
  VLAN (IEEE 802.1Q) 的實現是在 L2 頭部擴展了一個 4 字節大小的字段, 分別是 2 字節協議識別碼(TPID)和 2 字節的控制信息(TCI), 這導致了 L2 的頭和尾加起來的長度變成了 22 字節, 所以 L3 的 MTU 就被壓縮到了 1496 字節:

+-------------------------------+
| IP Layer(1496) | +-------------------------------+
| Link Layer(1518) | +-------------------------------+

然而在 802.3ac 標准之后的以太網幀大小則擴展到了 1522 字節, 也就是說在這個標准下的 Ethernet, MTU 也可以設定成 1500 字節了.

+-------------------------------+
| IP Layer(1500) | +-------------------------------+
| Link Layer(1522) | +-------------------------------+


  TCP MSS
  MSS (Maximum Segment Size)是 TCP Layer (*L4*) 的屬性, MSS 指的是 TCP payload 的長度. 當在 MTU 1500 的網絡上傳輸時, MSS 為 1460 (即 1500 減去 20 字節 IP 頭, 20 字節 TCP 頭).
  MSS是TCP提交給IP層最大分段大小,不包含TCP Header和 TCP Option,只包含TCP Payload ,MSS是TCP用來限制application層最大的發送字節數,是tcp能發送的分組的最大長度。MSS是系統默認的,就是系統TCP/IP棧所能允許的最大包。在建立連接時,這個值已經被確定了,這個值並不是客觀的值,而是由tcp/ip的實現確定的。
  如果底層物理接口MTU= 1500 byte,則 MSS = 1500- 20(IP Header) -20 (TCP Header) = 1460 byte,如果application 有2000 byte發送,需要兩個segment才可以完成發送,第一個TCP segment = 1460,第二個TCP segment = 540。實際場景下,TCP包頭會帶有12字節的時間戳,於是單個TCP包實際傳輸的最大量就會縮減為1448字節,1448=1500-20字節(IP頭)-32字節(20字節TCP頭和12字節TCP時間戳)

  為什么 L3 有 MTU 后 L4 還要 MSS 呢?
  MTU 和 MSS 的功能其實基本一致, 都可以根據對應的包大小進行分片, 但實現的效果卻不太一樣.
  L3 (IP) 提供的是一個不可靠的傳輸方式, 如果任何一個包在傳輸的過程中丟失了, L3 是無法發現的, 需要靠上層應用來保證. 就是說如果一個大 IP 包分片后傳輸, 丟了任何一個部分都無法組合出完整的 IP 包, 即是上層應用發現了傳輸失敗, 也無法做到僅重傳丟失的分片, 只能把 IP 包整個重傳. 那 IP 包越大的話重傳的代價也就越高.
  L4 (TCP) 提供的是一個可靠的傳輸方式, 與 L3 不同的是, TCP 自身實現了重傳機制, 丟了任何一片數據報都能單獨重傳, 所以 TCP 為了高效傳輸, 是需要極力避免被 L3 分片的, 所以就有了 MSS 標志, 並且 MSS 的值就是根據 MTU 計算得出, 既避免了 L3 上的分片, 又保證的最大的傳輸效率.

  TCP Window Size:
  如果A發送給B window size = 8192,意思是:B最多可以連續發送8192 byte 給A,在A ACK這8192 byte之前。那A的這個8192byte 怎么來的呢? 一般來說,8192byte就是A的接收緩區,A_Receive_Buffer= 8192,如果B不小心發送超過8192 byte,如果application沒有及時取走,則超過8192 byte 數據可能會因為A_Receive_Buffer滿而被丟棄,所以B會嚴格遵守A的 advertised window size,如果A通告的window = 0,則B一定不會發送數據。
  Window Size 占兩個byte,最大值為65535,看完下文你會發現它對對方發送速率影響很大。如果window size 是高速網絡帶寬的瓶頸,可以采用TCP Option scaling window 這個選項。

 


免責聲明!

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



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