MTU是什么?
MTU的英文全称为Maximum Transmission Unit,中文是意思是最大传输单元。MTU就是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
什么时候更改MTU值?
对于一般的路由器设备,最佳的MTU值通常都是默认值。有时,更改MTU值可提高设备工作性能。做起来很简单,但事实上,这样做往往会导致出现其他问题。最好保持MTU不变,除非有以下情况出现:
·当连接不到ISP或者不能使用其他的因特网服务时,且他们的技术支持人员建议更改MTU值。
·当您使用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的标准值。
如何利用Ping命令测试本地最佳MTU值的方法
测试思路:在广域网上,大小超出ISP要求的数据包将无法传输,而路由器则会根据本机MTU值自动将大小不符合要求的数据进行分包处理再进行传输,所以我们可以通过向Internet上的某台主机发送一个定长数据包,并且不允许路由器更改其大小的方式去检查该数据包能否被正常传输,如果数据包小于或等于ISP的MTU值时,传输就能正常进行,而如果发送的数据包大于ISP使用的MTU值时,传输就会失败,这样我们就能通过不断发送不同大小的数据包最终得到ISP端的MTU大小,而这个数据再加上28字节的包头信息就是我们需要的最终MTU值。
测试步骤:
1. 接入网络,并打开“开始”菜单→“程序→附件→命令提示符”。
2. 输入命令“ping –l 14xx –f www.google.com”,这里我们解释一下命令参数的含义:
* –l 14xx参数:发送一个定长数据包,14xx是要测试的包大小,如前所述,ADSL的MTU一般在1450与1492之间,第3步中将每次更换一次该值。上面的命令中,-l是英文字母L的小写。
* –f 参数:通知路由器不能私自更改该数据包大小。
* www.google.com:任意一台Internet上的主机,也可使用其它主机名或IP地址。
观察反馈结果并判断ISP的MTU值。
1) 第一次发送测试包,包长1492
提示数据包过大,需要分包,因此判断该数值(1492)大于ISP的MTU,应降低包大小。
2) 第二次发送测试包,包长1480
将数据包大小降为1480,提示数据包过大,因此判断该值(1480)仍大于ISP的MTU,还应继续降低。
MTU,即Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元。设置合适的MTU值可以解决“部分网站打不开”、“上网速度慢”等问题,并且可以适当提升上网速度。 设置多大的MTU值取决于你的上网方式,不同的上网方式支持不同的MTU,下面列出了一些上网方式的MTU值: EtherNet(一般上网方式,默认值):1500 PPPoE/ADSL:1492 Dial Up/Modem:576 问题一:知道了我的上网方式,如何设置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值,如何设置最快最好?
from:http://51fashion.blog.51cto.com/941555/228975找出 MTU 值:利用上面这个方法找到的数值还不是 MTU 喔!由于一些封包上面的问题,上面这个值再加上 28 才是我们所需要的 MTU 值!所以,在上面的例子中,我们所需要的 MTU 值是 1464+28=1492! j一般来讲,设计好本机的MTU值,可以解决部分网站打不开的情况,但是如果你的共享主机或路由器的MTU设置有问题,有时问题仍然存或,或者出现网速过慢的情况。合理的设置路由器与本机的MTU值,就可以完全解决上述问题,使上网速度达到最大化. 1. 基础知识 我们知道, 数据在网络上传输时, 要经过一段一段的链路。当数据从某一段链路的一端传到另一端的过程中, 需要考虑的是数据链路层协议, 在这一层, 我们观察到的数据包(PDU: Packet Data Unit)称为MAC帧(MAC Frame), 不同的数据链路层协议, MAC Frame的格式也不同, 但大致都会有目标MAC地址、源MAC地址、长度/类型、数据(有效载荷: Payload)这几个字段。 对以太网而言, 采用的是数据链路层协议是基于IEEE 802.2/802.3, 但与IEEE 802.2/802.3略有区别. 查一下802.3协议中MAC帧格式部分, 就会发现上面提到的MAC帧中的数据(有效)字段的长度范围是46-1500个字节. 那么, 当链路层的上一层-IP层所要传输的IP数据包(包括IP Header)大小超过这个长度范围时, IP数据包就必须分成多片传输, 这个过程就是分片(Fragmentating), 其中分割出来的每一个片断就是一个Fragment. 2. MTU与Fragment 上述链路层这种对超过其协议定义的最大数据字段长度时就进行分片的特性, 就称为MTU(Maximum Transmission Unit). 不同链路层协议, MTU值也不同, 我们已经知道, 对以太网, MTU是1500字节, 而对令牌环(Token Ring)网, MTU是4482字节. 3. IP数据包中与分片相关的字段(Fragmentation Fields) IP数据包在封装时, 在IP头的第8-9个字节(16bit)中, 存放关于分片的信息. 其中前3个bit表示分片的状态, 后13个bit表示当前片断在分片之前的整块待封装的数据包中的偏移量(因为IP数据包的最大可能长度为16bit, 而这13bit无法表示16bit的范围, 故实际使用时, 偏移量的计算是用这13bit的值乘8(3bit), 以实现表示16bit的范围). 3.1 不分片标记(Don't Fragment Flag) IP头第8-9字节从左往右的第2bit表示当前IP数据包是(1)否(0)不分片, 缺省值为0, 就是不不分片, 即允许分片. 因为默认允许分片, 所以我们平常使用Ping命令时, 加参数-l 65500 Ping一台机器也不会有问题. 3.2 是否有后续分片标记(More Fragments Flag) IP头第8-9字节从左往右的第3bit表示当前数据包里的数据是否为某块数据的最后一个分片, 若为0, 则说明当前数据包内的数据没有分片或者是最后一个分片, 若为1, 则表示后面还有属于同一块数据的分片. 4. 实战 说了半天感觉太抽象, 我们来些看得见摸得着的东西. 4.1 用Ping测试MTU(在以太网环境中) 开个命令行窗口, 输入命令: ping 192.168.0.1 -l 2000 -f 出现提示: Pinging 192.168.0.1 with 2000 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命令的-f参数作用是"Set Don't Fragment flag in packet", 也就是在将IP头里的"Don't Fragment Flag"位设置为1, 也就是不允许分片, 但是我们又用Ping命令的-l参数指定了发送的数据包的大小为2000字节, 显然超过了以太网的MTU-1500字节. 所以数据包不能通过, 并且返回了上述错误信息: 数据包需要分片但是DF(Don't Fragment)标记被设置了. 再输入命令: ping 192.168.0.1 -l 1500 -f Pinging 192.168.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. 奇怪, 已经把发送数据包的大小改为MTU值1500, 怎么还不能通? 减小参数值, 重输命令: ping 192.168.0.1 -l 1400 -f Pinging 192.168.0.1 with 1400 bytes of data: Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128 Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128 Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128 Reply from 192.168.0.1: bytes=1400 time<10ms TTL=128 好, 这次可以通过了.反复调整参数值, 看看可以通过的最大Ping命令-l 参数值是多少. 经过反复试验, 最后发现, 最大可以通过的Ping命令的-l参数的数值是1472. 这个1472是和预期的MTU值1500差了28个字节. 这28个字节是怎么来的呢? 4.2 协议分层封装 我们知道, 在MAC帧的数据(Payload)字段, 封装(存放)的是上层(IP层)的IP数据包, 而IP数据包的格式是IP Header + IP Data(Payload). 在我们用Ping命令的这个例子中, IP数据包内的IP Data字段内封装的是ICMP协议数据. 我们来回顾一下MTU的含义: MAC帧内的数据(Payload)字段的最大长度, 也就是说它所封装的IP Header + IP Data两者长度之和最大为1500字节, 而IP Header的最小长度为20字节, 所以IP Data的最大长度就是1500-20=1480字节, 离我们试验的1472字节已经比较接近了. 再查查ICMP协议数据的具体格式, 发现在Ping命令用到的ICMP Echo Request/Replay报文中, 在ICMP Data之前, 有几个字段共占用了8个字节, 分别为: Type(1byte), Code(1byte), Checksum(2byte), Identifier(2byte), Sequence Number(2byte), 这几个字段我们可以称之为ICMP Header. 好了, 1480-8=1472, 和我们的试验结果对上了. 可以发现, 我们使用Ping命令时, -l参数所指定的数据包大小, 是指的ICMP报文中的ICMP Data字段的长度, 不包括ICMP Header, 更不包括IP Header.
本文出自 “网络技术天地” 博客,谢绝转载!