接口 MTU/TCP-MSS
接口 MTU/TCP-MSS
功能介绍
MTU
最大传输单元(Maximum Transmission Unit,MTU)用于限制接口发送的 IP 报文大小。调整接口 MTU,可以使发送报文适应链路承载能力,减少因报文过大引起的分片或丢包。
报文从 FortiGate 到达目的设备时,可能经过多个 MTU 不同的网络。路径 MTU 是整条路径中最小的 MTU,发送报文应不超过这一大小。IPv4 报文超过出接口 MTU 时,允许分片的报文可以被分片转发,分片会增加处理开销。如果 IPv4 头部设置了 DF(Don't Fragment,禁止分片)标志,报文无法通过分片适应较小的 MTU,会被丢弃。
多数 FortiGate 物理接口支持最大 9216 字节的 Jumbo Frame(巨型帧),部分接口上限为 9000 或 9204 字节。接口的具体能力取决于硬件平台:
- NP6、NP7、SOC4(np6xlite)和 SOC5 等 ASIC 加速接口可支持最大 9216 字节的 MTU。
- FortiGate VM 的最大 MTU 取决于底层接口和驱动。
- VLAN 等虚拟接口继承父接口的 MTU。
重要
接口支持的最大 MTU 不等于整条路径可用的 MTU。启用巨型帧前,需要确认对端接口及中间网络均支持相应报文大小。
TCP-MSS
TCP 最大分段大小(Maximum Segment Size,MSS)表示一个 TCP 段中可承载的数据量,不包含 IP 和 TCP 头部。在不包含 IPv4 选项和 TCP 选项的情况下,MSS 为接口 MTU 减去 20 字节的 IPv4 头部和 20 字节的 TCP 头部。例如,MTU 为 1500 字节时,对应的 MSS 为 1460 字节。
通过减小 TCP MSS,可以限制 TCP 连接发送的数据段大小,使 TCP 报文适应路径 MTU。TCP MSS 可以在防火墙策略中配置,也可以直接在接口上配置。
需要手动修改 MTU/TCP-MSS 的典型场景
PPPoE 接口未获取到合适的 MTU
- PPPoE 拨号时,FortiGate 根据运营商通过 PPP LCP 通告的 MRU 和本端配置限制,自动确定
ppp接口的 MTU,正常情况下无需手动设置。 - 如果未正常获取 MTU,或运营商提供的 MTU 不正确,可以根据运营商要求和路径测试结果,手动修改 PPPoE 接口的 MTU。
相关信息
标准 PPPoE 接入常见的 MTU 为 1492 字节,实际值应以线路要求为准。协商过程和配置方法参见网络管理 → 接口 → 接口设置 → PPPoE 接口的 MTU/TCP-MSS 及部署前注意事项 → PPPoE 接口配置。
部分网站打不开或大包传输缓慢
- TCP 连接能够建立,但网页加载不完整或传输较大数据时卡顿,可能是终端发送的报文超过路径 MTU,且无法通过 ICMP 通知自动调整大小。
- 确认属于此类问题后,可在相关防火墙策略或接口上限制 TCP MSS。例如,IPv4 路径 MTU 为 1492 字节时,可以设置 MSS 为
1492 - 20 - 20 = 1452字节。
提示
先通过 DF Ping 测试或抓包确认路径 MTU。如果中间设备的 MTU 配置有误,应优先修正该设备。TCP MSS 只影响 TCP,不能解决 UDP 或 ICMP 的大包问题。
IPsec 隧道中的大包传输异常
- IPsec 封装会增加报文长度。如果封装后的报文超过公网路径 MTU,可能产生 ESP 分片,分片被中间网络丢弃后会影响业务。
- TCP 业务可以通过限制 MSS 减小报文。对于 UDP、ICMP 等业务,应检查 IPsec 分片方式,必要时采用
pre-encapsulation,并根据公网 MTU 和封装开销确认隧道 MTU。
相关信息
具体排查和配置参见 VPN → IPSec VPN → IPSec VPN 排错 → ESP 分片丢包。不要仅降低隧道接口 MTU 就认为已解决转发流量的 ESP 分片问题。
配置接口 MTU
相关信息
- 以下以 PPPoE 虚拟接口
isp_pppoe为例,底层接口为wan2,目标 MTU 为 1492 字节。建议采用 PPPoE 虚拟接口方式创建拨号接口,配置方法参见部署前注意事项 → PPPoE 接口配置。 - PPPoE 接口修改 MTU 需要在底层接口上进行。
查看并记录底层接口原有的 MTU 配置和运行值。以下输出表示未启用手动覆盖,当前 MTU 为默认值 1500 字节。
# show full-configuration system interface wan2 | grep "set mtu" set mtu-override disable # diagnose netlink interface list name wan2 | grep mtu if=wan2 family=00 type=1 index=8 mtu=1500 link=0 master=0进入底层接口配置,启用 MTU 覆盖,并通过
set mtu ?查看允许配置的范围。# config system interface (interface) # edit "wan2" (wan2) # set mtu-override enable (wan2) # set mtu ? <integer> Maximum transmission unit (256-9216). Default 1500.设置 MTU 为 1492 字节并保存。
config system interface edit "wan2" set mtu-override enable set mtu 1492 next end重要
修改底层接口 MTU 会影响使用该接口的其他流量,应先确认影响范围。
查看底层接口配置和 PPPoE 接口的实际 MTU。
# show full-configuration system interface wan2 | grep "set mtu" set mtu-override enable set mtu 1492 # diagnose netlink interface list name isp_pppoe | grep mtu if=isp_pppoe family=00 type=512 index=47 mtu=1492 link=0 master=0从内网终端向同一路径上允许 ICMP Echo 的目标进行 DF 测试。1492 字节 IPv4 MTU 对应的 ICMP 数据长度为
1492 - 20 - 8 = 1464字节。1464 字节数据可以通过,而 1465 字节提示需要分片,说明该测试路径的 MTU 为 1492 字节。若只是超时,还需排除 ICMP 过滤或其他丢包原因。>ping 198.51.100.20 -l 1464 -f Pinging 198.51.100.20 with 1464 bytes of data: Reply from 198.51.100.20: bytes=1464 ... ... >ping 198.51.100.20 -l 1465 -f Pinging 198.51.100.20 with 1465 bytes of data: Packet needs to be fragmented but DF set. ...
重要
修改 PPPoE 相关接口参数前应安排变更窗口。修改后复测业务,若没有改善,应恢复原有 MTU 和覆盖状态,并继续定位问题。
测试路径 MTU
Windows、Linux 和 macOS 都可以通过发送设置 DF 标志的 IPv4 报文探测路径 MTU,也可以查看客户端学习到的 PMTU 缓存。
相关信息
以下保留各组测试记录的 IP、参数和输出。DF Ping 及缓存查询的目标为 10.1.87.222,网关为 10.0.86.1。mturoute 和 macOS 递增 Ping 使用 114.114.114.114,属于独立的探测记录。
Windows
对目标
10.1.87.222发送设置 DF 标志的 Ping。-f禁止分片,-l 1400指定 ICMP 数据长度为 1400 字节。C:\Users\cyndi>ping 10.1.87.222 -l 1400 -f Pinging 10.1.87.222 with 1400 bytes of data: Reply from 10.0.86.1: Packet needs to be fragmented but DF set.相关信息
1400 字节数据加上 20 字节 IPv4 头部和 8 字节 ICMP 头部后为 1428 字节。返回的提示表示报文需要分片,但 DF 标志禁止分片。
查看同一目标的路由缓存,读取
Path MTU字段。以下缓存中的路径 MTU 为 1422 字节。C:\Users\cyndi> netsh interface ipv4 show destinationcache address=10.1.87.222 Destination : 10.1.87.222 Next Hop Address : 10.0.86.1 Source : 10.0.86.221 Interface : 以太网 Path MTU : 1422 Upper-layer MTU : 1420 RTT mean : 1000 RTT deviation : 0 Path transmit speed (Bps): 0 Path receive speed (Bps) : 0 Link transmit Speed (bps): 1000000000 Link receive Speed (bps) : 1000000000 Flags : 0x8需要清除该目标的旧缓存时,在管理员命令提示符中执行以下命令,再重新探测。
C:\Users\cyndi> netsh interface ipv4 delete destinationcache address=10.1.87.222需要按跳探测 MTU 时,下载 mturoute,在 PowerShell 中运行。以下保留目标为
114.114.114.114的测试记录,第二跳起探测到的 MTU 为 1400 字节。PS D:\Downloads\Software> .\mturoute.exe -t 114.114.114.114 -w 1000 -r 1 mturoute to 114.114.114.114, 30 hops max, variable sized packets * ICMP Fragmentation is not permitted. * * Speed optimization is enabled. * * Maximum payload is 10000 bytes. * 1 +- host: 192.168.100.99 max: 1500 bytes 2 -++++-++-+++- host: 10.10.12.1 max: 1400 bytes 3 +- host: 10.10.24.1 max: 1400 bytes 4 +- host: 172.22.5.1 max: 1400 bytes 5 +- host: 61.149.143.225 max: 1400 bytes 6 +- host: 61.148.31.69 max: 1400 bytes 7 +- host: 61.51.169.237 max: 1400 bytes 8 +- host: 125.33.186.141 max: 1400 bytes 9 +- host: 219.158.5.202 max: 1400 bytes 10 +- host: 60.217.43.38 max: 1400 bytes 11 +- host: 60.217.42.154 max: 1400 bytes 12 +- host: 114.114.114.114 max: 1400 bytes相关信息
-t启用逐跳探测,-w 1000设置等待时间为 1000 毫秒,-r 1设置超时后的最大重试次数为 1。查看输出中每一跳的max值,判断路径上何处出现较小的 MTU。
CentOS
使用
ping -M do设置 DF 标志,-s 1400指定 ICMP 数据长度,-c 1表示只发送一个报文。以下返回的 MTU 为 1422 字节。[root@CentOS-1 ~]# ping 10.1.87.222 -c 1 -s 1400 -M do PING 10.1.87.222 (10.1.87.222) 1400(1428) bytes of data. From 10.0.86.1 icmp_seq=1 Frag needed and DF set (mtu = 1422)相关信息
-M do禁止本地分片,-M want允许必要的本地分片,-M dont不设置 DF。探测边界时使用-M do。查看同一目标的路由缓存,读取
cache行中的mtu。以下mtu 1422表示客户端已学习到 1422 字节的路径 MTU。[root@CentOS-1 ~]# ip route get 10.1.87.222 10.1.87.222 via 10.0.86.1 dev ens224 src 10.0.86.221 cache expires 596sec mtu 1422需要清除旧缓存后重新测试时,执行以下命令。
[root@CentOS-1 ~]# sudo ip route flush cache 10.1.87.222相关信息
此处保留测试记录中的命令。IPv4 缓存刷新可能不限于末尾指定的目标,执行后应重新探测并查询结果。
也可以使用
tracepath探测路径 MTU,-n表示只显示 IP 地址。以下最终探测到的 PMTU 为 1422 字节。[root@CentOS-1 ~]# tracepath 10.1.87.222 -n 1?: [LOCALHOST] pmtu 1500 1: 10.0.86.1 0.405ms 1: 10.0.86.1 0.216ms 2: 10.0.86.1 0.197ms pmtu 1438 2: 10.0.86.1 0.188ms pmtu 1422 2: no reply 3: 10.1.87.222 0.856ms reached Resume: pmtu 1422 hops 3 back 3
macOS
使用
ping -D设置 DF 标志,-s 1400指定 ICMP 数据长度。以下保留需要分片时的提示记录,返回的 MTU 为 1422 字节。❯ ping 10.1.87.222 -s 1400 -D PING 10.1.87.222 (10.1.87.222) 1400(1428) bytes of data. From 10.0.86.1 icmp_seq=1 Frag needed and DF set (mtu = 1422)查看同一目标的路由记录,读取输出表格中的
mtu列。以下目标为10.1.87.222,实际下一跳为10.0.86.1,MTU 为 1422 字节。❯ route get 10.1.87.222 route to: 10.1.87.222 destination: 10.1.87.222 gateway: 10.0.86.1 interface: en0 flags: <UP,GATEWAY,HOST,DONE,WASCLONED,IFSCOPE,IFREF,GLOBAL> recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire 0 0 0 0 0 0 1422 0需要自动递增报文大小时,使用
-g指定起始数据长度,-G指定最大数据长度,-h指定每次增加的字节数。以下保留目标为114.114.114.114的测试记录,从 1400 字节逐步增加到 1500 字节,每个长度测试一次。❯ ping -g 1400 -G 1500 -c 1 -h 1 -D 114.114.114.114 PING 114.114.114.114 (114.114.114.114): (1400 ... 1500) data bytes 1408 bytes from 114.114.114.114: icmp_seq=0 ttl=54 time=74.141 ms 1409 bytes from 114.114.114.114: icmp_seq=1 ttl=54 time=58.755 ms 1410 bytes from 114.114.114.114: icmp_seq=2 ttl=54 time=93.784 ms ... ... ...相关信息
根据可以稳定通过的最大数据长度加上 28 字节计算 IPv4 路径 MTU。Ping 回复行显示的长度可能包含 8 字节 ICMP 头部,计算时应使用
-s或-g/-G指定的数据长度。
重要
- 测试目标需要允许相应探测流量,单次超时不能证明报文超过路径 MTU。应结合“需要分片”提示、ICMP 返回的 MTU 和重复测试确认。
- 两个方向的路径及 PMTU 可能不同,需要分别测试。客户端缓存中的 PMTU 是针对目标学习到的结果,不等于永久修改了网卡 MTU。
相关信息
使用 FortiGate 发起相同类型的测试时,可参考故障排查 → Ping 工具,设置 DF 标志和 ICMP 数据长度。
TCP MSS
对于上述路径 MTU 为 1492 字节的 IPv4 PPPoE 场景,在实际承载流量的 PPPoE 虚拟接口
isp_pppoe上设置 TCP MSS 为1492 - 20 - 20 = 1452字节。config system interface edit "isp_pppoe" set tcp-mss 1452 next end查看 PPPoE 虚拟接口配置,确认
tcp-mss的设置,并重新建立测试 TCP 连接,抓包检查两个方向的 MSS 和业务是否恢复正常。# show full-configuration system interface isp_pppoe | grep tcp-mss set tcp-mss 1452
相关信息
调整 TCP MSS 不会修改接口 MTU,也不影响 UDP 或 ICMP 报文大小。
PPPoE 接口两个方向的 MSS 处理及拨号物理口配置的继承限制,参见网络管理 → 接口 → 接口设置 → PPPoE 接口的 MTU/TCP-MSS。
也可以在匹配业务的防火墙策略中设置 MSS。以下沿用 1452 字节的示例,将
<policy_id>替换为实际策略 ID,分别通过tcp-mss-sender和tcp-mss-receiver限制连接发起端和响应端通告的 MSS。小于配置值的 MSS 保持原值,修改后需重新建立 TCP 连接验证。config firewall policy edit <policy_id> set tcp-mss-sender 1452 set tcp-mss-receiver 1452 next end