网络与 IP

MTU 值是什么意思?1500、1492 与对网速的影响

MTU 值(Maximum Transmission Unit,最大传输单元)是一个网络接口一次能发出的最大 IP 包长度,单位是字节,包含 IP 首部,不含以太网帧头。以太网默认 1500,PPPoE 拨号要多占 8 字节封装,所以是 1492。MTU 合适时对网速几乎没有影响,路径上某段 MTU 偏小、发送方又收不到通知时,才会出现网页打不开、大文件传不动。

作者 顶联产品团队发布于 7 分钟阅读

MTU 值是网络接口一次能发送的最大 IP 包长度(Maximum Transmission Unit,最大传输单元),以字节计,包括 IP 首部和里面的 TCP、UDP 首部,但不包括以太网帧头和校验字段。普通以太网的 MTU 是 1500,意思是一个以太网帧最多装 1500 字节的 IP 包;IP 包比路径上某一段的 MTU 大,IPv4 要么分片、要么丢弃并通知发送方,IPv6 的路由器不分片,只能由发送方自己切小。家用宽带 PPPoE 拨号多了 8 字节封装,MTU 变成 1492。绝大多数服务器保持默认的 1500 即可,需要动 MTU 的是隧道、VXLAN、PPPoE 和存储网巨帧这几类场景。

MTU 1500 是什么意思:1500 字节里装了什么

以一个满长度的 TCP 报文为例,看看线路上的一帧由哪些部分组成,哪些算进 MTU:

部分 字节 算不算进 MTU
前导码与帧起始定界符 8 不算,只占线路时间
以太网头:目的 MAC、源 MAC、类型 14 不算
802.1Q VLAN 标签(带标签时) 4 不算
IPv4 首部 20(IPv6 为 40) 算
TCP 首部 20,带时间戳选项时 32 算
应用数据 1460,带时间戳选项时 1448 算
帧校验序列 FCS 4 不算
帧间隙 12 不算,只占线路时间

所以 MTU 1500 对应的以太网帧是 1518 字节(带 VLAN 标签 1522),在线路上实际占 1538 字节的时间。

这里有个常见的混淆:MTU 是三层概念,帧长是二层概念。Linux 上 ip link 显示的 1500 指 IP 包;不少交换机在端口上配置的是最大帧长,开巨帧时常见的 9216 就包含了二层头。服务器设成 9000 时,交换机端口至少要能收 9018 字节的帧(带 VLAN 标签 9022)。各厂商接口命令里的“MTU”算不算二层头并不统一,以设备文档为准。

查看本机 MTU:

ip link show eth0               # 输出中的 mtu 1500
cat /sys/class/net/eth0/mtu
netsh interface ipv4 show subinterfaces

MTU 值 1492 和 1500 的区别,以及 MTU 的取值范围

1492 比 1500 少的 8 字节

区别就在 PPPoE 的 8 字节:PPPoE 头 6 字节(版本与类型、代码、会话 ID、长度),再加 PPP 协议字段 2 字节。以太网帧的数据部分仍然最多 1500 字节,扣掉这 8 字节,留给 IP 包的只剩 1492(RFC 2516)。

链路 以太网帧数据部分 封装开销 IP 包最大(MTU) TCP 的 MSS(IPv4)
普通以太网 1500 0 1500 1460
PPPoE 拨号 1500 8 1492 1452

1492 不是“更好”或“更差”的数值,它是由链路决定的,设错才会出问题:

  • 拨号接口是 1492,内网口仍是 1500。电脑按 1500 发出的 TCP 包到了路由器装不进 PPPoE,所以家用路由器和光猫一般会在拨号接口上自动改写 TCP 握手里的 MSS(MSS 钳制),让连接一开始就用 1452 的数据段,电脑上不用改。
  • 机房服务器一般不涉及 1492。服务器是静态地址接入,MTU 为 1500;访问它的家庭用户在 PPPoE 后面,他们握手时带过来的 MSS 已经是 1452,服务器的 TCP 会自动按小的那个发。
  • 有的运营商支持 1500 的 PPPoE。RFC 4638 允许两端在支持 1508 字节以太网载荷时让 PPPoE 承载完整的 1500,是否可用以运营商为准。

