一、Clumsy是什么?
Clumsy 是一个开源的网络故障模拟工具,最早由一位名叫 Jagt 的开发者创建,发布在 GitHub 上。它的设计初衷非常直接明确——为开发者提供一种简单的方式,在本地制造网络问题,以测试程序的容错和健壮性。
Clumsy 的全名不是“Clumsy Network Simulator”之类的官方命名,而是源自英文单词 clumsy,意为“笨拙的、不灵活的”,象征它有意“把你的网络搞砸”,让一切连接变得不那么顺畅——这正是测试网络稳定性所需要的一部分。
二、为什么要用Clumsy?
在开发和测试过程中,网络问题常常是“隐形杀手”,因为网络问题不像功能Bug那样容易被发现——它不会立刻报错、也不一定复现得出来,但是一旦出现问题,往往更致命,比如:
- 在办公室测试一切正常,一交付用户就报卡顿、断连、消息延迟。
- 服务端日志莫名报错,排查发现是客户端没收到响应重试了三次。
- 游戏或视频类应用,在弱网下体验非常差,但本地测试根本无法还原现场。
这些问题直接影响用户体验甚至业务逻辑。所以,网络问题常常在你最不注意的地方悄悄埋雷,直到正式部署交付的时候才爆炸,把你从休息日炸出来修BUG。
为了防止在野餐的时候被领导叫来改BUG,我们需要在开发和测试阶段尽可能的模拟一下用户实际的使用环境,并借助工具来模拟环境的异常情况,发现问题-解决问题,保证我们的程序能稳定运行。
为了模拟网络异常的环境,我们需要借助Clumsy这个工具来实现,它可以模拟现实中最常见、最麻烦的几种网络问题:网络延迟不稳定、丢包、接收不到消息、突发断网或断流、重复发送数据。。。并且它还有以下几个优势:
- 零门槛上手:无需安装,下载即用,不需要配置,不需要学复杂指令,勾选一下就能模拟网络问题。
- 真实又可控:你可以设置具体的延迟毫秒、丢包概率、影响范围(只影响某端口或全部流量)。
- 免费开源,体积小巧:完全开源,文件小于 1MB,携带方便,可放在 U 盘随身带。
- 用途广泛,不局限某类应用:适用于网页、客户端、游戏、音视频、物联网等各种应用场景,能够模拟局域网测试、调试云服务请求、检查网络协议容错等问题。
总之,Clumsy 是一个非常实用的“反面测试工具”:它不是帮你证明系统能跑,而是帮你发现系统“跑不起来”的边界条件。
三、如何使用Clumsy?
1. 下载和启动
访问 Clumsy 的 GitHub 页面:点击进入
点击图中的【Releases】
根据系统版本下载对应的软件压缩包,解压后得到一个文件夹:
- License.txt:许可证文件。开源许可证声明,包含作者版权信息以及使用条款。主要用于遵循开源协议要求。
- clumsy.exe:应用程序Clumsy的主程序。双击它即可启动图形界面,无需安装。你所有的操作(模拟丢包、延迟等)都通过这个程序来完成。
- config.txt:配置文件。一些可选的启动参数或默认设置,一般用户不需要修改。Clumsy 会读取这个文件以设置初始行为。
- WinDivert.dll:动态链接库Clumsy 所依赖的网络驱动接口库,内部用于拦截和修改网络数据包。Clumsy 本身通过它调用 WinDivert 的底层功能。
- WinDivert64.sys: 驱动文件WinDivert 的内核驱动程序(64 位),用于捕获并处理网络数据包。Clumsy 启动时会加载它,必须存在,否则功能不可用。
注意事项:
- 必须保证 clumsy.exe、WinDivert.dll 和 WinDivert64.sys 在同一目录,否则软件会无法正常工作(会提示找不到驱动或捕获失败)。
- 运行 Clumsy 需要管理员权限,否则系统层级的网络拦截不会生效(你会看到提示“请以管理员身份运行”)。
- 如果你的系统是32位的,需要相应的 WinDivert.sys 文件,而不是 WinDivert64.sys(在下载时请选择32位的版本)。
2. 基本界面说明
双击【clumsy.exe】启动软件,界面如下:
上图是Clumsy的主页面截图,可以看到它的界面主要分为三个部分:Filtering(过滤器)、Functions(功能选项)和NOTICE(提示说明区域)
2.1 Filtering: 过滤设置(过滤哪些流量)
作用:告诉Clumsy需要对那些数据进行干扰(模拟异常)。
组件:
输入框:可以输入过滤表达式,比如 udp and outbound、tcp port 8080、ip and not loopback。用于指定拦截哪些类型的流量。
Presets: 快捷选择预设过滤条件,比如 localhost ipv4 all(本地 IPv4 所有流量)。初学者建议使用预设选项。
所由预设条件如下:
预设项 | 过滤表达式 | 含义解释 |
---|---|---|
localhost ipv4 all | ip and loopback | 拦截所有本机IPv4回环地址的数据流(例如 127.0.0.1),适合本地服务测试。注意不支持 Inbound(Clumsy 限制)。 |
localhost ipv4 tcp | tcp and loopback | 拦截本地回环中的TCP通信,例如本地运行的Web服务或Socket服务。 |
localhost ipv4 udp | udp and loopback | 拦截本地回环中的UDP通信,例如本地游戏模拟、UDP服务。 |
all sending packets | outbound | 拦截所有发出的数据包(Outbound),适合模拟用户上传、请求 API、发消息等情形。 |
all receiving packets | inbound | 拦截所有接收到的数据包(Inbound),适合测试服务器返回数据延迟、丢包等。 |
all ipv4 against specific ip | 拦截发往或来自“特定IP地址”的所有IPv4数据流。可用于只干扰你测试服务器的通信。启动时会要求你输入IP。 | |
tcp ipv4 against specific ip | 拦截对特定IP的TCP 通信,例如访问某个 Web 接口、Socket 服务。 | |
udp ipv4 against specific ip | 拦截对特定IP的UDP通信,例如实时通话、UDP 游戏连接。 | |
all ipv4 against port | 拦截所有走特定端口的IPv4数据包。适合干扰单个应用端口,不影响其他服务。 | |
tcp ipv4 against port | 同上,但仅限于TCP协议。适合干扰特定Web服务、文件传输等。 | |
udp ipv4 against port | 同上,但仅限于UDP协议。适合干扰某个UDP服务(如聊天室、推流)。 | |
ipv6 all | 拦截所有 IPv6 流量,适合测试使用IPv6地址的服务。现在部分操作系统或应用默认走IPv6。 |
Start按钮: 开始拦截并应用模拟效果,等于“运行”。修改完设置后要点这个才会生效。启动后Start按钮变为Stop按钮,点击Stop按钮可以停止拦截。
启动状态按钮前方的绿色指示灯会闪烁,表示网络拦截正在生效。
2.2 Functions:功能模块(模拟哪些网络异常)
这是 Clumsy 的核心功能区域,控制你希望模拟哪种网络问题。每项都可以单独启用,也可以多个一起组合使用。
每一行功能结构基本一致:
- 复选框 ✅:是否启用该功能
- Inbound / Outbound:应用于“入站 / 出站”数据包
- 参数设置:延迟时间、丢包概率、限速值等
功能名 | 用途说明 | 常用用途示例 |
---|---|---|
Lag | 模拟网络延迟,单位是毫秒(ms) | 测试加载时间、用户操作卡顿 |
Drop | 模拟数据包丢失,设置丢包概率(%) | 测试消息丢失、重传机制 |
Throttle | 控制吞吐速度,模拟带宽拥堵 | 视频卡顿、文件慢传测试 |
Duplicate | 模拟重复数据包,设置重复次数 | 测试去重算法、消息唯一性 |
Out of order | 模拟数据包乱序到达 | 验证 TCP 或协议容错能力 |
Tamper | 对网络传输中的数据包进行伪造或篡改 | 一般用于测试系统是否对异常或恶意数据有防护能力 |
Set TCP RST | 主动发送 TCP RST 包,强制中断连接 | 模拟断线、强制退出 |
Bandwidth | 限制带宽(单位 KB/s) | 模拟窄带网络(如2G/3G) |
每项功能的右侧有多个可调参数,如:
- Delay(ms): 延迟时间(如 Lag 使用)
- Chance(%): 触发概率(如 Drop、Duplicate 等使用)
- Limit(KB/s): 带宽限制数值(Bandwidth 使用)
- Drop Throttled: 是否丢弃超出节流限制的数据包。如果勾选,超出速率的数据包会被直接丢弃;否则只是延迟发送。可以指定一个时间窗口,例如默认是 30ms,表示每 30 毫秒 Clumsy 会判断是否节流。
- Count: 指定重复发送次数,Clumsy 将某个数据包复制指定份数发送。
- Redo Checksum: 勾选后会重新计算并修复篡改后的校验和(TCP/UDP/IP 协议都涉及校验),这样,修改后的数据包就能顺利“骗过”网络协议检查机制,被对端正常接收处理,如果不勾选篡改后的数据包可能会被接收方拒收。
- RST next packet: 点击后可立即终止一个 TCP 连接。
2.3 NOTICE:底部提示栏
这部分是对过滤设置的一些补充说明,尤其是捕获本机(localhost)流量时的限制。
截图内容意思为:当你测试的是回环地址(如 127.0.0.1),不能使用 Inbound 过滤条件。也就是说,如果你模拟本地服务器或自己机器的服务,只能用 outbound 来测试。
3. 实用场景示例
以下是推荐的几个实用场景示例
3.1 本地服务在网络差时是否仍能稳定响应?
背景: 在本机运行了一个 Web 服务或后端接口(比如 127.0.0.1:8080),想验证当客户端网络变差时,服务是否能处理超时、重试等逻辑。
设置:
Preset: localhost ipv4 tcp (拦截所有本机 IPv4 回环地址的数据流)
Lag:500ms(500毫秒延迟)
Drop:10%(10%的丢包率)
Throttle:Timeframe: 30ms ;Chance: 30% ;Drop Throttled: 不勾选(模拟延迟但不丢包)
测试的目标:
- 前端或客户端是否能处理请求超时?
- 服务是否会异常崩溃?
- 用户体验是否合理(如等待页面、错误提示)?
3.2 测试弱网环境下的移动App接口调用
背景:App应用正常运行没问题,担心用户在 4G 差或 Wi-Fi 卡顿时接口调用会失败。
设置:
Preset: all ipv4 against specific 服务器IP (拦截发往或来自“指定IP地址”的所有IPv4 数据流)
Lag:100~300ms(延迟)
Drop:10%(10%的丢包率)
Throttle:Timeframe: 30ms ;Chance: 30% ;Drop Throttled: 不勾选(模拟延迟但不丢包)
Out of order:10%(数据包乱序的概率)
测试的目标:
- SDK 是否支持断线重连、超时重试?
- 用户数据是否丢失?
- 异常提示是否准确?
3.3 测试TCP服务在断网或网络抖动下的健壮性
背景:程序需要长时间维持TCP连接(如长连接、心跳机制),想看突然断网或重连是否正常恢复。
设置:
Preset: tcp ipv4 against 服务端口号(拦截所有走特定端口的IPv4数据)
Set TCP RST:通过点击[RST next packet]立即断开 TCP 连接
Drop:10%(10%的丢包率)
Tamper:勾选Redo Checksum,10%(篡改数据包,模拟数据解析异常情况)
测试的目标:
- 程序是否能自动重连?
- 会不会导致崩溃或数据丢失?
- UI 提示是否合理?
四、如何从0开始用Clumsy建立网络异常测试体系?
如果你所在的公司和我一样,过去并没有系统地做过网络异常模拟测试,那么你作为测试人员要推动这件事,可以参考下面这几个步骤,从无到有逐步落地:
第一步:明确测试目标,划定边界
在开始测试前,先明确你想解决的问题:
- 你的产品/系统是否依赖网络?在哪些环节?
- 哪些功能在网络波动时最容易出错?(例如:登录、设备连接、实时同步等)
- 你是希望做冒烟测试,还是做系统性的稳定性评估?
第二步:规划测试维度 & 使用 Clumsy 对应功能
根据常见网络异常,确定你的测试维度,常见如下:
网络现象 | 对应 Clumsy 功能 |
---|---|
网络延迟 | Lag |
丢包 | Drop |
乱序 | Out of Order |
带宽受限 | Throttle, Bandwidth |
重复包 | Duplicate |
TCP 中断 | Set TCP RST |
数据篡改 | Tamper |
每个维度建议至少设计 2~3 个强度等级:正常 / 较弱网 / 极端弱网。
第三步:编写测试用例
用常规测试用例的结构来编写即可,如下示例:
用例编号:NET_001
测试目标:验证订单支付流程在中度延迟(Lag 200ms)情况下是否可用
前置条件:用户已登录并选好商品
步骤:
- 打开 Clumsy,启用 Lag,设置为 200ms,勾选 Inbound + Outbound;
- 在 App/Web 中进行下单支付;
- 观察是否超时、卡顿、订单是否成功;
预期结果:
- 页面无明显崩溃;
- 支付能正确完成或提示网络不稳定并重试;
可以先在几个关键路径和节点写好用例,后续再慢慢补充其它边角逻辑。
第四步:整理测试模板,团队共用
可以在团队内建立以下几个标准化内容:
- 一个 Clumsy 参数设置参考表(不同场景用哪些参数)
- 一套通用测试用例模板(如上)
- 一个简单的使用录屏(怎么打开 Clumsy、怎么开始测试)
- 一个“异常网络环境级别定义文档”(例如:轻度、中度、严重)
让团队成员都能快速上手,同时保障测试的一致性和可复现性。
第五步:总结 bug 和优化建议,形成闭环
- 在测试中记录下“哪些功能在什么网络条件下出问题”;
- 与开发协作优化,比如增加错误重试机制、延迟提示、降级处理等;
- 最终输出一份《网络异常场景测试报告》,推动产品优化升级,提高用户体验。
网络异常测试参数设置表(符合医疗器械软件测试规范)
以下是一些可用的网络异常测试的常用指标,可供参考:
编号 | 测试项 | 参数设置 | 设置说明及原因 |
---|---|---|---|
1 | 延迟(Latency) | 100ms / 200ms / 500ms / 800ms / 1000ms | 医疗场景对响应时间要求较高,尤其是远程指令交互和训练反馈,必须验证在不同延迟下系统能否稳定运行。特别是 ≤200ms 是关键响应指标。 |
2 | 丢包(Packet Loss) | 1% / 5% / 10% / 15% | 无线网络易出现丢包,医疗系统应保证在 10% 以内仍稳定运行。>10% 用于测试系统的容错与报警能力。 |
3 | 抖动(Jitter) | 20ms / 50ms / 100ms | 抖动是视频流与实时音频影响的关键因素。训练系统含第一视角视频与数据反馈,抖动容忍度应验证。 |
4 | 带宽限制(Throttle) | 1Mbps / 5Mbps / 10Mbps | 视频流对带宽敏感,模拟医院/家庭网络较低带宽场景,验证系统的适配能力与数据压缩策略是否有效。 |
5 | 数据包乱序(Out-of-Order) | 5% / 10% | TCP协议能处理乱序包,但UDP可能有问题。用于验证视频/命令数据乱序情况下是否恢复正常,适用于存在UDP流传输模块的系统。 |
6 | 断流(Drop Connection) | 每5分钟模拟断流3秒 | 模拟医院/家庭环境中的短时断网或WiFi切换情形,确保系统能自动重连、数据不丢失。 |
7 | 多端接入冲突 | 模拟两个PAD同时连接一台XR设备 | 验证系统在非法接入或多用户竞争时是否正确拒绝或有防冲突机制,保障数据安全与系统稳定性。 |
8 | IP变更 & DHCP丢失 | 模拟XR设备IP变更、DHCP超时 | 验证系统连接机制是否健壮,支持重新发现设备或提供提示/恢复机制,避免死链问题。 |
五、常见问题FAQ
Q1:Clumsy 是不是只能用在 Windows?
是的,Clumsy 目前仅支持 Windows 系统(依赖 WinDivert 驱动)。在 Linux 上可使用类似工具如 tc、netem、dummynet 等。
Q2:Clumsy 会影响本机所有程序的网络吗?
是的。Clumsy 会以全局方式 Hook 网络层(WinDivert 驱动),因此它对所有通过网卡走的 TCP/UDP 流量都生效。建议测试时只运行目标程序,避免干扰其他软件。
Q3:我用的是 WebSocket 协议,能用 Clumsy 测试吗?
完全可以。WebSocket 底层依赖 TCP 连接,所以 Clumsy 对 TCP 包的延迟、丢包等设置都会直接影响 WebSocket 的表现,非常适合做实时控制和视频流的异常测试。
Q4:如何判断Clumsy的设置是否生效?
建议使用ping命令,ping想要测试的设备地址,查看其延迟和丢包率是否与设置的异常情况一致。
Q5:Clumsy 会修改系统网络设置吗?
不会。Clumsy 是一个基于 WinDivert 的临时网络拦截工具,只在运行时生效,不会永久更改系统网络配置或驱动。关闭 Clumsy 后,网络会立即恢复正常。
Q6:启动 Clumsy 后没有任何效果,怎么办?
请检查以下几点:
- 是否以管理员权限运行;
- 是否勾选了具体的干预项(如 Delay / Drop);
- Preset(预设)是否选中了目标流量(如 IPv4 / TCP);
- 应用是否确实产生了网络流量;
- 是否设置了太低的概率(如Drop 10%,可能观察不到);
- 本地防火墙是否拦截了Clumsy / WinDivert。
Q7:我想验证两个移动设备之间的网络异常情况该如何操作?
Clumsy只能干扰经过运行Clumsy的设备的网络消息,如果两个移动设备通讯的网络消息未经过运行Clumsy的设备则无法干扰。
这种情况我们可以在运行Clumsy的设备上开启一个移动热点,构建一个局域网,要测试的两台移动设备连接到这个局域网中进行通讯,此时运行Clumsy即可干扰这两个移动设备间的网络通讯。
六、扩展内容
1. Clumsy的技术原理
Clumsy本质上是一个基于WinDivert的GUI 工具,它通过拦截、修改、重注入网络数据包来模拟网络异常。
它的核心原理可以简要概括为:
- 使用WinDivert驱动拦截本机进出数据包;
- 根据用户设置的规则(如延迟、丢包、乱序等)对数据包进行加工;
- 将修改后的数据包重新注入网络栈,让上层应用接收到“异常”效果;
- 不需要对目标应用或网络协议进行改动,直接作用于底层网络传输层。
架构图:
2. 什么是WinDivert
WinDivert是一个开源的Windows平台下的网络数据包捕获与修改工具库,它允许开发者在内核态与用户态之间拦截、修改和重注入网络数据包。
简单来说,它是一种驱动级别的网络“钩子”工具,可以用于构建诸如网络调试器、防火墙、VPN、网络模拟器(比如 Clumsy)等工具的底层组件。
3. 除了 Clumsy,还有哪些网络模拟工具?
- NetEm(Linux):**适用于 Linux 平台的专业网络模拟器,支持延迟、抖动、丢包、限速。
- WANem:基于虚拟机的网络环境模拟器,可以模拟复杂的广域网环境。
- NetLimiter / NetBalancer: Windows 下的流量控制和限速工具。
- Chaos Mesh / Istio: 在云原生环境下做“网络熔断”测试的方案。