通过 PPPoE 方式拨号上网的用户(光猫等) ,MTU 理论最大值为 1492。但是个别运营商会使用稍小的值,如果客户端还设置为 1492,可能会导致网速下降或者无法上网。

关于 MTU

MTU(maximum transmission unit) 其实属于二层的一个概念,它的目的是限定「MAC 帧中数据部分(payload)的大小」的值。

为什么要有 MTU?打个比方,网络传输数据时,数据包就像一袋大米,被工人从一个点搬到另一个点。一袋大米的重量是要限制的,太重了工人搬不动,袋子也容易破,一旦出问题,就要重新打包,降低了效率;太轻了也不行,力气都浪费在路上了。MTU 就相当于一袋大米的重量限制,告诉设备数据包封装后最大不能超过多少,设备一般会使用最大值,以便获得最高效率。这个比方不是很准确,只是辅助理解。

总结一下:一个数据包,小于或等于 MTU 会被正常传输,大于 MTU 则会被丢弃或拆分。明白了这个概念,那我们就可以不断加大数据包,直到数据包被丢弃,这样就可以获得 MTU 值了。

怎么获得 MTU

ping 是个常见的命令,用于获得 MTU 简单高效。ping 使用的协议是 ICMP(四层),网络结构中从高层到低层依次是,ICMP → IP → Ethernet(PPPoE)。ICMP 包头是 8 byte,IP 包头是 20 byte。简单来说:

ICMP 包大小 + ICMP 包头 + IP 包头 ≤ PPPoE MTU

也就是:ICMP 包最大值 + 28 = PPPoE MTU

PPPoE MTU 理论最大值为 1492(Ethernet MTU 1500 byte - PPPoE header 8 byte),减去 28 的 IP 头和 ICMP 头,得出 ICMP 包最大为 1464 byte。所以我们可以从 1464 开始递减,就可以快速拿到ICMP 包最大值。你也可以试试增大数字的结果。

ping 不通的说明数字过大,请尝试减小。常见的提示信息有「Message too long」、「packet needs to be fragmented but DF set」。

一般情况下,只需要修改路由器的 mtu。以下提供修改电脑 mtu 的方法,适用于电脑直接拨号的情况。所有操作都是在 shell 中进行,Windows 请使用 cmd。

macOS MTU 设置

# 查看网卡接口名称
ifconfig
# 获取最优 mtu,尝试加大 1464
ping -D -s 1464 223.5.5.5
# 使用 networksetup 命令查看 mtu,并修改 mtu 的值
# {iface} 表示网卡接口名称,例如 en0
networksetup -getMTU {iface} 
networksetup -setMTU {iface} {mtu}

-D 表示 “Do not fragment/不要拆分”,-s 指定包大小。

Linux MTU 设置

# 查看网卡接口及 mtu (ifconfig 命令)
ifconfig -a | grep mtu
# 查看网卡接口及 mtu (ip 命令)
ip addr | grep mtu
# 获取最优 mtu
ping -4 -M do -s 1464 223.5.5.5
# 设置 mtu,interfaces 文件中添加一行 mtu {mtu}
vim /etc/network/interfaces
# 重启网络服务
/etc/init.d/networking restart

ping 命令默认使用 IPv6 的,加 -4 表示使用 IPv4;-M do 表示 “Do not fragment/不要拆分”;-s 指定包大小。不支持 -M 参数的,去掉 -M do。不同发行版本,设置 mtu 的方法有差异,以上方法仅供参考。

Windows MTU 设置

# 获得网卡接口 id
netsh interface ipv4 show interfaces
# 获取最优 mtu
ping -f -l 1464 223.5.5.5
# 设置 mtu
netsh interface ipv4 set subinterface {id} mtu={mtu} store=persistent

-f 表示 “Do not fragment/不要拆分”,-l 指定包大小。

其它说明

  • ping 使用的 IP 地址可以换成你常用的 dns 或 网站域名。
  • ICMP 包最大值 + 28就是最优 PPPoE MTU。例如,ICMP 包最大值是 1464,则 PPPoE MTU 等于 1464+28= 1492,拨号设备的 MTU 设置为 1492 即可。
  • 电脑网卡如果不是直接拨号,MTU 默认为 1500,不需要修改。