TCP之MSS字段备注
调整TCP参数MSS字段,来设置在TCP层分片而非IP层。
当TCP负载大小不超过TCP的MSS字段值但其加上TCP头、IP头之后超过链路层MTU时,就会触发IP层分片。
正常TCP的MSS字段值为MTU-IPv4头-TCP头=1500-20-20=1460字节或MTU-IPv6头-TCP头=1500-40-20=1440字节。
当遇到IPIP协议(例如IPv4 over IPv6),此时TCP的MSS字段如果仍旧为1460或1440字节时,就会触发IP层分片(TCP层为查过MSS字段值不会触发分片,IP层超过1500字节触发分片),此时应设置为MTU-IPv6头-IPv4头-TCP头=1500-40-20-20=1420字节。
如何设置TCP参数使数据包在TCP层分片而非IP层
要实现TCP层分片而非IP层分片,核心在于调整TCP参数控制MSS(Maximum Segment Size,最大报文段大小),使其不超过路径MTU(Maximum Transimission Unit,最大传输单元)的限制。
MSS与MTU的关系
- MTU:链路层允许的最大数据包大小(例如以太网默认为1500字节)。
- MSS:TCP层单次可传输的最大数据载荷,计算公式为MSS=MTU-IP头(20字节或40字节)-TCP头(20字节)。例如,若MTU为1500字节,则MSS为1460字节(IPv4)或1440字节(IPv6)。
通过TCP分段确保每个报文段(含IP头)不超过MTU,从而避免IP层分片。
TCP参数MSS设置方法
手动设置MSS:在三次握手时协商MSS值。例如,在Linux系统中可通过以下命令修改MSS:
iptables -A OUTPUT -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1460
此命令在SYN报文发送时强制设置MSS为1460字节,以确保后续数据分段。
动态适应路径MTU:启用路径MTU发现(PMTUD),让TCP自动调整MSS。在Linux中开启:
sysctl -w net.ipv4.tcp_mtu_probing=2 # 0关闭,1按需启用,2始终启用
当路径中存在更小MTU时,TCP会根据ICMP反馈动态降低MSS。
- 原文作者:生如夏花
- 原文链接:https://blduan.top/post/%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE/%E7%BD%91%E7%BB%9C%E5%B1%82/tcp%E4%B9%8Bmss%E5%AD%97%E6%AE%B5%E5%A4%87%E6%B3%A8/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。