Sunday, October 24, 2010

tech 打开网页超时-修改mtu

现象:
尝试打开网页http://sage.mc.yu.edu/kbeen/teaching/algorithms/resources/red-black-tree.html时出现超时错误(The connection has timed out)
firefox, chrome, ie8均出现了这个错误.
(注意:我打开别的网页没有问题,eg:google, gmail....)

用ping, tracert均能连上. 具体地:

然后我ping 了下sage.mc.yu.edu也成功了了. ( 注:我也打不开网页sage.mc.yu.edu).如下:
C:\Documents and Settings\xxxx>ping sage.mc.yu.edu

Pinging sage.mc.yu.edu [129.98.215.77] with 32 bytes of data:

Reply from 129.98.215.77: bytes=32 time=290ms TTL=104
Reply from 129.98.215.77: bytes=32 time=279ms TTL=104
....


然后又用tracert看了一下. 信息如下:
C:\Documents and Settings\simon>tracert sage.mc.yu.edu

Tracing route to sage.mc.yu.edu [129.98.215.77]
over a maximum of 30 hops:

  1    <1 ms    <1 ms    <1 ms  localhost [192.168.0.1]
  2     6 ms     2 ms     1 ms  10.25.0.1 [10.25.0.1]
  3     5 ms     1 ms     1 ms  localhost [172.17.0.69]
  4     6 ms     1 ms     4 ms  localhost [172.17.2.7]
  5     *        4 ms     1 ms  27.189.198.1
  6     *        *        *     Request timed out.
  7     *        *        *     Request timed out.
  8    40 ms    43 ms    21 ms  27.189.251.13
 .........
 22   415 ms   371 ms   374 ms  216.55.2.10
 23   255 ms   315 ms   255 ms  rtr3-tg10-1.wan.hcvlny.cv.net [64.15.0.2]
 24   348 ms     *      341 ms  64.15.2.6
 25   371 ms   387 ms   434 ms  rtr1-gec-1.cst.bthpny.cv.net [64.15.4.122]
 26   254 ms   268 ms   315 ms  4133c346.cst.lightpath.net [65.51.195.70]
 27   621 ms   618 ms   623 ms  aecom-inet-core2-gw.net.yu.edu [129.98.18.254]
 28   371 ms   357 ms   349 ms  wilf-core2-ios-gw.net.yu.edu [129.98.15.254]
 29   257 ms   257 ms   262 ms  sage.mc.yu.edu [129.98.215.77]

从上面的信息看到, 它需要经过很多hop才能到达目标.


然后google, baidu了. 发现均不能解决. 最后只能放弃了.
但是其中说了 可以尝试修改MTU看看, 能不能解决 (这是这个文章要说的).
另外, 我还尝试了 延长firefox超时的时间, 但是没有找到确切的选项(about:config中没有找到, 也许我该的不对).
不过倒是发现有不少人 发帖询问如何修改 firefox打开网页是的 超时时间.


修改MTU

我的网络环境:
本机 通过 家用路由器 上网.

家用路由器的MTU设置为1500.

我尝试修改本机的MTU.

下面的文章摘自别人的博客或者说由别人的博客编译而成.

MTU是Maximum Transmission Unit的缩写。

意思是网络上传送的最大数据包。MTU的单位是字节。 下面列出了一些上网方式的MTU值:
EtherNet(一般上网方式,默认值):1500
PPPoE/ADSL:1492
Dial Up/Modem:576

大部分网络设备的MTU都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络 速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。

注意:
通常本机的MTU的值最好是能用被分包就能到达目标主机. 但是通常本机到目标主机的链路不清楚(即中间经过的路由器未知),有些链路的MTU可能很小.
此外, 一般安装机器时是没有附带按照 检测 整条链路上的MTU的, 所以通常 本机的MTU不好设置啊.

就xp而言, 你能为某一个本地连接(可以认为是网卡) 设置一个MTU,并且重启后才有效, 并且每一个利用该本地连接的包都使用该MTU.此外, 本机到不同的目标主机 使用的链路 极有可能不一样(几乎不会一样), 所以 你 设置的本机MTU不可能适应所有情况..只能是 对于大部分情况这这个MTU最好....


如何检测网关的MTU?

(这里假设我不知道我的家用路由器的MTU, 我想探测出它的值, 然后依次来设置本机的MTU)

