测试一个网络MTU值的操作步骤

对于以太网环境下UDP传输中的数据包长度问题,首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层。
其中以太网(Ethernet)的数据帧在链路层,IP包在网络层,TCP或UDP包在传输层,TCP或UDP中的数据(Data)在应用层,它们的关系是:
数据帧{IP包{TCP或UDP包{Data}}}
 在应用程序中我们用到的Data的长度最大是多少,直接取决于底层的限制。我们从下到上分析一下:
 在链路层,由以太网的物理特性决定了数据帧的长度为(46+18)-(1500+18),其中的18是数据帧的头和尾,46+18=64是以太网帧的最短帧长,1500+18=1518是最大帧长。也就是说数据帧的内容最大为1500,即MTU(Maximum Transmission Unit)为1500;
(可是为什么我用wireshark抓下的包看到的帧头部是14字节,木有校验位4位?!,最短帧长是62?!)
 在网络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480;
 在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;
 所以,在应用层,你的Data最大长度为1472。
 (当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据报重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃)。
 从上面的分析来看,在普通的局域网环境下,UDP的数据最大为1472字节最好(避免分片重组)。
 但在网络编程中,Internet中的路由器可能有设置成不同的值(小于默认值),Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

MTU不同网络的大小

EtherNet(一般上网方式,默认值):1500
PPPoE/ADSL:1492
Dial Up/Modem:576


顺便说一句,个人电脑修改MTU无任何意义! 下面是方法。

1、本地MTU值大于网络MTU值时,本地传输的数据包过大导致网络会拆包后传输,不但产生额外的数据包,而且消耗了“拆包、组包”的时间。

2、本地MTU值小于网络MTU值时,本地传输的数据包可以直接传输,但是未能完全利用网络给予的数据包传输尺寸的上限值,传输能力未完全发挥。

这样我们就知道,所谓合理的设置MTU值,就是让本地的MTU值与网络的MTU值一致,既能完整发挥传输性能,又不让数据包拆分。

接下来最重要的就是要找出对于你的网络环境来说MTU多少才是合理的。


方法如下:

1、按Win+R组合键,调出“运行”菜单,输入“cmd”然后回车





2、在出现的“命令提示符”窗口中输入“ping -l 1472 -f https://www.360docs.net/doc/d612600478.html,”然后回车

含义:

ping:发起一个探测请求;

-l(L的小写)

:限制探测包大小;

1472:包大小为1472字节;

-f:禁止路由器拆分数据包

https://www.360docs.net/doc/d612600478.html,:设百度为探测目标

(你问我为什么不用Google做目标?考虑到Google时不时被墙,还是算了吧。。)



3、这时有2种情况:

(1)、如果收到了回复,那么说明你的网络允许最大MTU值就是1500字节,与系统默认值相同,只需要将路由器的MTU值也设置为1500即可;





(2)、如果出现需要拆分数据包但是设置 DF。或是Packer needs to be fragmented but DF set.的提示,那就说明数据包大小超过了网络限定的MTU大小。需要减小探测包大小再次尝试。(为了截效果图,我将探测包改为1473了)





4、按“上箭头”恢复刚才输入的命令,然后以5为跨度减小包大小为1467字节,再次回车探测。



5、这时同样也有两种可能:

(1)、如果有返回,说明数据包小于MTU限制,就将包大小+3再次探测,如果+3之后没有返回,那就以1为跨度降低数据包大小进行探测。

(2)、如果还是没有返回,就继续以5为跨度减小包大小,直至有返回后进行5(1)中的操作。



6、直至你发现数据包-1后,有了返回,就说明你探测到了MTU允许的准确数据包大小。(例如从1465降低到1464就有了返回,那么允许的数据包大小就是1464)



7、不过上面得到的值还不能设置为操作系统或路由器的MTU,你找到的数据包大小需要加上28字节的“数据包报头”,才是完整的数据包尺寸。

(例如:探测到的数据包大小是1464,那么加上28字节,最终MTU=1492字节)



8、最后,只需要将路由器和操作系统中的MTU值设置为你得出的结果即可。



路由器设置方法见路由器说明书!建议使用“Windows优化大师、超级兔子魔法设置、鲁大师”等软件修改操作系统的MTU。

以下是较复杂的方法:



(1)、XP操作系统设置方法:

1、 按Win+R组合键,调出“运行”菜单,输入regedit,然后回车;

2、 选择“HKEY_Local_Machine>SYSTEM>CurrentControlSet>Services>Tcpip>Parameters>interface”;

3、在 interface 中下可能有很多项,需要逐个观察键值,会有一个项与你的网卡IP一致,选中该项;

4、然后在该项上点击右键,选择“编辑>新建>DWORD值”,然后在右侧将其命名为“MTU”;

5、右键点击MTU,选择“修改”,在弹出的窗口中选择“十进制”,填入你得出的合理MTU值即可。



(2)、Vista、Win7操作系统设置方法:

1、进入系统盘:\Windows\System32\找到cmd.exe,右键“以管理员身份运行”;

2、在出现的“命令提示符”窗口中输入“netsh interface ipv4 show subinterfaces”并回车来查看当前的MTU值

3、接下来输入“

netsh interface ipv4 set subinterface "需修改的连接名" mtu=你得出的合理值 store=persistent”并回车即可

例如:“netsh interface ipv4 set subinterface "本地连接" mtu=1492 store=persistent”
参考资料:https://www.360docs.net/doc/d612600478.html,/?p=1326


相关文档
最新文档