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

前言

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

随着项目组微服务化的演变进程,服务间通过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的好帮手,大家可以在日常的测试中实验一下,会有意外收获哦

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

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

相关文章:
【推荐】 从DevOps到Cloud Native,应用上云姿势全解锁

异常测试之Socket网络异常的更多相关文章

  1. .NET面试题系列(十九)Socket网络异常类型

    序言 资料 异常测试之Socket网络异常

  2. 在c#中利用keep-alive处理socket网络异常断开的方法

    本文摘自 http://www.z6688.com/info/57987-1.htm 最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在 ...

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

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

  4. java socket 网络编程常见异常

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

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

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

  6. 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)

    http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...

  7. SQL Server事务遭遇网络异常时的处理机制浅析

    SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Server数据库是通过什么机制来判断处理呢? 估计很多人 ...

  8. 使用图片预加载,解决断网后无法从后台获取提示网络异常的logo图片的问题

    项目中有需求,断网后,显示小提示窗,里面包含网络异常提示语和异常小logo图片. 在实际操作时,遇到,断网后,无法从后台获取异常小logo图片. 我是才用图片预加载的方法解决这个问题的,解决方法如下: ...

  9. Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决

    能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...

随机推荐

  1. 复制带随机指针的链表 · Copy List with Random Pointer

    [抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: 完完全全地复制,否则不好操作. 1-> ...

  2. 带你认识那些App可靠性设计

    可靠性是软件一个重要的质量属性,它关注的是软件功能持续的可用性,以及出现故障之后是否能够容错,是否能快速的恢复使用. 可靠性六条基本准则 1.故障应在第一时间被检测和感知: 2.能避免的故障都不应该发 ...

  3. JVM 系列(一)类加载

    JVM 系列(一)类加载 类加载机制是指把 class 文件加载到内存,并对数据进行校验.解析和初始化,最终形成 JVM 可以直接使用的 Java 类型的过程. ClassLoader 加载一个 cl ...

  4. Java 8 可重复注解与类型注解

    Java 8 可重复注解与类型注解 Java 8 对注解处理提供了两点改进:可重复的注解及可用于类型的注解. // 首先要提供一个容器,MyAnnotation 才能用于可重复注解 @Target({ ...

  5. hadoop 学习(二)ubuntu hadoop 2.7.0 伪分部安装

    本篇是基于上一篇,ubuntu 安装hadoop单机版基础上的 1.配置core-site.xml /usr/local/hadoop/etc/hadoop/core-site.xml 包含了hado ...

  6. Django(3)

    https://www.cnblogs.com/yuanchenqi/articles/7429279.html

  7. java,arduino,C#之间的一些编码转换

    1.C#-> Encoding.UTF8.GetBytes( "abc中") ->[97,98,99,228,184,173] java->byte[] bs= ...

  8. Linux服务器部署系列之三—DNS篇

    网上介绍DNS的知识很多,在这里我就不再讲述DNS原理及做名词解释了.本篇我们将以一个实例为例来讲述DNS的配置,实验环境如下: 域名:guoxuemin.cn, 子域:shenzhen.guoxue ...

  9. Sql Server R8 密码问题及5102错误

    登录的两种方式: 集成登录连接:con = new SqlConnection("server=.\\SQLEXPRESS;database=db_news;Trusted_Connecti ...

  10. spring boot打包后windows启动乱码

    事情的起因什么的就不多表了,直接进入主题... 项目都要上线了,结果发现使用 idea mvn install之后的 jar在windows下启动乱码,而使用idea启动却没有问题!!! 这是神马情况 ...