加载中…

加载中...

更改MTU减少拆包降低ping的方法(试行)

转载 2015-10-30 11:45:48

首先声明:本人没有任何网络工程和系统工程的基础,一切都是出于兴趣

​背景介绍:如果某一款游戏的服务器设在外国地区,而本地运营商又千方百计对外服加以限制,就会出现所谓的“裸连无力”现象(延迟巨大,丢包严重,甚至根本进不去服务器),必须要挂VPN来解决。为此我参考了一篇百度贴吧的帖子http://tieba.baidu.com/p/3916843330,以及这一篇博客http://blog.chinaunix.net/uid-790245-id-2037490.html并对其中的一些细节做了小小的研究,后加上一些自己的理解,打算写一篇教程详细地总结通过更改MTU(最大传输单元)的方法来躲过运营商的拆包,从而达到减少延迟和丢包的现象。

注意:教程只是试行,如果出现一些严重的卡顿或者网络情况恶化,请恢复成以前的设置(后面会写到具体方法)

注意:此方法只能优化延迟和丢包,对于网络波动引起的掉线、网页失效、GFW屏蔽等问题无能为力​

正文:

什么是MTU?MTU就是Maximum Transmission Unit​,是网络上传送的最长的数据包的长度。它指定了网络中可传输数据包的最大尺寸,以太网的默认设置MTU是1500字节,超过此大小的数据包就会将多余的部分拆分再单独传输(比如我设置MTU为1500,当需要发送3080长度的数据包,就会拆分成三份)。就像货车通过限高的桥洞一样,货物高度超过限制高度了,就需要卸下一些货物,分多批通过限高路段​。

Windows默认的MTU设置是1500,但是显然,不同的网络接入方式,不同地区的网络运营商,甚至不同的路由器,它们的MTU值都可能是不同的​。那么什么情况下MTU值是合理的呢?我们先来看看不合理的吧——1、本地MTU值大于网络MTU值时,本地传输的数据包过大导致网络会拆包后传输,不但产生额外的数据包,而且消耗了“拆包、组包”的时间。(被迫叫来更多的卡车来装载货物)2、本地MTU值小于网络MTU值时,本地传输的数据包可以直接传输,但是未能完全利用网络给予的数据包传输尺寸的上限值,传输能力未完全发挥(多辆卡车并没有装满,本来2辆车可以装走,但是因为MTU设置过小,被迫多叫来一辆车,造成数量的浪费)。由此易知,合理的设置MTU值,就是让本地的MTU值与网络的MTU值一致,既能完整发挥传输性能,又不让数据包拆分。

那么如何检测网络的MTU值呢?接下来就是本文的核心部分

其实用到的命令非常简单,就是为我们所熟知的ping命令,只不过我们需要加一些参数

不带参数的单纯ping命令,比如: ping www.baidu.com  只显示与远程计算机或本地计算机的连接情况,默认向百度的服务器发送4个报文​。

有人要问了:你不是要寻找MTU么?只ping服务器肯定不行吧?是不是要在ping后面加一些命令参数?​

正解,我们需要用到的命令有两个

-l 指发送包含由 length 指定的数据量的ECHO数据包,就是指发送数据包的大小,默认为 32 字节,最大值是 65527字节(注意是小写的L不是数字1)

-f 指在数据包中发送“不要分段”标志。使用-f,数据包就不会被路由上的网关分段,是一种快速方式Ping,使得Ping输出数据包的速度和数据包从远程主机返回一样快,或者更快,达到100次/s。在这种方式下,每个请求用一个句点表示。对于每一个响应打印一个空格键

看到这里也许大家就豁然开朗了——我派出4辆卡车,让他们搭载我指定数量的货物,并且强制禁止卸货叫车,看看能不能过去不就好了~如果过得去的话,说明可能还没满载,还可以多带一点;如果过不去,说明超载了,那就减少一点,最后用折半查找法摸清具体的点,从而在不被卸货多叫车的情况下达到效率最大化,简直6666得飞起

接下来是具体的操作方法

我们先来看一下网关部分有没有限制吧

S0

用管理员身份运行命令提示符

输入

ping -f -l 1472 192.168.0.1

有人要问了:为什么是1472而不是上面提到的1500?

因为数据包报头的长度是28字节

数据包报头——网络协议通讯中,被附加到用于控制信息的运载和传输的数据包前面的定义位长度的特殊保留字段。当数据包到达其目标时,因为该数据包是以每个协议层的对应相反顺序处理和解包的,所以该字段将被分离并丢弃。

哈?那不就是垫在货物底下的棉花之类的?其实更像是账单和货运单之类的2333

ping -f -l 1472 192.168.0.1的结果如下:

ping网关的结果

​那么1473长度如何?

数据包内容加到1473

​1472+28=1500 1473+28=1501

看来网关部分的限制就是1500,与默认值一样,那就不管他了

接下来是检测运营商的限制,我们就需要用上述命令来ping外网服务器

S1

还是用无辜的度受做实验

注意: "请求超时" 等价于 "​来自XXX的回复:需要拆分数据包但是设置DF"

ping -f -l 1472 www.baidu.com

ping外网的结果

​OMG!请求超时就是说“卡车不让过”!那就调低一些吧

1400试试看

ping -f -l 1400 www.baidu.com​

1400还是不行!


然而依旧是超时的(不给过),那就再大幅调低一些,来个700吧

ping​ -f -l 700 www.baidu.com

700可以了,那么说明合适长度肯定位于700~1400之间

​啊给过了!我终于看到了胜利的曙光!

但是这个肯定不是MTU的值,应该还可以更大一些,那么我们来摸索上限

(十年后)

经过作者的不断努力(折半查找也很累),确定了当数据包的长度为996时达到阀值,增加到997时便请求超时,于是我们可以​愉快地开始设置啦

注意:每个运营商的限制均不同,请灵活运用折半查找法

S2

好了,我们来查看一下所有网络连接的情况

netsh interface ipv4 show subinterfaces

展示了所有连接的MTU情况 

由此可见我们需要修改的是本地连接的MTU

S3

netsh interface ipv4 set subinterface "本地连接" mtu=1024 store=persistent

注意,此处为996+28=1024,加上报头以后的长度才是我们需要设置的值,不然还是要拆包

设置完毕~

​OK大功告成,而且这个是无需重启的~现在不用加速器打开你的游戏试试看吧,另外,网页的浏览速度也会加快10%~15%(体感)

问题:如果修改了之后一些网页打不开或者网络环境恶化什么的怎么办?

​将S3中的改动复原即可

netsh interface ipv4 set subinterface "本地连接" mtu=1500 store=persistent 即可

由此,教程全部结束

ps:如有问题欢迎来讨论​

pps:我真的不是班门弄斧​QwQ

----------------------------------------------------------------------------------------​

10月30日 19:00更新​

有朋友向我反映这种情况

此种情况我一开始以为是网关受限,后来发现是他ping错了...192.168.0.1不是他IP所在的网关2333

阅读(0) 评论(0) 收藏(0) 转载(0) 举报/Report

评论

重要提示:警惕虚假中奖信息
0条评论展开
相关阅读
加载中,请稍后
鏂囧垁瀵
  • 博客等级:
  • 博客积分:0
  • 博客访问:4,604
  • 关注人气:0
  • 荣誉徽章:

相关博文

推荐博文

新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有