Linux下设置MTU值到9000

最近在分析彩信发送速度方面的问题,因此对MTU值进行了进一步研究,以下是我个人对MTU的理解和总结:
1. MTU( maximum transmission unit )是设置在网卡上的配置值,它决定了经过网卡传输的数据包的最大尺寸。
2. 数据包在网络上传输的时候,会经过许多的路由器和网关,这些设备上都有MTU设置,如果数据包太大,经过设备的时候还会被拆分。因此PMTU(路径最大传输单元, 它等于路径上每一跳的MTU之中的最小值)值对数据传输速度影响更大。Internet网中PMTU一般为 576B 。
3. 在TCP建立的时候终端会与服务器协商MSS( maximum segment size ),它是TCP数据包每次能够传输的最大数据分段。它与MTU的关系是:MTU = MSS + 20 (TCP header length)+ 20 (IP header length)。MSS 协商结果(两端支持的MSS的最小值)才最终决定终端发出的数据包大小。
4. 在现网中,经抓包发现WAP网关返回的MSS值为1410,所以为了追求最大的性能,我们设置的MTU值应当不小于1450 (1410 + 20 +20),所以当前我们建议的经验值为 1460 B 。
5. 由于Internet网中PMTU一般为 576B, 所以终端设置的MTU应当不小于它,但是设置大了也不一定能够提升传输效率。


默认的ANDROID系统中不带BUSYBOX,所以无法用BUSYBOX IFCONFIG来查看修改MTU值。其实网卡的MTU值是保存在/sys/class/net/eth0/mtu文件中,所以可以通过查看和修改文件达到修改MTU的目的:
以下以查看和修改eth0为例:
1. 查看MTU值
# cat /sys/class/net/eth0/mtu
2.  修改MTU值
# echo "1460" > /sys/class/net/eth0/mtu
顺便说一句,在/sys/class/net/eth0/目录中还有很多文件,对应了eth0的各个参数,可以手动的修改里面的值达到配置网卡参数的目的。

 


   MTU,即Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元。设置合适的MTU值可以解决“部分网站打不开”、“上网速度慢”等问题,并且可以适当提升上网速度。
   设置多大的MTU值取决于你的上网方式,不同的上网方式支持不同的MTU,下面列出了一些上网方式的MTU值:
   EtherNet(一般上网方式,默认值):1500
   PPPoE/ADSL:1492
   Dial Up/Modem:576
WINDOWS平台
问题一:知道了我的上网方式,如何设置MTU值?
1. 在 『开始』>『运行』中,键入regedit,点确定;
2. 选择『HKEY_Local_Machine』>『SYSTEM』>『CurrentControlSet』>『Services』>『Tcpip』>『Parameters』>『interface』;
3. 在 interface 底下可能有很多的选项,你一个一个的去看,会有一个选项与你的网卡的 IP 相同,那个就是你要挑选的选项啦!然后同样的在该选项上选择『编辑』>『新建』>『DWORD值』之后,建立一个名为『MTU』的DWORD,然后双击修改,选择十进制,填入合适 MTU 值,确定!大功告成!
问题二:我不知道自己的上网方式,如何确定MTU值呢?
ping -f -l 1500 127.0.0.1
C:\WINDOWS>ping -f -l 1500 127.0.0.1
Pinging 127.0.0.1 with 1500 bytes of data:
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 0, Lost = 4 (100% loss), Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
上面的式子中,-l 是 L 的小写(不是 1 喔),1500 是我们要测的 MTU 值,结果出现了 Packet needs to be fragmented but DF set. 这个东西,那表示MTU值太大了,你需要更小的 MTU 值才行!好啦!那假设我们使用 1464 来测试时:
C:\WINDOWS>ping -f -l 1464 127.0.0.1
Pinging 127.0.0.1 with 1464 bytes of data:
Reply from 127.0.0.1: bytes=1464 time=10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Reply from 127.0.0.1: bytes=1464 time<10ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 10ms, Average = 2ms
结果出现了回应了!这表示这一个 MTU 值是可行的!不过,强烈建议找出可行的最大 MTU 值!这样一来,在设定的时候,才可以达到最佳的网速!
找出 MTU 值:利用上面这个方法找到的数值还不是 MTU 喔!由于一些封包上面的问题,上面这个值再加上 28 才是我们所需要的 MTU 值!所以,在上面的例子中,我们所需要的 MTU 值是 1464+28=1492!
一般来讲,设计好本机的MTU值,可以解决部分网站打不开的情况,但是如果你的共享主机或路由器的MTU设置有问题,有时问题仍然存或,或者出现网速过慢的情况。合理的设置路由器与本机的MTU值,就可以完全解决上述问题,使上网速度达到最大化。

