写这篇文章,似乎有点重复造轮子的嫌疑,不过我仍然希望把自己吃透的东西加以整理润色分享给大家。
1、本文模拟网络异常的分类
网络延迟:当网络信息流过大时,可能导致设备反应缓慢,造成数据传输延迟;
网路掉包:网路掉包是在数据传输的过程中,数据包由于各种原因在信道中丢失的现象;
网络节流:当数据传输量达到网络带宽上限时,数据包可能会被设备拦截下来在之后发出;
网络重发:当网络不稳定是可能会导致发送端判断数据包丢失导致部分数据包重发;
数据乱序:当数据传输有可能出现数据包到达接收端时间不一致,导致数据包乱序问题;
数据篡改:数据传输的过程中可能出现数据被连接篡改的情况。
2、Windows下网络异常的模拟方法
Windows下可以使用clumsy来进行网络异常的模拟(最新版本为clumsy 0.2,下载地址:https://download.csdn.net/download/huiyuznk/10309552)。
clumsy 首先根据用户选择的 filter 来拦截指定的网络数据。在filter 中可以设定你所需的协议(tcp/udp),端口号,是接收还是发出的端口。你也可以通过简单的逻辑语句来进一步缩小范围。当clumsy被激活时,只有符合这些标准的网络数据会被进行处理,而你不需要的数据仍然会由系统正常传输。
当被 filter 的网络数据包被拦截后,你可以选择clumsy提供的功能来有目的性的调整网络情况:
- 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。
- 掉包(Drop),随机丢弃一些数据。
- 节流(Throttle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。
- 重发(Duplicate),随机复制一些数据并与其本身一同发送。
- 乱序(Out of order),打乱数据包发送的顺序。
- 篡改(Tamper),随机修改小部分的包裹内容。
在测试时,该工具的filtering使用默认即可,Presets选择localhost ipv4 all,这里我根据实际情况做了调整。配置相应的功能后单击start按钮,等待按钮变成stop以及测试中按钮旁边出现小绿点时,工具则启用成功。(备注:这里 filter 中提供的语句会被直接作为参数提供给 WinDivert。语法在 WinDivert 的文档中有详细的描述)
使用工具模拟网路延时,这里对同局域网的ip(192.168.0.142)网络延时100ms,用Ping命令来进行前后效果的对比演示:
使用工具模拟网络掉包,随机将10%的数据包丢弃(由于我发起的次数过少原因,下面实际丢包率为20%)
使用工具模拟网络节流,将20%的数据节流100ms
使用工具模拟网络重发(Duplicate),模拟网络乱序(Out of order),模拟网络篡改(Tamper)与前面类似,大家可以动手使用Ping命令来实践尝试下,把Ping的次数(如 -n 20)设置大点,仔细观察就能发现其中的差别,这里我就不把图一一贴出来了。
通过异常网络测试的过程模拟,可以雁阵业务处理是否正确,比如检查数据库数据是否正确,数据库与文件库是否一致,文件库是否出现较多的垃圾文件,垃圾文件是否有清理机制等等。
3、Linux下的网络异常模拟方法
netem 是Linux 2.6 及以上内核版本提供的一个网络模拟功能模块。该功能模块可以用来在性能良好的局域网中,模拟出复杂的互联网传输性能,诸如低带宽、传输延迟、丢包等等情况。使用 Linux 2.6 (或以上) 版本内核的很多发行版 Linux 都开启了该内核功能,比如 Fedora、Ubuntu、Redhat、OpenSuse、CentOS、Debian 等等。 tc是Linux系统中的一个工具,全名为 traffic control(流量控制)。tc 可以用来控制netem 的工作模式,也就是说如果想使用 netem,需要至少两个条件,一个是内核中的 netem 功能被包含,另一个是要有tc 。