注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭州 QA Team

务实 专注 分享 做有态度的QA

 
 
 
 
 

日志

 
 

网络异常测试初探  

来自张翱   2013-10-30 10:19:39|  分类: 性能测试 |举报 |字号 订阅

  下载LOFTER 我的照片书  |

开发或者测试互联网产品的过程中,同学们一定遇到过connection timed outsocket read timed out两种和网络相关的异常。今天我们并不分析引起这些异常的原因,也不谈发生异常以后的解决办法,我们来说说如何制造这类异常,从而模拟对应的异常场景。

了解tcp协议就知道connection即建立连接的过程,其实和socket read即传输数据的过程并没有太大的差别,两者都是请求应答模式,而只是前者的请求数据量很小而已。要使两者超时,我们可以采用相同的方法即限制网络传输的带宽来达到目的。

Tctraffic control就是这样一款能够限制网络流量的工具。Tc中主要的概念包括类class和过滤器filter

我们可以用class把网络设备的带宽划分成不同的区间

tc class add dev $DEV parent 1: classid 1:11 htb rate 90mbps ceil 100mbps

tc class add dev $DEV parent 1: classid 1:12 htb rate 90bps ceil 100bps

如上,11这个class对应的带宽为90100mbps12这个class对应的带宽只有90100bps。划分好了class,我们就可以用filter把符合特定条件的数据包归入不同的class

tc filter add dev $DEV protocol ip parent 1:0 prio 1 u32 match ip sport $PORT 0xffff match ip dst $IP flowid 1:12

如上就把源端口是$PORT,目的地址是$IP的数据包归入12这个class中了,这样就把符合该条件的数据流量限制到了90100bps。在正在运行的系统中开启上述tc限制,即把特定数据流限制到一个极小值,我们就能模拟出connection timed out异常了。关于tc更详细的教程可以参考12

那么socket read timed out异常又该如何模拟呢,我们怎么才能区分建立连接和数据传输这两个过程,tc工具还能满足我们的需求吗?在寻找问题答案的过程中,另一个linux内核组件iptables进入了我们的视野。

Iptableslinux系统中常用的防火墙组件,功能十分强大,网上有十分丰富的资料。由于其能够识别数据包中的synack等标志位,故能把建立连接和后续的数据传输过程区分开来。

iptables -A INPUT -p tcp --src $IP --dport $PORT ! --syn -j DROP

如上,在目的机器上加入该条iptables规则,可以实现将未设置syn标志位的数据包丢弃的功能,这样连接能够建立完成但后续的数据传输将无响应。

另外,Iptables具有一种连接跟踪机制,即能够记录连接的状态。这些状态分别是NEWESTABLISHEDRELATEDINVALID。我们可以利用该特性实现相同的效果。

iptables -A INPUT -p tcp -m state --state ESTABLISHED -s $IP --dport $PORT -j DROP

如上,在目的机器上加入该条iptables规则,当匹配了ip和端口,并且数据包所对应的连接状态是ESTABLISHED时将其丢弃。

至此read timed out异常也能轻松模拟了。TcIptableslinux网络模块中强有力的工具,除了能够利用它们开发功能,也能够在网络异常测试中发挥关键的作用。

  评论这张
 
阅读(644)| 评论(4)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016