MTU 值范围与常见取值

场景 MTU(IP 包,字节) 来由
IPv4 最小值 68 RFC 791 要求每条链路至少能不分片地传 68 字节
IPv6 最小值 1280 RFC 8200 规定,达不到的链路必须在下层自行分片重组
以太网标准 1500 服务器、交换机、宽带的默认值
PPPoE 拨号 1492 多 8 字节封装
GRE 隧道 1476 外层 IPv4 首部 20 + GRE 头 4
IPIP、6in4 隧道 1480 外层 IPv4 首部 20
VXLAN(承载网 MTU 1500) 1450 见下文“机房里什么时候需要调整”
WireGuard 常见默认 1420 按 IPv6 外层预留 80 字节;外层是 IPv4 时实际开销 60 字节
IPsec 视算法和模式而定 加密算法、认证算法和隧道模式不同,开销不同,以实测为准
巨帧 常见 9000 不是 IEEE 标准值,网卡和交换机支持的上限各不相同,以规格书为准

MTU 和 MSS 是什么关系

MSS(Maximum Segment Size,最大报文段长度)是 TCP 一个报文段里能装的数据量,由 MTU 减去 IP 首部和 TCP 首部得到:IPv4 是 1500 − 20 − 20 = 1460,IPv6 是 1500 − 40 − 20 = 1440。双方在三次握手的 SYN 里各自告诉对方“我能收多大的段”,发送时取对方通告的 MSS 和本端路径 MTU 中较小的那个。Linux 默认开启 TCP 时间戳,每段还要再让出 12 字节,所以实际每段装 1448 字节。

一条已建立连接实际在用的值,可以直接看:

ss -tin dst 203.0.113.10
# 输出里的 mss:1448 pmtu:1500 分别是当前每段的数据量和这条路径的 MTU

MSS 和 MTU 的关系决定了 MSS 钳制这个常用手段:在隧道或拨号的网关上,把经过的 SYN 里的 MSS 改小,两端就会主动发小包,不必等分片或丢包。例如 GRE 隧道 MTU 为 1476,对应 MSS 1436:

iptables -t mangle -A FORWARD -o gre1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1436

思科路由器在接口下用 ip tcp adjust-mss 1436,其他厂商有类似命令,以设备文档为准。要注意 MSS 钳制只对 TCP 有效,UDP 和 ICMP 的大包照样超长,基于 UDP 的业务要靠应用自己控制包长。

MTU 不匹配会怎样:分片、PMTUD 黑洞与“网页打不开”

Linux 的 TCP 默认在 IPv4 包上设置 DF(禁止分片)位,靠路径 MTU 发现(PMTUD,RFC 1191)找到合适的包长:

  1. 发送方按本机 MTU 1500 组包,并设置 DF 位。
  2. 路径上某台路由器的出接口 MTU 只有 1476,例如要进入 GRE 隧道,装不下,就丢弃这个包,回一条 ICMP 类型 3、代码 4 的“需要分片但设置了 DF”消息,里面写着 1476。
  3. 发送方收到后,把这条路径的 MTU 记为 1476,切小重发,连接继续。
  4. 如果第 2 步的 ICMP 被沿途的防火墙或安全组过滤掉,发送方永远收不到通知,只会一遍遍重传同样大小的包。这就是 PMTUD 黑洞。

IPv6 同理,通知消息是 ICMPv6 类型 2(包过大),而且 IPv6 路由器从不替你分片,拦掉它就一定是黑洞。黑洞的症状很有辨识度,共同点是“小包能过、满长度的包过不去”:

