TCP/IP 之 MTU、MSS
- 2019 年 11 月 28 日
- 筆記
1. 初識 MTU
查看伺服器的 MTU 配置:

客戶端 MTU 配置:

「通過上圖我們可以觀察到, 每個網卡都可以設置自己的 MTU.
2. 為什麼 MTU 是 1500 位元組
乙太網Ethernet最大的數據幀是1518位元組。乙太網幀的幀頭14位元組和幀尾CRC校驗4位元組(共佔18位元組),剩下承載上層協議的地方也就是Data域最大就只剩1500位元組. 這個值我們就把它稱之為MTU。
IP層非常關心MTU,因為IP層會根據MTU來決定是否把上層傳下來的數據進行分片.
你可能會想, 如果我將 MTU 拓大是不是就可以減少分片, 增大網路傳輸啦?
理想很豐滿, 現實很骨感
「如果過大,就會增加解析拆包的消耗,太大會擁塞。(這個過大指的是一次過大,就要分片分成兩次傳送) 太小,就會造成傳輸效率下降。
你可以這麼理解,一條運輸公路,車太少,降低運輸量。
過大,就會堵車,造成傳輸緩慢,太大,堵車了,誰都過不了。
3. 從抓包角度看 TCP 連接

全局四大層

我們看到一共分為四大層, 分別對應了(物理層)、(數據鏈路層)、(網路層)、(傳輸層).
- 物理層: 關注數據位元組寫入, 收到 1514 bytes, 這已經是我當前環境配置最大包了, 最大包為什麼是 1514 bytes, 我們稍後再說.
- 數據鏈路層: 來源 MAC 地址、目標 MAC 地址
- 網路層: Ipv4 標記 IP 來源地址、目標 IP 地址
- 傳輸層: TCP 標記來源、目的埠號及其他數據標識.
「由於乙太網EthernetII最大的數據幀是1518Bytes這樣,刨去乙太網幀的幀頭(DMAC目的地址MAC48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和幀尾CRC校驗部分4Bytes(這個部門有時候大家也把它叫做FCS),那麼剩下承載上層協議的地方也就是Data域最大就只能有1500Bytes. 這個值我們就把它稱之為MTU。
4. 又見 MSS
MSS (Maxitum Transmission Unit) 最大傳輸單元

「這裡我們的 MSS 值為 1448 位元組.
「MTU是協商制的, 所以對應的 MSS 在 TCP 連接建立時就協商好了, 以最小值為準
MSS 為什麼是1448
MSS就是TCP數據包每次能夠傳輸的最大量, 決定TCP的單包傳輸量。為了達到最佳的傳輸效能,TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的 時候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes)所以往往MSS為1460(如圖1中紅色方框所示的SYN包中的MSS值)。通訊雙方會根據雙方提供的MSS值的最小值確定為這次連接的最大MSS值。MSS為1460是由1500-20(IP頭)-20(TCP頭)計算出的。實際場景下,TCP包頭中會帶有12位元組的選項—-時間戳。這樣,單個TCP包實際傳輸的最大量就縮減為1448位元組。1448=1500-20(IP頭)-32(20位元組TCP頭和12位元組TCP選項時間戳)
簡單公式:
「(IP頭 + TCP頭 + 時間戳) + MSS = MTU
參考圖
