在linux內核中修改TCP MSS值


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

 


免責聲明!

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



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