现象 原因
ping 正常、SSH 能登录,一查看大文件或输出很多内容,终端就卡住 敲命令和回显都是小包,大段输出才会凑成满长度的包
网页能打开一部分,大页面、图片加载到一半停住 前面的小包通过了,后面满长度的包被丢
HTTPS 卡在 TLS 握手,curl -v 停在 Client hello 之后 服务器发回的证书链通常有几 KB,要拆成多个满长度的包
scp、rsync 进度停在 0% 一开始传的就是满长度的数据包
VPN 连上了,能 ping 通对端内网,内网网页和文件共享打不开 隧道封装让路径 MTU 变小

没有设置 DF 的 IPv4 包会被路由器分片转发,不会形成黑洞,但任何一片丢失整个包就作废,按端口过滤的防火墙也可能丢弃不带端口信息的后续分片。

定位时先用 tracepath 看路径 MTU 在哪一跳变小,再用禁止分片的 ping 验证:

tracepath -n 203.0.113.10
ping -M do -s 1472 -c 3 203.0.113.10      # 1472 + 8(ICMP 头)+ 20(IP 首部)= 1500
tcpdump -nni eth0 'icmp[icmptype] == 3 and icmp[icmpcode] == 4'   # 有没有收到“需要分片”的通知

tracepath 的输出类似下面这样(示例),第 2 跳出现 pmtu 1476,最后的 Resume 行给出整条路径的 MTU:

 1?: [LOCALHOST]                      pmtu 1500
 1:  198.51.100.1                                          0.418ms
 2:  192.0.2.9                                             1.902ms pmtu 1476
 2:  192.0.2.9                                             2.015ms
 3:  203.0.113.10                                          9.877ms reached
     Resume: pmtu 1476 hops 3 back 3

tracepath 同样依赖 ICMP 通知,已经形成黑洞时它看不出变化,这时以 ping 的结果为准:1472 发出去没有任何回应、减小到某个值才通,那个值加 28 就是路径 MTU。处理方法按优先顺序:

  1. 放行 ICMP 类型 3 代码 4 和 ICMPv6 类型 2,让 PMTUD 正常工作,例如 iptables -A INPUT -p icmp --icmp-type fragmentation-needed -j ACCEPT。
  2. 在隧道或拨号的网关上做 MSS 钳制。
  3. 在服务器上设置 net.ipv4.tcp_mtu_probing=1,内核检测到黑洞后自动改用更小的包探测(RFC 4821),默认值 0 表示关闭。
  4. 把发送端网卡 MTU 调小。它会影响这台机器的全部流量,作为最后的手段。

MTU 值对网速有什么影响

先算一笔账:在线路上,每个帧除了 IP 包还要占 38 字节(以太网头 14、FCS 4、前导码 8、帧间隙 12),IP 包里又要扣掉 52 字节的 IPv4 和 TCP 首部(含时间戳选项)。不同 MTU 下,线路时间里真正用来传数据的比例是:

MTU 线路上每帧占用 每帧 TCP 数据 有效载荷占比
9000 9038 8948 99.0%
1500 1538 1448 94.1%
1492(PPPoE,帧内多 8 字节封装) 1538 1440 93.6%
1400 1438 1348 93.7%
1280 1318 1228 93.2%

结论很直接:在 1280 到 1500 之间,MTU 设多少,带宽利用率只差 1 个百分点左右。把 MTU 从 1500 降到 1400,速度不会有可感知的变化;反过来,在公网上也不可能靠调大 MTU 提速,因为路径上的大多数链路就是 1500。真正让网速“变慢”的是 MTU 不匹配:被丢的包要等超时重传,TCP 又把丢包当成拥塞而降速,严重时连接直接卡死。

巨帧的收益也不主要在带宽上,而在包数量上。10 Gbps 跑满时,1500 的 MTU 每秒约 81.3 万个包,9000 的 MTU 每秒约 13.8 万个,只有前者的六分之一左右,主机处理中断和协议栈的开销随之下降。现代网卡普遍有 TSO、GRO 等分段卸载功能,大包的切分和合并交给网卡完成,巨帧带来的 CPU 节省比这个比例小,实际效果以压测为准。

