本文由作者张雨授权网易云社区发布。

前言

不知道大家在测试的过程中有没有发现关于异常测试这样一个特点: 无论是分散在功能测试中的异常用例还是规模相对较大的专项异常测试中,异常测试的用例占比虽然不大但是对于挖掘问题却扮演着十分重要的角色。

随着项目组微服务化的演变进程,服务间通过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三次握手非高清大图

1. 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

2. 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

3. 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

4. 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的好帮手,大家可以在日常的测试中实验一下,会有意外收获哦

免费领取验证码、内容安全、短信发送、直播点播体验包及云服务器等套餐

更多网易技术、产品、运营经验分享请访问网易云社区。

相关文章:
【推荐】 金融事业部QA培训体系
【推荐】 LESS+to+MCSS
【推荐】 微服务化之无状态化与容器化

异常测试之Socket网络异常相关推荐

  1. 在C#中利用Keep-Alive处理Socket网络异常断开的方法

    最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在服务端开发中我碰到了各种各样的网络异常断开现象.在处理这些异常的时候有了一些心得,现在 ...

  2. 常见的Socket网络异常场景分析

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介 在目前微服务的背景下,网络异常越来越常见了,而有一些网络异常非常模糊,理解什么情况下会导致什么异常,还是有一定难度 ...

  3. 网络异常流量分析系统设计

    为什么要监测分析异常流量? 网络管理人员都希望在网络性能突然下降的时候找到"真凶"所在,并迅速解决问题.利用网络异常流量监测的方法,可以非常直观地看到网络流量是否有突然增长或者突然 ...

  4. AJAX(GET POST请求、 jQuery axios 发送请求、跨域--cors、请求超时、网络异常、放弃请求、重复发送请求)

    根据视频进行整理 [https://www.bilibili.com/video/BV1WC4y1b78y?p=1] 视频资料 百度网盘: 链接:[https://pan.baidu.com/s/1n ...

  5. Java Socket网络编程常见异常(转)

    1.java.net.SocketTimeoutException 这个异常比较常见,socket超时.一般有2个地方会抛出这个,一个是connect的时候,这个超时参数由connect(Socket ...

  6. 如果MySQL事务中发生了网络异常?

    一 前言 在我们运维MySQL的时候,总会遇到各种情况导致程序和MySQL之间的会话异常中断,比如 假如强制关闭应用 假如client机器突然崩溃宕机/断电 假如网络发生抖动/网卡发生故障 机房级别断 ...

  7. Android 网络异常

    目录 前言 一.UnknownHostException 1.网络断开验证 2.DNS 服务器意外挂掉验证 3.DNS 服务器故障验证 4.所需诊断信息 二.ConnectTimeoutExcepti ...

  8. 99%的程序都没有考虑的网络异常

    本文由云+社区发表 绝大多数程序只考虑了接口正常工作的场景,而用户在使用我们的产品时遇到的各类异常,全都丢在看似 ok 的 try catch 中.如果没有做好异常的兼容和兜底处理,会极大的影响用户体 ...

  9. 在线升级,下载升级包过程中提示网络异常导致升级失败。

    问题描述: 连接wifi,选择在线升级,在现在升级包过程中,提示网络异常,导致升级失败. 问题解决: 首先分析mainlog中对应时间点上下文的log.通过搜索rssi,查看当前wifi连接状态,如下 ...

  10. linux read timed out,【转】网络异常模拟 read timed out

    开发或者产品的过程中,同学们一定遇到过connection timed out和socket read timed out两种和网络相关的异常.今天我们并不分析引起这些异常的原因,也不谈发生异常以后的 ...

最新文章

  1. Android中NFC编程
  2. Django开发社交类网站必备的10个第三方应用
  3. Linux mysql 登录 2002,Linux 下 Mysql error 2002 错误解决
  4. Page_Load的问题
  5. ubuntu手动修改anaconda环境变量
  6. php 立即执行函数,关于javascrip的立即执行函数的解析
  7. mysql内核测试,MySQL 5.7内核复制中的一个小坑
  8. php操作mysqli(示例代码)
  9. DiskFileUpload类和fileitem类
  10. 《毫米波雷达运动人体目标建模与特征提取》---论文学习笔记
  11. 超市仓库管理系统python+tkinter
  12. SCCM 客户端PXE 启动 卡boot.sdi
  13. 桌面时间的最佳管理者-软媒时间
  14. Vant组件库 引入 阿里矢量图 添加自己喜欢的 ICON
  15. 软件工程阶段性总结(三)——软件设计和编码
  16. Linux at命令使用介绍
  17. 向毕业妥协系列之机器学习笔记:监督学习-回归与分类(一)
  18. 超详细 WebPack 入门教程
  19. C语言rewind函数返回值为空,C语言rewind和fseek函数的用法详解(随机读写文件)...
  20. python小海龟画房子编程_教孩子学Python编程之海龟画图(一)

热门文章

  1. uniapp字体图标的使用
  2. 安卓开发——修改Toolbar默认图标(如返回图标)的颜色
  3. java将小写金额转为大写金额
  4. 分块器评估与语言结构中的递归
  5. 已解决Python爬虫网页中文乱码问题
  6. 笔记本计算机无法启动怎么解决,笔记本开机进不了系统,教您笔记本开机无法进入系统怎么办...
  7. 揭秘前端工程师未来就业方向,年薪50w不是梦!
  8. MTK6762 Helio P22 安卓核心板模块应用
  9. 人事档案信息管理系统的面向对象的分析、设计和实现
  10. 计算机硬盘从盘的设置,双硬盘怎么设置主从盘 电脑双硬盘设置主从教程