通过 PPPoE 方式拨号上网的用户(包括常见的光猫),如果路由器的 MTU 设置不正确,可能会导致网速下降或者无法上网。

关于 MTU

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

为什么要有 MTU?打个比方,网络传输数据时,数据包就像货物,被卡车从一个地方运到另一个地方。如果货物超重,则卡车无法运送;如果装的太轻太少,则运输效率低。MTU 相当于卡车的最大载重值。

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

怎么获得最优的 PPPoE MTU

IEEE 802.3 定义了以太网的 MTU 为 1500 bytes,PPPoE 的头需要消耗 8 bytes,所以 PPPoE 的 MTU 为 1492(最大值)。1429 也是最常见的 PPPoE MTU,但是因为个别运营商会使用稍小的值,所以需要我们进一步验证。以下使用 ping 命令作为工具。

ping 是个常见的命令,使用的协议是 ICMP(四层)。网络结构中从高层到低层依次是,ICMP → IP → Ethernet(PPPoE)。

ICMP 包大小 + ICMP 包头(8 bytes) + IP 包头(20 bytes)PPPoE MTU

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

换句话说,只要知道 ICMP 包(最大值),那么加上 28,就是 PPPoE MTU 需要设置的值。

PPPoE MTU 最大值为 1492,减去 28,得出 ICMP 包最大为 1464 bytes。所以我们只要从 1464 开始递减,就可以快速拿到ICMP 包最大值你也可以尝试增大数字

ping 命令的用法

ping 时,我们可以指定发送数据包的大小,不通的说明数字过大,每次减 2,直到可以通过。常见的错误提示有「Message too long」、「packet needs to be fragmented but DF set」。

# macOS
# -D 表示 "Do not fragment/不要拆分"; -s 指定包大小。
ping -D -s 1464 223.5.5.5

# Linux
# -4 表示使用 IPv4; `-M do` 表示 "Do not fragment/不要拆分",OpenWRT 不支持此参数,可以去掉; -s 指定包大小。
ping -4 -M do -s 1464 223.5.5.5

# Windows
# -f 表示 "Do not fragment/不要拆分"; -l 指定包大小。
ping -f -l 1464 223.5.5.5

得到数据包大小的值后,加上 28,就是 PPPoE 需要设置的值。例如,能 ping 通的数据包最大为 1460,则 PPPoE MTU 应该设置为 1488 (1460+28)。

修改电脑 MTU 的方法

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

macOS MTU 设置

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

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

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

其它说明

  • ping 使用的 IP 地址可以换成你常用的 dns 或 网站域名。
  • 电脑网卡如果不是直接拨号,MTU 默认为 1500,不需要修改。