MTU检测
大部分网络应用是正常的,说明网络连接是没有问题的,只有某些网站不能访问,说明是访问这些个网站的时候出现了问题,最常见的问题就是MTU设置不当引起的。 MTU也称之为最大传输单元(Maximum Transmission Unit),是指在网络中传输的数据块的大小。根据TCP/IP理论,不合理的MTU设置,常常会导致网络性能下降,网络连接失效的问题,而某些网站访问不了,就是由于MTU设置不当而导致IP数据包在传输的过程中出现了分片导致的。 因为数据在传输的过程中,会经过很多的中间路由器才能到达访问的网站,如果在路途当中,出现了MTU太小,就会导致数据包被分片拆分,然后在转发。但在转发的过程中,可能会经过不同的路由,导致数据到最终站点时间出现偏差,或者数据在路由转发的过程中丢失,这样就无法在最终站点完成重组(所有分片的数据必须全部到达之后才能重组),进而导致整个数据的丢失。
知道了上面说明的问题的原因,接下来就是解决问题的时候了。首先我们来看看怎样确认一个合理的MTU值。使用Windows自带的PING程序,就可以诊断网站的MTU值。在Windows“ 开始”-“ 运行”,输入“ cmd”然后回车打开命令提示符(Windows8及后续系统可以使用搜索框或者“ Win+X”组合键打开命令提示符。
可以看到,使用PING命令的“ -f”(设置DF标志,也就是禁止IP数据包分片)和“ -l”(指定数据包的大小)参数,就可以诊断网站的MTU了,在我实验的网络环境下,以访问百度为例,经过反复试验,获得的MTU值为 1464。
超过限定的的MTU值,PING程序就会提示“ 需要拆分数据包但是设置 DF”,说明IP数据包需要拆分才能正常发送,但由于我们使用了“ -f”参数,所以路由器不会在进行下一步转发,这也正是我测试的目的。
路由器设置
知道了正确的MTU值,那么接下来就可以设置路由器啦。路由器的MTU设置,通常会在路由器的“ 广域网设置”、“ 上网设置”或者“ Internet设置”之类的菜单里面,一般情况下,路由器都会支持这个参数的调整的。
看官可能会问了,上文中检测到的MTU值是 1464,为什么到路由器设置的是 1492呢? 这里就要再说明一下了,检测到的MTU实际上是数据块的大小,而在TCP/IP网络,还要加上报头的,典型的值是以太网报头 20,如果再加上PPP报头 8,是不是就是 1464+20+8=1492呢?
同理,如果您使用的不是PPP拨号,就不要再加那个 8了哦,因为无论是DHCP自动获取IP地址,还是静态IP地址的联网方式,都是典型的以太网联网方式,就没有PPP拨号所需的 8个字节了。
所以您看到了,通常情况下,PPP拨号上网的时候,典型的MTU值是1492,而DHCP自动模式或者静态IP地址模式下,典型的MTU值是1500。当然,也有些路由器允许设置的MTU值偏小,可能为为了更好的照顾线路而对路由器性能做了一些妥协吧。
计算机设置
如果计算机连接的是路由器,一般是不用对计算机做任何修改的,因为路由器在做NAT转换的时候会进行妥善的处理。但是如果是计算机直接拨号联网,或者直接连接宽带上网(某些运营商可能不是拨号的),没有经过路由器上网的,修改计算机本身的MTU值无疑是更好的解决办法。 当然,如果希望保证更好的兼容性,也可以在连接路由器的情况下,修改一下计算机的MTU值。
在Windows操作系统,可以通过修改注册表完成。打开注册表编辑器(Windows 7及以前版本,可以在“ 开始”-“ 运行”输入“ regedit.exe”打开注册表编辑器,Windows 8及以后版本,可以在搜索框搜索注册表编辑器)。
在注册表编辑器中,切换到HKEY_LOCAL_MACHINE-System-CurrentControlSet-Services-Tcpip-Parameters-Interfaces,找到要设置的网卡(可以通过IP地址信息辨识)。
找到要设置的网卡之后,可以查看MTU值,如果MTU值不存在,则需要手动创建一个DWORD键值,名称为MTU,数值为检测到的MTU值。
需要说明的是,如果计算机连接的是路由器,而路由器是使用拨号的方式联网的,检测出来的MTU值在路由器上面的设置和计算机上面的设置会有点差别哦。因为路由器是拨号的,所以路由器设置的“ MTU值=检测到的MTU值+以太网报头(20)+PPP报头(8)”,而计算机在经过路由器联网的时候,使用的是以太网协议,因此计算机设置的“ MTU值=检测到的MTU值+以太网报头(20)”,注意别混淆了哦。
Linux的设置方式比较简单,直接以管理员身份使用“ifconfig eth0 mtu 1492”命令就可以修改MTU值了,其中,eth0是接口的名称。 Linux命令行设置的MTU值在重启之后会丢失的,如果希望永久性修改,请参照自己的Linux发行版手册修改。
苹果Mac OS X也是可以设置MTU值的,方法是打开“ 系统偏好设置”-“ 网络”,选择要设置的网络接口,然后单击“ 高级”。
在高级设置窗口,切换到“ 硬件”,然后“ 配置”选择“ 手动”,MTU选择“ 自定”,输入要设置的MTU值就可以了。
其他原因
某些网站无法访问也可能是其他原因导致的,这些原因超出了本经验讨论的范围,但为了能更好的排查问题,这里将可能的原因罗列一下,以便于当修改MTU解决不了的时候,更好的进行问题排查。
病毒感染:可能是计算机或者手机感染了病毒,进行一次全面的杀毒清理工作是很有必要的。
hosts文件被篡改:这种情况类似于DNS劫持,但并没有进行完全的劫持,只是对某些网站进行了劫持,查看一下hosts文件是否有访问异常的域名就可以知道了。
DNS劫持:这个是比较彻底的域名劫持,您所访问的网站会完全根据劫持者的指令跳转,这些网站可能存在,也可能不存在,完全取决于劫持者的心情。
网站瘫痪或不可访问:这种情况出现的比较少,但也是可能的,使用 PING命令就可以轻易检测是不是网站本身处在不可访问状态。
优化与分享
本经验是根据实际操作完成,因路由器设置不同,可能会有出入,设置时请以实际路由器手册为准。如果您有任何意见或建议,可以留言提出,我会尽力改正和完善经验,以帮助更多有需要的人。
如果本经验对您有些许帮助,移动手指,点赞支持一下啦,您的支持是书写经验的最大动力哦^^。