分享

MTU检测

 永定河 2011-01-12
检测MTU,设定适合您的MTU值


     一般情况下,我们上网不必考虑MTU的问题,但如果你上网有时某些网站打不开,某些网站打的开,或者升级ISP的网络速度后,客户机上网速度不升反降,则可以考虑检测一下自己的MTU值,设定最适合自己的MTU了。
                                                                                                            ------ICERJOE 2007/02/02

一、什么是MTU。
MTU: Maxitum Transmission Unit 最大传输单元

MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打俺PP)

PPPoE: PPP Over Ethernet(在以太网上承载PPP协议)

先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC

  由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。

  (注:小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生)

  由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes +SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。

  当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。

  对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是

  降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一

  个标签:DF(Donot Fragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。

  对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。

  对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。

  花开两朵,各表一枝,说完MTU的故事我们该讲讲今天的第二个猪脚---PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了, PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

  为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以就出了这么一个怪胎:PPPoE。(有关PPPoE的详细介绍参见V大以及本站其他成员的一些介绍文章,我就不啰里啰唆的了)

  PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。

  如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。

  这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。

  当然对于TCP应用而言还有另外的解决方案。

  马上请出今天第三位猪脚:MSS。

  MSS最大传输大小的缩写,是TCP协议里面的一个概念。

  MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值 TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为 1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。

  介绍完这三位猪脚s

  我们回过头来看前言里面的那个问题,我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss 1452来解决。

  当然问题也可以通过修改PC机的MTU来解决。

二、检测自己的MTU
在我们常用的Windows XP操作系统中,系统默认的MTU值为1500,这是一个标准以太网的设置值,并不适合宽带网络,而一般ADSL宽带的MTU在1450与1492之间,系统与ISP之间MTU的不符就会直接导致数据在网络传输过程中不断地进行分包、组包,浪费了宝贵的传输时间,也严重影响了宽带的工作效率。这就要求我们必须将本机MTU值设为与ISP所使用的MTU值一样后才能快速浏览网页、下载数据。但是,每个地区的ISP所使用的MTU值都不相同,同时ISP也会不定期地更改局端MTU大小,这给我们设置本机MTU带来了很大的不便,那么我们怎样才能知道ISP的MTU是多少呢?其实,我们平时最常用的Ping命令就能很方便地帮我们测试出本地ISP的MTU大小,如果大家感兴趣,就请跟随笔者一起来看看吧。

  测试思路

  在广域网上,大小超出ISP要求的数据包将无法传输,而操作系统则会根据本机MTU值自动将大小不符合要求的数据进行分包处理再进行传输,所以我们可以通过向Internet上的某台主机发送一个定长数据包,并且不允许操作系统更改其大小的方式去检查该数据包能否被正常传输,如果数据包小于或等于ISP的MTU值时,传输就能正常进行,而如果发送的数据包大于ISP使用的MTU值时,传输就会失败,这样我们就能通过不断发送不同大小的数据包最终得到ISP端的MTU大小,而这个数据再加上28字节的包头信息就是我们需要的最终MTU值



  测试
      输入命令“ping
–f –l 14xx www.163.com”,这里我们解释一下命令参数的含义

  * –l 14xx参数:发送一个定长数据包,14xx是要测试的包大小,如前所述,ADSL的MTU一般在1450与1492之间,比如ping -l 1450 -f www.163.com。“l”是“L“的小写,不是1。

  * –f 参数:通知操作系统不能私自更改该数据包大小

  * www.163.com:任意一台Internet上的主机,也可使用其它主机名或IP地址

   观察反馈结果并最终判定ISP的MTU值。

三、设定MTU
     设定
你的网关设备,比如路由器接入,可在其上指定MTU的大小。也可以在操作系统利用相关软件或修改注册表解决MTU的修改。系统中修改如下:
Windows 98:
  1. 在 『开始』>『执行』中,键入,会出现一个大框框;
  2. 选择:『HKEY_Local_Machine』>『System』>『CurrentControlSet』>『Services』>『Class』>『NetTrans』>『000n』
  上面最后一个数据是 000n,那个 n 指的是数字,以我为例,在 NetTrans 底下有两个数字,分别为 0000 与 0002,若按下 0000 会显示我的 Gate Way 以及我的网路卡的 IP 项目,至于 0002 则没有我的网路卡的相关资讯,所以 0000 那这一个就是我的网路卡介面啦!请依你的情况选择!
  3. 选择你的网路卡介面后(以我为例,按一下 0000 那一个机码),按下『编辑』>『新增』,然后选择增加『DWORD』值;
   

  4.将新增的机码取名为『MaxMTM』,并且在新增加的那个机码上面按右键,选『修改』,会出现如下画面,选择『十进位』后,输入刚刚我们找到的那一个 MTU 值:
   
  5.改完之后你应该会看到如下的画面喔!那就是成功了!
   
  Windows 2000:
  1. 在 『开始』>『执行』中,键入,会出现一个大框框(注意,也有可能是 regedit32 这个执行档,请依你的机器来作业);
  2. 选择『HKEY_Local_Machine』>『SYSTEM』>『CurrentControlSet』>『Services』 >『Tcpip』>『Parameters』>『interface』,有点像下面的图示:
  
  3. 在 interface 底下可能有很多的介面,你一个一个的去看,会有一个介面与你的网路卡的 IP 相同,那个就是你要挑选的介面啦!然后同样的在该介面上选择『编辑』>『新增』>『DWORD值』之后,建立一个名为『MTU』的机码,然后选右键『修改』,选择十进位,填入我们刚刚找出来的 MTU 值!大功告成!
备注:是要进行网关设备更改还是客户操作系统中更改:如果你测试MTU的目标是外网,而且测试的机器是直接连到外网,中间没有任何路由器或拨号等设备,如需要则直接更改系统的MTU;如果测试的机器和外网间有路由器或其他拨号设备,则先不用路由器或拨号设备,直接用单机连外网测试后,更改路由器或拨号设备的MTU。如果操作系统的默认MTU和测试的结果不一样。最好操作系统也更改。

XP MTU 更改:

http://support.microsoft.com/kb/826159/zh-cn

http://support.microsoft.com/kb/183229

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多