合理调整MTU值

2019-07-13 05:02发布

合理调整Openwrt 的MTU值

1. 问题分析

在openwrt CC版本上调试l2tp时,使用4G进行拨号,发现ppp连接可以建立成功,对方内网邮件服务器的ip也可以ping通,但是网页登录失败。进行多次抓包调试后,发现是l2tp隧道MTU值的问题。 openwrt的L2TP使用XL2TPD来完成,但是如果采用netifd来完成拨号(L2TP客户端),/etc/xl2tpd/xl2tpd.conf、/etc/ppp/chap-secrets、/etc/ppp/options.xl2tpd的配置好像都没有用到,只用到了/etc/config/network中的配置信息(如下 l2tp的配置),可以查看/lib/netifd/proto/l2tp.sh此文件。 解决方法:将默认的l2tp的MTU值从1500改为1410,即可正常工作。 root@OpenWrt:/# cat /etc/config/network config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fd01:44ac:554a::/48' config interface 'lan' option ifname 'eth0.1 eth1' option force_link '1' option type 'bridge' option proto 'static' option netmask '255.255.255.0' option ip6assign '60' option ipaddr '192.168.0.1' config interface 'wan' option ifname 'eth0.2' option proto 'dhcp' config interface 'wan6' option ifname 'eth0.2' option proto 'dhcpv6' config switch option name 'switch0' option reset '1' option enable_vlan '1' config switch_vlan option device 'switch0' option vlan '1' option ports '0t 1 2 3 4' config switch_vlan option device 'switch0' option vlan '2' option ports '0t 5' config interface 'lte' option proto 'dhcp' option ifname 'usb0' config interface 'vpn' option proto 'l2tp' option server '120.197.116.46' option username 'test' option password 'test' option mtu '1410' option keepalive '60' option demand '30' root@OpenWrt:/# 顺便多写几句,netifd使用ifup脚本来启用l2tp连接,会生成如下文件: root@OpenWrt:/# cat /tmp/l2tp/options.vpn lcp-echo-interval 5 lcp-echo-failure 60 usepeerdns defaultroute user "test" password "test" ipparam "vpn" ifname "l2tp-vpn" ip-up-script /lib/netifd/ppp-up ipv6-up-script /lib/netifd/ppp-up ip-down-script /lib/netifd/ppp-down ipv6-down-script /lib/netifd/ppp-down lcp-max-terminate 0 mtu 1410 mru 1410 root@OpenWrt:/# PS查看后,如下: root@OpenWrt:/# ps -ww 16064 root 1544 S /usr/sbin/pppd passive nodetach : file /tmp/l2tp/options.vpn /dev/pts/0 root@OpenWrt:/#

2. MTU调试

参考:http://www.right.com.cn/forum/thread-147203-1-1.html openwrt L2TP 配置界面 关于 MTU
MTU (最大传输单元)是网络设备传输的信息包最大值。对于各种路由器,最佳的MTU值通常都是默认值。有时,更改MTU值可提高设备工作性能,做起来很简单,但事实上,这样做往往会导致出现其他问题。最好保持MTU不变,除非有以下情况出现:
1). 当连接不到ISP或者不能使用其他的因特网服务时,且他们的技术支持人员建议更改MTU值
2). 当您使用 VPN,遇到性能问题时可以考虑更改MTU
为了提高网络的某些性能,使用了可优化MTU 值的应用程序,而这引起了连通性和其他性能方面的问题

一个信息包被发送到MTU值较小的设备时,将被分解为若干小块。理论上,在所有电脑、交换机、路由器及您能访问到的因特网的所有设备上的MTU值应该设置为同一大小。但是您不能控制因特网上的 MTU 值,而事实上在一个局域网中的最佳MTU值取决于硬件、软件、无线接口等等。

在一种情形下修改MTU的大小可使设备很好地工作, 但在其他方面却可能引起性能和连接性问题
当具有不同MTU值的设备相互通信时,信息包将会被分成多个以便能传给具有最小的MTU值的设备
Windows XP自动设置MTU ,换句话说,它使MTU对于各种应用综合性能最优化。微软的文章解释了使用Windows XP的宽带用户不能连接到ISP的原因

一旦网络设备分解了一个信息包,此信息包在到达目的地前一直保持分解的状态

各种应用下的最佳MTU值
设置MTU大小是一个反复试验的过程: 由最大值1500开始下降,直至问题解决。使用下列值之一或许能解决一些由MTU值引起的问题:
1500. 以太网信息包最大值,也是默认值。是没有PPPoE和VPN 的网络连接的典型设置。是各种路由器、网络适配器和交换机的默认设置
1492. PPPoE 的最佳值
1472. 使用 ping 的最大值 (大于此值的信息包会先被分解)
1468. DHCP的最佳值
1430. VPN和PPTP 的最佳值
576. 拨号连接到ISP的标准值


好了,注意一下,以上资料是正常普通情况下MTU的值,不同地区不同运营商不同机房或许也会导致MTU值的不一致!如何查看MTU值呢?电脑直接插网线到modem进行ADSL拨号上网,在cmd命令下输入:
netsh interface ipv4 show subinterfaces

这里写图片描述

如上图显示就是当地ADSL运营商MTU值。而并非固件默认的1500.如何测试MTU值的最大值?MTU值越大,发包量就大,发包时间减小,理论上是可以提高网络的。怎样测试自己的MTU值的最大值呢?首先,在CMD命令下输入: 这里写图片描述

ping -f -l 1500 www.baidu.com1500是默认值,先来测试一下是否能达到1500.命令返回:“需要拆分数据包但是设置 DF。” 说明MTU值过大!我们把MTU值降低试试

这里写图片描述

ping -f -l 1450 www.baidu.com
PING值出来了,说明MTU设置1450可以通过。再测试一下1451。
ping -f -l 1451 www.baidu.com

这里写图片描述

命令返回:“需要拆分数据包但是设置 DF。” 说明MTU值最大就是1450了。

于是有人就疑问,为什么在modem下测试是1478,而ping值测试 是1450?
上面ping得到的MTU值不能直接用于本地设置上,还应在此基础上加上28(数据包头大小28字节),因此最终在WAN设置页面修改MTU大小为1478。
最后,我就在路由器的WAN接口设置MTU值1478.