摘要:前言不知道大家在測試的過程中有沒有發現關于異常測試這樣一個特點無論是分散在功能測試中的異常用例還是規模相對較大的專項異常測試中,異常測試的用例占比雖然不大但是對于挖掘問題卻扮演著十分重要的角色。
本文由作者張雨授權網易云社區發布。
前言
不知道大家在測試的過程中有沒有發現關于異常測試這樣一個特點: 無論是分散在功能測試中的異常用例還是規模相對較大的專項異常測試中,異常測試的用例占比雖然不大但是對于挖掘問題卻扮演著十分重要的角色。
隨著項目組微服務化的演變進程,服務間通過http接口訪問的場景也越來越多,本文站在測試的角度,對與socket的網絡異常測試場景進行了一下整理和模擬方法的實踐,拋磚引玉,歡迎大家提出更多更好的方法。
常見Socket網絡異常類型
異常 Exception類型 原因 場景
connect timed out java.net.SocketTimeoutException Socket TCP建立連接時三次握手超時,如果建立連接的時間超過了設置的Socket連接的超時時間觸發TimeoutException異常 網絡延遲、網絡斷開、網卡異常、服務端性能、客戶端異常等等
Read timed out java.net.SocketTimeoutException 如果輸入緩沖隊列RecvQ中沒有數據,read操作會一直阻塞而掛起線程,直到有新的數據到來并且已經超過了設置的讀超時時間時觸發 客戶端或者服務端進程崩潰、對方機器突然重啟、網絡斷開等
Connection refused java.net.ConnectException 訪問服務端IP不通或者端口服務沒有啟用 網絡異常、服務down掉等
Connection reset or connection reset by peer java.net.SocketException 客戶端或者服務端其中一方退出,但退出時并未關閉該連接,另一方仍然在從連接中讀數據則拋出該異常(發送的第一個數據包引發該異常Connect reset by peer 服務端并發連接數達到負載主動斷開連接;客戶端關閉但服務端仍讀寫數據
網絡異常場景構造實驗
通過上面對于異常場景原理的了解, 我們通過一些linux網絡小工具結合tcp的連接建立流程依次制造異常,從而更好的了解上面這些異常~
服務端: tomcat server 8080
客戶端: curl
工具: iptables 、tcpkill
國際慣例,tcp三次握手非高清大圖
connect timed out
客戶端通過iptables 構造異常
這里統一從出口進行流量的限制,大家也可以自己試下從入口方向做限制。
iptables -A OUTPUT -p tcp --syn --dport 8080 -j DROP
客戶端訪問服務端
root@asdfd-10796:~# curl http://115.238.125.169:8080 -v About to connect() to 115.238.125.169 port 8080 (#0) Trying 115.238.125.169...
Connection timed out* couldn"t connect to host
Closing connection #0
curl: (7) couldn"t connect to host
客戶端查看socket狀態:SYN_SENT
root@asdfd-10796:~# netstat -antp | grep 8080tcp 0 1 115.238.125.172:59038 115.238.125.169:8080 SYN_SENT 3692/curl
Read timed out
客戶端通過iptables 構造異常
iptables -A OUTPUT -p tcp -m state --state ESTABLISHED --dport 8080 -j DROP
客戶端訪問服務端
root@asdfd-10796:~# curl http://115.238.125.169:8080 -v About to connect() to 115.238.125.169 port 8080 (#0) Trying 115.238.125.169... connected Connected to 115.238.125.169 (115.238.125.169) port 8080 (#0)> GET / HTTP/1.1> User-Agent: curl/7.26.0> Host: 115.238.125.169:8080> Accept: />
additional stuff not fine transfer.c:1037: 0 0 additional stuff not fine transfer.c:1037: 0 0 additional stuff not fine transfer.c:1037: 0 0
...................... Recv failure: Connection timed out Closing connection #0
curl: (56) Recv failure: Connection timed out
客戶端查看socket狀態:ESTABLISHED
root@asdfd-10796:~# netstat -antp | grep 8080tcp 0 84 115.238.125.172:58986 115.238.125.169:8080 ESTABLISHED 3671/curl
客戶端抓包情況
當tcp連接完成syn-》syn ack后進入ESTABLISHED狀態, 而由于iptables的配置導致服務端之后返回的tcp報文被drop掉,服務端多次重傳后無ack返回,返回read time out
Connection refused
客戶端通過iptables 構造異常
iptables -A OUTPUT -p tcp --dport 8080 -j REJECT
客戶端訪問服務端
root@asdfd-10796:~# curl http://115.238.125.169:8080 -v About to connect() to 115.238.125.169 port 8080 (#0) Trying 115.238.125.169...
Connection refused
couldn"t connect to host
Closing connection #0
curl: (7) couldn"t connect to host
客戶端查看socket狀態:FIN_WAIT1
root@asdfd-10796:~# netstat -antp | grep 8080tcp 0 85 115.238.125.172:58986 115.238.125.169:8080 FIN_WAIT1 -
服務端抓包情況
由于iptables的配置,客戶端主動reject掉服務端返回的syn ack
Connection reset by peer or connection reset
服務端通過tcpkill命令構造異常
tcpkill是一個網絡分析工具集dsniff中的一個小工具,可用來輕量級斷開網絡連接
tcpkill -i eth2 port 8080
客戶端訪問服務端
testroot@asdfd-10796:~# curl http://115.238.125.169:8080/test2 -v About to connect() to 115.238.125.169 port 8080 (#0) Trying 115.238.125.169... connected Connected to 115.238.125.169 (115.238.125.169) port 8080 (#0)> GET /test2 HTTP/1.1> User-Agent: curl/7.26.0> Host: 115.238.125.169:8080> Accept: />
additional stuff not fine transfer.c:1037: 0 0 Recv failure: Connection reset by peer Closing connection #0
curl: (56) Recv failure: Connection reset by peer
服務端查看tcpkill日志
root@asdfd-10649:~# tcpkill -i eth2 port 8080tcpkill: listening on eth2 [port 8080]115.238.125.172:60030 > 115.238.125.169:8080: R 3022358001:3022358001(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022358230:3022358230(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022358688:3022358688(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022358001:3022358001(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022358230:3022358230(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022358688:3022358688(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916106:1694916106(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916333:1694916333(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916787:1694916787(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916106:1694916106(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916333:1694916333(0) win 0115.238.125.169:8080 > 115.238.125.172:60030: R 1694916787:1694916787(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022360124:3022360124(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022360386:3022360386(0) win 0115.238.125.172:60030 > 115.238.125.169:8080: R 3022360910:3022360910(0) win 0
客戶端抓包情況
服務端在tcp連接建立后主動down掉連接
總結
其實socket的異常不僅限于次如Broken pipe、 Too many open files等,這些更多的是在壓力并發測試過程中容易出現,本文介紹的這些異常更多的適用于功能性異常測試中,是發現bug的好幫手,大家可以在日常的測試中實驗一下,會有意外收獲哦
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐
更多網易技術、產品、運營經驗分享請訪問網易云社區。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25379.html
摘要:單個請求范圍之外的異??赡軙P閉服務器。客戶端可能超時或崩潰,用戶可能取消事務,網絡可能在流量高峰期間癱瘓,黑客可能發動拒絕服務攻擊。如果默認長度不夠大,一些的構造函數還允許改變這個隊列的長度,不能不能超過操作系統支持的最大值。 ServerSocket的生命周期 一個ServerSocket的基本生命周期:1)使用一個ServerSocket構造函數在一個特定端口創建一個新的Serv...
閱讀 3573·2021-09-24 09:48
閱讀 1095·2021-09-10 10:51
閱讀 3276·2019-08-30 13:03
閱讀 3324·2019-08-30 12:51
閱讀 1393·2019-08-30 11:22
閱讀 1061·2019-08-29 18:38
閱讀 2040·2019-08-29 16:41
閱讀 3201·2019-08-29 15:32