LINUX下设置网卡的MTU值
网卡的MTU值可以通过修改设备配置文件来设置。通过ifconfig命令可以查看网卡配置:

ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0D:61:93:55:3E
          inet addr:192.168.0.1  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:386423 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6490 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:203556104 (194.1 MiB)  TX bytes:787293 (768.8 KiB)
          Interrupt:209 Memory:fb000000-0

eth1      Link encap:Ethernet  HWaddr 00:40:F4:98:8E:43
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:185 Base address:0xa000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:36036 errors:0 dropped:0 overruns:0 frame:0
          TX packets:36036 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:20683798 (19.7 MiB)  TX bytes:20683798 (19.7 MiB)
 
或者可以通过ip命令来查看:
# ip link list
1: lo:  mtu 16436 qdisc noqueue
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0d:61:93:55:3e brd ff:ff:ff:ff:ff:ff
3: eth1:  mtu 1500 qdisc noop qlen 1000
    link/ether 00:40:f4:98:8e:43 brd ff:ff:ff:ff:ff:ff
网卡eth0当前的MTU是1500字节,如果要临时更改网卡的MTU值,比如更改为1200,则以root身份执行:

ip link set dev eth0 mtu 1200
如果要使对eth0的配置永久生效,则需要修改/etc/sysconfig/network-scripts/ifcfg-eth0,像下面那样增加MTU=1200:
# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
MTU=1200
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
然后重启网络接口:
 service network restart
或 /etc/init.d/network restart

 

 

一、jumbo frames 相关

1、什么是jumbo frames

Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bytes大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;Jumbo frame 在full-duplex 的Ethernet网络上运行;Jumbo frame定义了一个“link negotiation”协议,来和对端的设备协商,是否对端设备支持使用Jumbo frames;标准的以太网IP报文大小是:1500 bytes,不包含以太网头和FCS的18 bytes(6+6+2+4),如果包含以太网头和FCS,则为1518 bytes;Jumbo frame 一般指的是二层封装三层IP报文的值大于9000bytes的报文。

Jumbo frames的提出背景:在1998年,Alteon Networks 公司提出把Data Link Layer最大能传输的数据从1500 bytes 增加到9000 bytes,这个提议虽然没有得到IEEE 802.3 Working Group的同意,但是大多数设备厂商都已经支持。

2、使用jumbo frames的优点

在数据传输时,由于IEEE的规定最大的帧规定为1,500比特(主机在早期的半双功网络中),所以需要数传输需要经过 数据的切要 --- 传输 ---数据组合 的过程。而使用的最大帧越小,传输包的量就越大,计算量相应会多,而产生的后果是:

a:增加主机的计算量,消耗CPU资源;

b:影响网络传输的速度。

而使用大帧优点自然也不言而喻 ———— 降低CPU计算量、加快数据传输。

二、修改MTU值

上面啰嗦了一大堆,修改帧大小实际需要的操作就是修改MTU(Maximum Transmission Unit)值,即修改最大传输单元。修改方法如下:

1、ifconfig命令修改

 
 
  1. ifconfig ${Interface} mtu ${SIZE} up
  2. ifconfig eth1 mtu 9000 up

这个是最通用的方法,对所有的linux 发行版本都有效。缺点就是重启后失效,需要在开机项中加载。

2、修改配置文件

CentOS / RHEL / Fedora Linux下

 
 
  1. # vi /etc/sysconfig/network-scripts/ifcfg-eth0
  2. #增加如下内容
  3. MTU="9000"
  4. #保存后重启网卡生效
  5. # service network restart
  6. #启用IPv6地址的,修改IPv6 mtu的参数为
  7. IPV6_MTU="1280"

Debian / Ubuntu Linux下

 
 
  1. # vi /etc/network/interfaces
  2. #增加如下值
  3. mtu 9000
  4. #保存后,重启网络生效
  5. # /etc/init.d/networking restart

三、为什么MTU最大值为9000字节

从理论上计算,4 bytes的CRC最大支持12000 bytes大小的字节,超过了就没有办法检查了。另外还有其他一些协议如NFS等的限制。

最后需要注意的是,在经过交换网络设备时,仅仅修改主机端的MTU值是不行的,还需要交换网络设备上开启jumbo frames功能。

四、MTU测试

使用ping命令,-l 指定包大小,-f 选项为通知操作系统不能私自更改该数据包大小

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值