一、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 allip and loopback拦截所有本机IPv4回环地址的数据流(例如 127.0.0.1),适合本地服务测试。注意不支持 Inbound(Clumsy 限制)。localhost ipv4 tcptcp and loopback拦截本地回环中的TCP通信,例如本地运行的Web服务或Socket服务。localhost ipv4 udpudp and loopback拦截本地回环中的UDP通信,例如本地游戏模拟、UDP服务。all sending packetsoutbound拦截所有发出的数据包(Outbound),适合模拟用户上传、请求 API、发消息等情形。all receiving packetsinbound拦截所有接收到的数据包(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重复包DuplicateTCP 中断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设备验证系统在非法接入或多用户竞争时是否正确拒绝或有防冲突机制,保障数据安全与系统稳定性。8IP变更 & 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: 在云原生环境下做“网络熔断”测试的方案。