[原]魔兽(WOW)AOE掉线原因分析及解决方法(附上网卡设置)

首先,以下办法是通用方法,我个人遇到的问题主要是这样的:

1。玩魔兽,打黑龙的时候AOE几波小龙的时候要掉线.

2.访问大数据量网站,比如 www.sina.com.cn 或者 www.tiexue.net 此类首页字节数相当巨大的网站,浏览器假死(响应非常慢), ping值突然变为timeout. 很长一段时间之后,网页上的图片才缓慢显示,但是仍然有残缺不全的地方,此刻ping值才恢复正常(10ms左右)

==================技术分割线开始================== 

1. 魔兽是一个好游戏,转手到网易之后,骂声不断,众人理解为因为服务器太卡的原因. 通过技术分析,其实不是.

主要原因是2方面,第一是服务器现在都在杭州;第二,暴雪新的帧打包压缩方式和大众的本地网络设置格格不入.

  和9C相比,服务器的部署方式改变. 以前9C是采用的分布式部署方式, 也就是说网通用户服务器部署到北京之类的地区, 电信用户又根据省份不同,部署到不同的省份.这种方式好处就是用户体验很好,网速快,响应快,掉包少,稳定.然后在登录之后的分区显示里面可以完全按照暴雪制定的策略,选择PVE,PVP以及分区信息等.这点上显然用户体验至上,小小赞9C一个, 应该是专门和暴雪技术谈了的.

   网易的部署方式完全按照暴雪wow的架构来设计,因为在国外,装机量通常不高,也没有什么网通,电信相互分割的说法,所以通常来说,系统设计只有一份,换句话说,没考虑中国这种网通电信互通困难的局面.因此都是单机房部署,在中国进行部署,也可以,最好的互通方式就是BGP机房.但是即便是BGP机房,延迟仍然有50-100左右,而不像9C时代的10ms的ping.所以用户体验要差一点点.

  既然是BGP,所以路由相比9C机房部署方式就增加了.因此,任何一个节点受到黑客攻击,都会造成卡和莫名其妙的掉线(有时候玩的好好的突然掉了,就是在遥远而漫长的路由节点中,某个无良网管由于修改全局防火墙配置,重启了防火墙-----通常也就是几秒的事情,所以大家可能骂两句就不了了之了,然是事实就是如此.好,这里是稳定性降低的原因之一.

  另外,东拥湖开战的时候,才是考验服务器的时候,如果这个时候恰逢傍晚人多的时候,就更卡了.掉线就更频繁了.这个时候属于服务器CPU过高导致,确实是硬件没跟上的问题. 但是显然, 任何系统不可能为了这1个小时左右的剑锋时期而投入更多的服务器,如果为了这1个小时增加投入,其余23个小时的运营成本就惨淡了. 这是任何厂商不愿意看到的.所以,这个是架构设计问题,暴雪的问题,魔兽的架构问题,和网易无关,如果换做9C的分布式部署方式来运作,结果应该是一样的.所以,别莫名的抱怨.

  好,以上是不可抗力因素.现在我们来分析和解决个人的网络环境问题.

  这里我只说家庭用户,毕竟成分最多.通常家庭网络部署是  外部网络->ADSL猫猫(路由器/集线器)->多台电脑 , 容易忽略的是我们的ADSL设置和个人电脑的设置不匹配.

  首先我们需要进入ADSL配置界面(类似[ http://192.168.1.1/ ] 输入admin/admin)从菜单里找到"防火墙设置"这一项,将 "最大半开TCP连接"修改为80, "最大单个主机连接"修改为80

  然后找到"PVC6"也就是设置口令的那个界面,在里面找MTU设置信息,我的"运作MTU是1432。这个很重要,避免数据包被拆分就靠它了.关于不登陆ADSL猫找寻MTU信息的方法,可以使用CMD命令 ping -l 1376 -f www.163.com, -l是指定包大小 -f是强制不分包 其中1376可以试着增加,知道ping通为止,如果ping不同,就增加或者降低,总之找到一个刚好ping通的值.多一个字节的都不行.我这里找到的是1376,打开windows优化大师,在"优化网络"那里找到设置"最大传输单元MTU","最大数据段长度MSS","传输单元缓冲区" 分别手动设置为 1404(1376+28或者1432-28),1364(1404-40(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)),256000;

  然后在 控制面板->网络链接->本地连接(右键->属性)->配置->高级 里面的几项

  FlowControl 流控制 关闭

  大量传送减负  关闭

  网络唤醒 关闭

  关闭网卡以节约电能 关闭

  Rx/Tx 校验 关闭         改为CPU接管

 

以下是网上搜集的部分网卡的配置方法.大体思路从上面的几个关键改动派生. 

 

NF网卡高级设置


Checksum Offload   数据包校验 建议关闭
Flow Control     流量控制 一定要关闭
IEEE802.1P Support   IEEE802.1P支持 建议关闭
Jumbo Frame Payload Size   默认是1500   这个是千兆网络一个新的设置,在下文详细叙述。
Low Power State Link Speed   网卡节能   建议关闭
Network Address     MAC的修改   默认为不存在 一般不必改动
Optimize For   CPU/Throughput   为CPU占用优化或为吞吐量进行优化,设置为CPU的话,网卡的速度被限制,但CPU占用会很低,假如改为Throughput的话,网卡的性能才能完全发挥,但CPU的占用也会上升不少。
Segmentation Offload   建议关闭
Speed/Duplex Settings   Full Autonegotiation(全自适应,一般不用修改)
VLAN Id   默认是1 不用改
VLAN Support   VLAN支持 一般关闭
Wake on Magic packet   魔术数据包唤醒 建议关闭
Wake on pattern   建议关闭
WakeOnLAN From PowerOff   建议关闭

8168/8111c网卡高级设置

在网卡高级选项里
JUMBO FRAME 改成无
802.1Q/1P VLAN Tagging 改成关闭
Flow Control 改成关闭
Jumbo Frame 改成关闭
Offload Checksum 改成关闭
Offload TCP_LargeSemnd 改成关闭

8169/8167网卡高级设置 
820.1Q/1p VLAN Tagging=Disable 
Flow Control=Disable 
Junbo Frame=Disable 
Offload Checksum=Disable 
Offload TCP_LargeSend=Disable

Marvell Yukon网卡高级设置
流控制-》禁用(或者Flow Control->Disable)
传送缓冲区-》512(或者MaxTransmits->200)
接收缓冲区-》512(或者MaxReceives->500)
唤醒功能-》Link Change唤醒模式(或者WakeUpModeCap_A->28)
卸载 TCP/UDP 校验和 (IPv4)-》禁用(或者*TCPUDPChecksumOffloadIPv4->0)
在内网的IPX协议里手工添加一个帖类型802.2,网络号为:00012345或12345678 这样启动速度会快一点
修改XP默认TCP连接数

Intel Pro 1000网卡高级设置
QoS数据包标签     建议设置:已禁用
本地管理的地址     建议设置:不存在
传输描述符         建议设置:256
等待连接           建议设置:开
分载传输IP效验和 建议设置:开
分载传输TCP效验和 建议设置:关
分载接收IP效验和 建议设置:开
分载接收TCP效验和 建议设置:关
唤醒链接设置       建议设置:已禁用
唤醒设置           建议设置:已禁用
纪录链接状态设置 建议设置:已禁用
接收描述符         建议设置:256
巨帧               建议设置:已禁用
链接速度和双工     建议设置:1000 Mbps 自动协商
流程控制           建议设置:关
启用 PME           建议设置:控制操作系统
适应性帧间距调整 建议设置:已启用
中断节流率         建议设置:关  

网卡高级属性设置
1。link down power saving 连接断开时关闭电源节省,建议启用enable。
2。link speed/duplex mode 连接的速度,现在的网卡一般都是10/100M自适应的,选默认的auto negotiation 自动选择即可。
3。network performance 网络设置,不用理它。
4。optimal performance 优化设置,建议启用enable。
5。receive buffer size 接收缓存大小,选最大的64k bytes吧。
6。wakeup on arp/ping 
wakeup on link change 
wakeup using Apm mode

这些都是网络唤醒功能,不需要的建议关闭disable。

Link Down Power Saving   低速连接时省电模式 
Link Speed/Duplex Mode   连接速度双工模式 
Network Address               网络地址 
Optimal Performance         优化性能 
Receive Buffer Size           接收缓冲大小 
WakeUp on ARP/PING         网络唤醒通过ARP/PING 
WakeUp on Link Change   网络唤醒通过连接改变 

WakeUp using APM Mode 网络唤醒通过APM模式

==================技术分割线结束==================

 

其中最重要的是MTU的匹配,如果不匹配,数据包会被拆分,而wlk版本的数据包压缩方式改变,压缩比非常高,一旦失败,就要重新切割.

而 大流量减负 Rx/Tx CRC 等等以上说的都会导致包重新切割.造成了数据包一直在本地缓冲内循环切割和等待,最终就是卡掉线.

 

上面的措施不仅仅是解决掉线问题,其次是可以增加上网浏览速度15%-100*N% .

==================================================

参考资料:

TCP的MSS(最大分段)以及MTU分析

[背景知识] 
   MTU: Maxitum Transmission Unit 最大传输单元 
   MSS: Maxitum Segment Size 最大分段大小(偶是直译,翻译的不好,不要打俺PP) 
   PPPoE: PPP Over Ethernet(在以太网上承载PPP协议) 
   [分析过程] 
   先说说这MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,让我们先仔细回忆一下EthernetII帧的结构DMAC+SMAC+Type+Data+CRC 
   由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。 
   (注:小于64Bytes的数据帧一般是由于以太网冲突产生的“碎片”或者线路干扰或者坏的以太网接口产生的,对于大于1518Bytes的数据帧我们一般把它叫做Giant帧,这种一般是由于线路干扰或者坏的以太网口产生) 
  由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes(这个部门有时候大家也把它叫做FCS),那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。这个就是网络层协议非常关心的地方,因为网络层协议比如IP协议会根据这个值来决定是否把上层传下来的数据进行分片。就好比一个盒子没法装下一大块面包,我们需要把面包切成片,装在多个盒子里面一样的道理。 
   当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 )通过这段水管最大水量就要由中间最细的水管决定。 
  对于网络层的上层协议而言(我们以TCP/IP协议族为例)它们对水管粗细不在意它们认为这个是网络层的事情。网络层IP协议会检查每个从上层协议下来的数据包的大小,并根据本机MTU的大小决定是否作“分片”处理。分片最大的坏处就是降低了传输性能,本来一次可以搞定的事情,分成多次搞定,所以在网络层更高一层(就是传输层)的实现中往往会对此加以注意!有些高层因为某些原因就会要求我这个面包不能切片,我要完整地面包,所以会在IP数据包包头里面加上一个标签F(DonotFragment)。这样当这个IP数据包在一大段网络(水管里面)传输的时候,如果遇到MTU小于IP数据包的情况,转发设备就会根据要求丢弃这个数据包。然后返回一个错误信息给发送者。这样往往会造成某些通讯上的问题,不过幸运的是大部分网络链路都是MTU1500或者大于1500。 
   对于UDP协议而言,这个协议本身是无连接的协议,对数据包的到达顺序以及是否正确到达不甚关心,所以一般UDP应用对分片没有特殊要求。 
   对于TCP协议而言就不一样了,这个协议是面向连接的协议,对于TCP协议而言它非常在意数据包的到达顺序以及是否传输中有错误发生。所以有些TCP应用对分片有要求---不能分片(DF)。 
  花开两朵,各表一枝,说完MTU的故事我们该讲讲今天的第二个猪脚---PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。 
   为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为CableModem或者xDSL或者以太网的接入)由于以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的,所以就出了这么一个怪胎PPoE。(有关PPPoE的详细介绍参见本站其他成员的一些介绍文章,我就不啰里啰唆的了) 
   PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。 
   如果两台主机之间的某段网络使用了PPPoE那么就会导致某些不能分片的应用无法通讯。 
   这个时候就需要我们调整一下主机的MTU,通过降低主机的MTU,这样我们就能够顺利地进行通讯了。 
   当然对于TCP应用而言还有另外的解决方案。 
   马上请出今天第三位猪脚:MSS。 
   MSS最大传输大小的缩写,是TCP协议里面的一个概念。 
  MSS就是TCP数据包每次能够传输的最大数据分段。为了达到最佳的传输效能TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以往往MSS为1460。通讯双方会根据双方提供的MSS值得最小值确定为这次连接的最大MSS值。 
   介绍完这三位猪脚
  我们回过头来看前言里面的那个问题,我们试想一下,如果我们在中间路由器上把每次TCP连接的最大MSS进行调整这样使得通过PPPoE链路的最大MSS值加上数据包头包尾不会超过PPPoE的MTU大小1492这样就不会造成无法通讯的问题.所以上面的问题可以通过ip tcp adjust-mss1452来解决。当然问题也可以通过修改PC机的MTU来解决。 
  MTU是什么?    
如何查看它的大小?如何修改它的值?MTU是Maximum Transmission Unit的缩写。意思是    
网络上传送的最大数据包。MTU的单位是字节。 大部分网络设备的MTU都是1500。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。 
  如何检测网关的MTU? 在本机打开dos窗口,执行: ping -f -l 1472 192.168.0.1   
其中192.168.0.1是网关IP地址,1472是数据包的长度。请注意,上面的参数是“-l”(小写的L),而不是“-1”。如果能ping通,表示数据包不需要拆包,可以通过网关发送出去。如果出现: Packet needs to be fragmented butDF set.表示数据包需要拆开来发送。此时,减少数据包长度,再执行上面的ping命令。从1400到1472之间多试几次,就能找到合适的数据包长度了。把数据包长度加上数据包头28字节,就得到MTU的值。 如果检测到网关的MTU值是1500,不需要修改。如果网关有防火墙ping不通,可以试试直接把MTU设为1400。 
  如何修改本机的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,则该子项就是要找的网卡。    
(d)、进入该子项,在右边的窗口里按鼠标右键,选择“新建”->“双字节值”,输入名称“MTU”,按回车。再用鼠标双击“MTU”,弹出修改窗口, 填入MTU的值。填写前请先把基数设为十进制。 设置好后,需要重启机器才能生效。 

 

 

posted on 2010-11-09 17:36  钢铁奏鸣曲  阅读(2755)  评论(0)    收藏  举报

导航