PDA

查看完整版本 : 【求助】MTU最大传输单元是具体什么概念


ggkk
2008-05-25, 01:34 PM
如题,具体在网络应用中有哪些意义?实际网络使用中能影响到什么?

tank.net
2008-05-25, 08:45 PM
这种问题最好的老师是google。

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 值:利用上面这个方法找到的数值还不是 MTU 喔!由于一些封包上面的问题,上面这个值再加上 28 才是我们所需要的 MTU 值!所以,在上面的例子中,我们所需要的 MTU 值是 1464+28=1492!

一般来讲,设计好本机的MTU值,可以解决部分网站打不开的情况,但是如果你的共享主机或路由器的MTU设置有问题,有时问题仍然存或,或者出现网速过慢的情况。合理的设置路由器与本机的MTU值,就可以完全解决上述问题,使上网速度达到最大化。

tank.net
2008-05-25, 09:01 PM
上面例子使用ping命令时,有一个关键的参数-f,加上以后表示不分包。其实给你举两个简单的例子你就明白了:

例子1:验证以太网的MTU=1500

你在公司两台局域网内的机器上互ping,比如一台是192.168.0.10,另一台是192.168.0.11。你在10上ping 11:

ping -f -l 1472 192.168.0.11

这条命令的意思是发送字节数是1472的ping数据包,而且不分包。注意由于ping协议本身需要占用28字节,所以最终的数据包大小是1472+28=1500。1500刚好是以太网的MTU,也就是说发送的数据包达到(没有超过)MTU时,这个数据包仍然可以发送。

如果执行下面这条命令:

ping -f -l 1473 192.168.0.11
这时ping不通,会返回一段你认为是鸟语的文字。这段鸟字的意思就是数据包需要拆分。因为这时实际数据包的大小是1473+28=1501,已经超过了以太网的MTU。

例子二:验证ADSL线路的MTU是1492

ping -f -l 1464 218.22.221.89
这时可以通。这时最大的数据包是1464+28=1492,刚好达到(没有超过)ADSL线路的最大传输单元。

如果改一下:
ping -f -l 1465 218.22.221.89
这时那段熟悉的鸟语又出来了。由此验证:ADSL的线路的MTU=1492

ggkk
2008-05-25, 09:09 PM
你说的那些鸟语我今天已经成功的使他们在我电脑上显示出来了,仿佛来自神明的符文。
以上的我都知道,我只是想知道这个值的实际意义是什么,多大程度上影响我们的上网情况!就是说如果在ADSL的情况下我把MTU设置成1500会出现什么情况?

tank.net
2008-05-25, 09:23 PM
简单的说:

1、以太网的MTU是1500,这个数值不是由用户设的,而是作为一种公约和技术标准被固死在网卡上。如果你修改注册表来改MTU,你只能往小改不能往大改。但你往小改又会影响你的网络性能。比如一个明明可以一次发送的数据包被拆成两次以上来发送。一般情况下我们不需要修改注册表的MTU。因为你不设MTU时,你本机的MTU是由你网卡的驱动程序来管理的。

2、如果你把ADSL的MTU设为1500,你会出现一会能上网一会又上不了网的情况。因为ADSL的MTU是1492。当你的真实数据包小于1492时可以顺利通过。但你的数据包介于1493-1500之间时,这个数据包就无法通过你的MODEM,这样你就上不了网。

tank.net
2008-05-25, 09:30 PM
什么情况需要修改MTU?

其实ADSL上网用户最好都修改一下MTU,设为1492。原因如下:

从电脑到猫这一段是以太网,MTU是1500
从猫到电信局端是ADSL线路,MTU是1492

如果一个数据包是1493,在电脑上会一次性发送到猫上,但猫会把这个数据包拆成1492+1来发送,增加了猫的负担。那么可以直接把电脑到猫这一段的MTU改为1492,这样电脑拆包时直接以1492作为标准,减轻了猫的负担。

但以上做法在实际上到底能带来多大性能上的提升,貌似还没有无聊人去作这个测试。这个性能提升只是理论上的。而且把MTU改为1492以后,在局域网的传输时又会带来理论上的性能下降。

tank.net
2008-05-25, 09:33 PM
貌似老会说的还是太过学院派了。再简单的讲:

你把MTU改为1492,你上网的性能可以提高。但你局域网对拷文件的速度就会下降。

以上说法仍然属于理论情况。

ggkk
2008-05-25, 09:44 PM
貌似俺明白了!