網路異常測試初探

shbwf發表於2013-12-24

開發或者測試網際網路產品的過程中,同學們一定遇到過connection timed out和socket read timed out兩種和網路相關的異常。今天我們並不分析引起這些異常的原因,也不談發生異常以後的解決辦法,我們來說說如何製造這類異常,從而模擬對應的異常場景。
  瞭解tcp協議就知道connection即建立連線的過程,其實和socket read即傳輸資料的過程並沒有太大的差別,兩者都是請求應答模式,而只是前者的請求資料量很小而已。要使兩者超時,我們可以採用相同的方法即限制網路傳輸的頻寬來達到目的。
  Tc即traffic 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對應的頻寬為90到100mbps,12這個class對應的頻寬只有90到100bps。劃分好了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中了,這樣就把符合該條件的資料流量限制到了90到100bps。在正在執行的系統中開啟上述tc限制,即把特定資料流限制到一個極小值,我們就能模擬出connection timed out異常了。關於tc更詳細的教程可以參考1、2。
  那麼socket read timed out異常又該如何模擬呢,我們怎麼才能區分建立連線和資料傳輸這兩個過程,tc工具還能滿足我們的需求嗎?在尋找問題答案的過程中,另一個linux核心元件iptables進入了我們的視野。
  Iptables是linux系統中常用的防火牆元件,功能十分強大,網上有十分豐富的資料。由於其能夠識別資料包中的syn、ack等標誌位,故能把建立連線和後續的資料傳輸過程區分開來。
  iptables -A INPUT -p tcp --src $IP --dport $PORT ! --syn -j DROP
  如上,在目的機器上加入該條iptables規則,可以實現將未設定syn標誌位的資料包丟棄的功能,這樣連線能夠建立完成但後續的資料傳輸將無響應。
  另外,Iptables具有一種連線跟蹤機制,即能夠記錄連線的狀態。這些狀態分別是NEW、ESTABLISHED、RELATED和INVALID。我們可以利用該特性實現相同的效果。
  iptables -A INPUT -p tcp -m state --state ESTABLISHED -s $IP --dport $PORT -j DROP
  如上,在目的機器上加入該條iptables規則,當匹配了ip和埠,並且資料包所對應的連線狀態是ESTABLISHED時將其丟棄。
  至此read timed out異常也能輕鬆模擬了。Tc和Iptables是linux網路模組中強有力的工具,除了能夠利用它們開發功能,也能夠在網路異常測試中發揮關鍵的作用。


51Testing軟體測試論壇聖誕活動期待您的參與~ipadmini 惠普平板 京東購物卡等你來搶!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11323760/viewspace-1064161/,如需轉載,請註明出處,否則將追究法律責任。

相關文章