主题:【原创】不能访问一些网站的妖异情况,MTU -- 铁手
最近碰到一个很妖怪的情况:在家里的笔记本能访问很多网站,但是想访问一些网站的时候,居然总是返回找不到服务器的错误信息。其中也包括目前做测试用的 www.herewp.com 这个网址。
web 访问不到,ping也不通,域名服务器也不能访问。以为是域名服务器有问题,但是从远处其他的服务器去ping的时候,网站和域名服务器都可以ping 到。一时之间,不知如何是好。
我用的是att的最基本的dsl服务,通过路由,无线的方式接入。速度一般比较慢,看看文字没什么大问题,看视频有时候会感觉到速度的限制。
到网上查了查,居然查到一个我认为非常妖怪的原因:MTU,maximum transmission unit。这个数值决定了网络传输时候每个包的字节上限。记得以前用dial-up的时候经常有很多技术文章讲怎么来优化这个值来让拨号服务显得快一些。一般情况下,这个值越大也意味着传输效率越高,但是这个值越大,每个包所占用的时间也越长,也会导致问题。
用惯了高速上网后,从来就没关心过这个值。可现在看来,这个值的设定,是我不能访问某些网站的原因。于是试着改了一下这个值,然后再去访问那些网站,结果,可以上了。
我现在还没明白,为什么这个值的设定会导致某些网站不能上,某些网站能上呢?是和网站的设置有关系么?那为什么我能访问ccthere.com,就不能访问herewp.com呢?还请方家解疑。
就顺便说一下怎么看和怎么改动这个MTU吧。
我的laptop是windows vista (速度好慢)。先以admin的身份运行command prompt,
Programs > Accessories > Command Prompt >
Right Click on Command Prompt > Select "Run as administrator"
然后在里面运行
netsh interface ipv4 show subinterfaces
可以看到各个链接方式的MTU值,也可以看到链接方式的名称,比如“Wireless Network Connection”。我的是 wireless,然后:
netsh interface ipv4 set subinterface "Wireless Network Connection" mtu=1430 store=persistent
完了以后再上那些原先打不开的网站,大吉了。
这样在网络传输的时候经过某些MTU设置比较小的网络设备的时候,你发出的大包就会被分解后传递,这样会导致增加丢包率,于是结果就是某些网站不能被访问。
基本可以确定是原先的MTU值超过了链路上的某个网络设备的限制,现在的1430不一定就正合适,但已经不会影响使用了。这种情况个人用户一般很少碰到,但公司的LAN和WAN中屡见不鲜,老大当时应该直接问老萨,他肯定能找出一堆相似案例来……
设的高一些反而可以用。
不过现在情况有变。刚发现重新启动后那个值又变回老的值,而这次,原先不能访问的网站,现在又可以访问了。晕。
TCP也会增加丢包率吗?TCP丢了应该会重发,UDP丢包可能性大一点,
如果是TCP的话,是不是丢包次数多了,也会放弃链接?
数据包需要在通过网络设备时做重组,看不同厂商的策略,有些在碰到过大的包会直接丢弃,设置的小反而导致不能访问的还没见过。
ping也可以自定义包大小的,可以先在laptop上设置大些,再试试看多大的才可以正常通过,另外在laptop前面就是adsl router,那上面的mtu才是最终传到互联网上的大小限制啊。
我觉得这不太象是MTU的问题, 因为:
1. 如果用浏览器访问www.herewp.com的话, 本地发往服务器的应该只有TCP链接初始化和http的"get"这几种IP包. 这些包应该都不大, 一般不会超过路径中任何一段的MTU.
2. 如果无法访问www.herewp.com之前ping不通, 可以正常访问后就可以ping通了的话, 就更不会是MTU的问题了. 如果ping命令不加指定包大小的的参数的话, 缺省好象是64(还是32?)字节, 绝对不会因为MTU而无法ping通.
感觉还象是local DNS的问题.
登录到远程服务器上去ping的时候, 域名解析是通过远程服务器的DNS server完成的, 跟本地的local DNS server不一样. 你的DNS server应该指向的是ISP提供的local DNS server吧. 如果是刚刚启用的域名, 会不会是因为local DNS server里还暂时没有记录, 所以域名解析失败.
如果我上面的猜测是正确的, 现在无论MTU怎么设置, 应该都不会影响正常访问www.herewp.com了.
按说MTU小是不会导致被丢弃的。"重新启动后那个值又变回老的值"可能是由于你安装了某些优化TCPIP的软件每次自动启动。
有可能是这样的原因(确实相当妖):
你的第一DNS服务器开始工作正常,但某次被调整了MTU设置,但该设置与其上级DNS服务器不匹配,导致其没法进行新的DNS查询而只是利用以前的缓存给你PC提供DNS解析,而其缓存里没有herewp.com的值。所以你一直没法访问herewp.com。
但你把PC的MTU调高后,你的第一DNS服务器直接丢弃PC发过来的DNS查询包了,所以你的PC只好查询第二DNS服务器,并得到结果后记入缓存。所以以后你无论如何调整MTU,都可以访问herewp.com了。
可能你那个Wireless Connection的信号不太好,或者某段路由不稳定.
MTU是Maximum transmission unit的缩写,在Internet协议里指IP包的最大长度.IP header的长度是固定,这样IP包理论上越大越好(分摊固定成本).但是,IP包大了有一个问题,万一有一个字节出错就得全部重传.假设出错率为1000个字节里有1个,那么当IP包的长度为1300的时候,从概率上讲几乎每个包都会被重传.对于TCP来说,这就意味着timeout的错误.
MTU是个很有意思的东西,多了少了都不好.IPv6里对它有更好的支持.
我家的无线路由器也出现了特定某些网站访问不了的问题,换了个路由器就好了。
说实话,对于大多数网络来说,碰上要动MTU的可能性真的不大.
WINDOWS下的话,可以测试看合适的MTU
ping XXX.com -l -f 1430
然后把这个1430一点一点往上加.如果真的有MTU的问题,到某个数字时echo reply就会提示说MTU过大了.
如果老大用这样的测试复现出问题的话,才能证实MTU有问题...
当时我也以为是DNS服务器有问题。这个域名是在 godaddy.com 那里注册的,也就顺便用了它们的域名服务器。于是就想到godaddy.com上去看看,结果发现 godaddy.com 也没法访问。以为是 godaddy.com 宕掉了。想想也不太可能,就远程登陆到别的服务器,从那里ping 了一下,结果是好的。这才确定是我这里的问题。
当时的确是改了本机的mtu就好了。很多人说可能是路由的问题,再想想,我现在觉得最大的可能是att的域名服务器当时有问题。只是这么凑巧我改了本机的MTU,它的域名服务器也正常了。
我用的是ATT的DSL,可能是在它们那里的域名解析出现了什么问题。就是凑巧了些,我改了MTU,域名解析也恢复正常了。
前几年,一个奇怪的现象:
访问网页很快,下载很快,在线看看电影什么也都没问题。但是,在某些网站回帖、评论的时候却速度非常慢,经常失败。
怀疑是上行问题,但是上传文件也没问题。
因为刚换了路由器,所以就重点锁定路由器。
现象古怪,想不出原因,就用暴力法。
把路由器所有可能的参数都试着改一改。试到MTU的时候,MTU值稍微改小了一点,万事大吉
记不清楚当时测试的具体MTU值了,只记得默认设置是1500。
1500是链路层MTU,也就是IP数据报的长度限制,这是由以太网物特性决定的。
对硬件不了解,网络方面的知识这两年没怎么碰,我猜着说:
发现我用的这款路由器的后续批次的默认MTU设为1480。
如果不是巧合的话,1480正好是除去报头的IP数据区最大长度。莫非是这款路由器存在混洧了IP数据报总长度和有效数据长度的bug?这是我乱猜的,差不多很懒,没花时间分析。
记得以前互联网的事实标准是MTU是576,听说现在的宽带有1450一说。这样的话,你的1430也正好是IP数据报数据区的限制长度,怀疑有某种关联
MTU设置的大小,理论上说只和传输效率相关,不应该存在这种严重影响。我能猜到的:
可能路由中的某环节,为了减轻处理压力,设置为将大于某个值的包做丢弃处理。
你的情况比我的情况还好一些,是必然失败,而我的情况是速度变慢,有时成功,有时失败
相当怪异,莫非和路由路径相关?先这样猜吧,现在人越来越懒,不愿意想问题,BS自己下
这个说法似乎有点小问题。我的理解:
MTU值太小,会导致包头占比过大,有效数据变少,传输效率不高。
MTU过大,会导致发送方IP层分片(fragmentation)和接收方重组。
排除被路由弃包的失败情况。
TCP数据时,频繁的分片重组会加大协议栈处理压力,在正好分片出大量小数据时才严重影响传输效率。
UDP传输的MTU影响则大得多,因为一个UDP包如果传输过程中丢失任何一片都会导致整个包无法重组而被丢弃。
呵呵,粗浅看法,借机回忆下网络知识。