在本机打开dos窗口,执行:

ping -f -l    1452    192.168.1.1

其中192.168.1.1是网关IP地址,1452是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”。 如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。 如果出现:

Packet needs to be fragmented but DF set.
Packet needs to be fragmented but DF set.
.....

表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从1400到1472之间多试几次,就能找到合适的数据包长度了。把数据包长度加上数据包头28字节,就得到MTU的值。 如果检测到网关的MTU值是1500,不需要修改。 如果网关有防火墙ping不通,可以试试直接把MTU设为1400。

C:\Documents and Settings\xxxxx>ping -f -l    1452    192.168.1.1

Pinging 192.168.1.1 with 1452 bytes of data:

Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=5ms TTL=64
Reply from 192.168.1.1: bytes=1452 time=1ms TTL=64

结果出现了回应了!这表示这一个 MTU 值是可行的!不过,强烈建议找出可行的最大 MTU 值!这样一来,在设定的时候,才可以达到最佳的网速!

找出 MTU 值:利用上面这个方法找到的数值还不是 MTU 喔!由于一些封包上面的问题,上面这个值再加上 28 才是我们所需要的 MTU 值!所以,在上面的例子中,我们所需要的 MTU 值是 1464+28=1492!

附注:我设置为1452+28=1480后,还是会出现有些网站打不开、远程桌面无法通过域名登陆的问题(通过ip可以正常远程桌面登陆),而把MTU设置为1452后,反而这些问题都迎刃而解了, ....。

一般来讲,设计好本机的MTU值,可以解决部分网站打不开的情况,但是如果你的共享主机或路由器的MTU设置有问题,有时问题仍然存或,或者出现网速过慢的情况。合理的设置路由器与本机的MTU值,就可以完全解决上述问题,使上网速度达到最大化。


如何修改本机的MTU?修改方法如下:

(1)、运行regedit

(2)、浏览到: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

(3)、Interfaces下有多个子项,每个子项对应一个网卡。请按如下方法选择网卡:

          (a)确定本机用来连接Internet的网卡或拨号连接的IP,如192.168.0.19;

          (b)用鼠标点击Interfaces上的子项,查看键值列表中的IPAddress项;

          (c)如果IPAddress的键值与(a)中的IP相同,即192.168.0.19,则该子项就是要找的网卡。

(4)、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“双字节值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口,  填入MTU的值。填写前请先把基数设为十进制。 设置好后,需要重启机器才能生效。

实践、重启、测试,最后得出最佳的网络状态,探索无极限,努力,终会有好结果。


如何利用tracert确定一个链路上的路由设备的MTU

(请参考别的资料已获得更多信息, 这里的东西 只是介绍性的)

tracert本身是无法检测一个链路上的路由设备的MTU. 但可以很容易地修改traceroute程序,用它来确定路径MTU。(需要有tracert的源代码)。要做的是发送分组,并设置“不分片”标志比特。发送的第一个分组的长度正好与出口MTU相等,每次收到ICMP“不能分片”差错时就减小分组的长度。如果路由器发送的ICMP差错报文是新格式,包含出口的 MTU,那么就用该MTU值来发送,否则就用下一个最小的MTU值来发送。正如RFC 1191 [Mogul and Deering 1990]声明的那样, MTU值的个数是有限的,因此在我们的程序中有一些由近似值构成的表,取下一个最小MTU值来发送。

有人做了、一个实验,多次运行修改以后的traceroute程序,目的端为世界各地的主机。可以到达1 5个国家(包括南极洲),使用了多个跨大西洋和跨太平洋的链路。但是,在这样做之前,其所在子网与路由器n e t b之间的拨号SLIP链路MTU增加到1500,与以太网相同。
    在1 8次运行当中,只有其中2次发现的路径MTU小于1500。其中一个跨大西洋的链路MTU值为5 7 2(其近似值甚至在RFC 11 9 1中也没有被列出),而路由器返回的是新格式的ICMP差错报文。另外一条链路,在日本的两个路由器之间,不能处理1500字节的数据帧,并且路由器没有 返回新格式的ICMP差错报文。把MTU值设成1 0 0 6则可以正常工作。
    从这个实验可以得出结论,现在许多但不是所有的广域网都可以处理大于5 1 2字节的分组。利用路径MTU发现机制,应用程序就可以充分利用更大的MTU来发送报文。












No comments: