什麼是 MTU 與 MSS 計算器?
這個工具能把網路的最大傳輸單元(MTU,Maximum Transmission Unit)換算成 TCP 所使用的最大區段大小(MSS,Maximum Segment Size)。MTU 指的是一條鏈路一次能承載的最大封包(以位元組計);MSS 則是扣掉 IP 與 TCP 標頭後,封包裡真正能裝載的 TCP 資料量。把 MSS 設定正確,可以避免封包分片、重新傳輸,以及那個惡名昭彰、會讓連線卡死的「PMTUD 黑洞」問題。
如何使用
輸入鏈路的 MTU(乙太網路預設值為 1500),選擇 IPv4(基本標頭 20 位元組)或 IPv6(基本標頭 40 位元組),如有需要可再加上 IP 選項或 TCP 選項(如時間戳記與 SACK,常見為 12 位元組)的位元組數。計算器會扣除所有標頭負擔,回傳以位元組為單位的 MSS。
公式說明
三者的關係很單純:
$$\text{MSS} = \text{MTU} - \text{IP 標頭} - \text{TCP 標頭}$$標準的 TCP 標頭為 20 位元組,標準的 IPv4 標頭同樣是 20 位元組,因此最常見的簡化算法就是\(\text{MSS} = \text{MTU} - 40\)。IPv6 採用 40 位元組的固定標頭,故 \(\text{MSS} = \text{MTU} - 60\)。任何協商出來的選項都會加進對應的標頭,進一步壓縮可用的資料量。
實例演算
標準乙太網路的 MTU 為 1500 位元組。以 IPv4 為例:IP 標頭 20、TCP 標頭 20,總負擔為 40,因此
$$\text{MSS} = 1500 - 40 = 1460 \text{ 位元組}$$若啟用 TCP 時間戳記、額外佔用 12 位元組選項,TCP 標頭就變成 32,MSS 則降為
$$\text{MSS} = 1500 - 20 - 32 = 1448 \text{ 位元組}$$常見問題
為什麼我的 MSS 常常是 1460?因為多數鏈路採用 1500 位元組的 MTU,扣掉 IPv4 加 TCP 標準的 40 位元組標頭後,剛好剩下 1460 位元組可裝載資料。
MSS 有包含標頭嗎?沒有。MSS 純粹是 TCP 的資料負載大小;IP 與 TCP 標頭會另外加在它前面,組成完整的封包。
PPPoE 或通道(tunnel)該怎麼算?封裝會降低有效 MTU(PPPoE 會多 8 位元組,使 MTU 變成 1492;VPN 佔用更多)。請把這個縮小後的 MTU 填進來,就能得到正確的 MSS。