MTU: Maxitum Transmission Unit 最大傳輸單元
MSS: Maxitum Segment Size 最大分段大小
MSS最大傳輸大小的縮寫,是TCP協議里面的一個概念。
MSS就是TCP數據包每次能夠傳輸的最大數據分段。為了達到最佳的傳輸效能TCP協議在建立連接的時候通常要協商雙方的MSS值,這個值TCP協議在實現的時候往往用MTU值代替(需要減去IP數據包包頭的大小20Bytes和TCP數據段的包頭20Bytes), 通訊雙方會根據雙方提供的MSS值得最小值確定為這次連接的最大MSS值。
而一般以太網MTU都為1500, 所以在以太網中, 往往TCP MSS為1460。
協商TCP MSS大小具體過程如下:
TCP client發出SYN報文,其中option選項填充的MSS字段一般為(MTU-IP頭大小-TCP頭大小),同樣TCP server收到SYN報文后,會發送SYN+ACK報文應答,option選項填充的mss字段也為(MTU-IP頭大小-TCP頭大小);協商雙方會比較SYN和SYN+ACK報文中MSS字段大小,選擇較小的MSS作為發送TCP分片的大小。
對於涉及PPPOE+NAT、IPsec、L2TP、GRE等組網,通常由於報文太大需要分片,這樣會降低傳輸速率; 所以選擇一個合適的MSS對傳輸數據來說比較重要. Linux中一般可以通過netfilter iptables設置TCP MSS來解決。
iptables -A FORWARD -p tcp- -tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
這條規則的目的就是改變TCP MSS以適應PMTU(Path MTU)
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN- j TCPMSS --set-mss 128
設置MSS為128
實際運用:
在NAT服務器上設置
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1260
其中gre 線路的 mtu 為 1300
在 vxlan 環境中的 NAT服務器上設置:
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1366
其中 算法是1514-vxlan 54-vxlan54-ipip20-ip20=1366