理解协议最大传输单元(MTU)和TCP 最大报文段长度(MSS)
1. 背景
公司的网络使用办公防火墙NAT代理访问互联网,托管在IDC的服务器也在机房防火墙后,也经过NAT。公司访问IDC服务器,通过SSL VPN连接,访问某些网页时,经常会打不开或页面错误。怀疑是MTU值造成的。
2. 测试
2.1 测试VPN链路中最大MTU
1. SSL VPN客户端不限制MTU
2. 测试访问IDC内网服务器
经测试,发现数据包长度1384时可以通过,1385时就被丢弃。
- 172.27.2.3 IDC内服务器IP
- f 在数据包中设置“不分段”标记(仅适用于 IPv4)。
- l 1384 设置数据部分长度为1384
2.2 测试结果说明
- 网络链路
办公网IP --> 办公网网关防火墙(MTU=1472)–> 互联网链路 --> IDC防火墙 --> IDC内服务器IP
- 最小MTU限制是1472(办公网网关防火墙)
- 1384字节(数据包)+8字节(ICMP)+20字节(IP)=1412字节
- 1472- 1412 =60字节,应该是SSL VPN 二次封装的头部字节
3. 解决
3.1 修改VPN客户端
直接修改VPN客户端设置,配置“虚拟网卡MTU值”小于1400(图中设置1384)
3.2 修改VPN服务端
修改华为防火墙设置,指定“TCP 最大报文段长度(MSS)”小于1384(图中设置1384)
4. 概念
4.1 说明
- 最大报文段长度(MSS,Maximum Segment Size)
- 最大传输单元(MTU,Maximum Transmission Unit)
属性 | MTU(最大传输单元) | MSS(TCP 最大报文段长度) |
---|---|---|
所属层次 | 数据链路层(如以太网、VPN 隧道等) | TCP 传输层 |
定义 | 链路层一次能传输的最大字节数(含所有头部) | TCP 报文段中数据部分的最大字节数(不含头部) |
包含内容 | 包含 IP 头部、TCP/UDP 头部、应用层数据(即 “整个数据包”) | 仅包含 TCP 协议承载的应用层数据(纯 payload) |
典型值 | 以太网默认 1500 字节,VPN 隧道可能更小(本例中 1472) | 通常为 MTU 减去 IP 头部(20 字节)和 TCP 头部(20 字节),如 1460 字节 |
4.2 关系
参考: TCP/IP协议-最大传输单元MTU和最大分段大小MSS
- 当IP数据包在相应链路层传输前,若检测到IP数据包的长度大于MTU的值,则IP数据包在IP层进行分片,使得每个数据包的长度小于MTU,且每个数据包到达目的地之前不会被重组。
- 若数据长度超过MSS长度,则TCP协议就会分片,而不是等到IP层再分片。
- MSS 是基于 MTU 计算的,目的是避免 TCP 数据包在 IP 层被分片(分片会降低效率,甚至可能被某些设备丢弃)。
计算公式(简化版): - MSS = MTU - IP头部长度 - TCP头部长度