机房里什么时候需要调整 MTU:隧道、VXLAN 与巨帧

需要调整的情况,几乎都来自“包外面又套了一层”。常见封装的开销,以及想让里面的业务继续用 1500 时,承载网至少要多大:

封装 额外开销(字节) 承载网为 1500 时内层可用的 MTU 内层要保持 1500,承载网至少
802.1Q VLAN 标签 4,加在帧上,不占 IP 包 1500 交换机能收 1522 字节的帧,支持 802.1Q 的交换机都满足
QinQ 双层标签 8,同上 1500 交换机能收 1526 字节的帧
PPPoE 8 1492 1508
GRE(IPv4 外层) 24 1476 1524
IPIP、6in4 20 1480 1520
VXLAN(IPv4 承载) 50 1450 1550
VXLAN(IPv6 承载) 70 1430 1570
WireGuard(IPv4 外层) 60 1440 1560

VXLAN 的 50 字节是这样来的:它把内层的整个以太网帧(14 字节帧头加 IP 包)装进外层 UDP,再加上 VXLAN 头 8、UDP 头 8、外层 IPv4 首部 20,比内层 IP 包多出 14 + 8 + 8 + 20 = 50 字节。

处理隧道和 VXLAN 有两种思路:

  • 调大承载网 MTU:数据中心内部的交换机都在自己手里时,把承载网设到 1600 或直接开巨帧,租户和虚拟机继续用 1500,不用逐台修改。这是优先选择。
  • 调小内层 MTU:承载网改不了(例如跨公网的隧道)时,把内层设为 1450 之类的值,可以通过 DHCP 选项 26 下发给虚拟机,同时在网关上做 MSS 钳制。

开巨帧要守住几条规则:

  1. 只在封闭的二层范围内用:存储网(iSCSI、NFS、Ceph 集群网)、虚拟化迁移网、备份网;公网接口和上联运营商的接口保持 1500。
  2. 同一网段的主机和交换机端口一起改:主机 9000,交换机端口按帧长设到设备支持的上限。二层交换机丢弃超长帧时不会发任何 ICMP 通知,只在端口计数里留下记录,比三层的黑洞更难发现。
  3. 改完逐对验证:ping -M do -s 8972 10.50.0.12(9000 − 28 = 8972),每一对需要通信的主机都要通。

在管理系统里怎么落地

MTU 问题难查,往往是因为不知道一台服务器到底经过了哪些设备、在哪个网段。Toplink DCIM 的交换机管理把服务器和交换机端口的对应关系登记在一起,在服务器列表里就能查到它的上联交换机、端口号、所属 VLAN 和端口速率,需要核对接口 MTU 或超长帧计数时,可以在浏览器里打开这台交换机的 SSH 终端执行 display、show 命令,会话全程录像。存储网、VXLAN 承载网这类有特殊 MTU 规划的网段,可以在 IP 地址管理里给地址段打上“存储网 · MTU 9000”这样的标签,并登记所在 VLAN 和网关设备,装机的人查这个地址段时,就能看到它的 MTU 要求,不必再去翻网络规划文档。

常见问题

把 MTU 改小能降低游戏延迟吗?

基本不能。在 1 Gbps 端口上发出一个 1500 字节的满长度帧只需约 12 微秒,100 Mbps 上约 0.12 毫秒;游戏数据包本身通常只有几十到几百字节,根本用不到 MTU 的上限。延迟主要由距离、路由和拥塞决定。

Wi-Fi 的 MTU 也是 1500 吗?

通常是。Wi-Fi 帧本身能装下比 1500 更多的数据,但无线网络要和以太网桥接互通,系统里无线网卡的 MTU 一般也显示为 1500。

MTU 和 MRU 有什么区别?

MTU 管发送,MRU(最大接收单元)管接收。PPP、PPPoE 链路在建立时由双方协商 MRU,拨号设备上看到的 1492 往往就是协商出来的;以太网接口一般只配置 MTU。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88