一、Clumsy 是什么?
Clumsy 是一个开源的网络故障模拟工具,最早由一位名叫 Jagt 的开发者创建,发布在 GitHub 上。它的设计初衷非常直接明确——为开发者提供一种简单的方式,在本地制造网络问题,以测试程序的容错和健壮性。
Clumsy 的全名不是'Clumsy Network Simulator'之类的官方命名,而是源自英文单词 clumsy,意为'笨拙的、不灵活的',象征它有意'把你的网络搞砸',让一切连接变得不那么顺畅——这正是测试网络稳定性所需要的一部分。
Clumsy 是一款开源的网络故障模拟工具,用于在本地制造网络问题以测试程序容错性。支持延迟、丢包、限速等模拟功能。介绍其下载启动、界面功能、常用场景及测试体系搭建方法,涵盖本地服务、弱网环境及 TCP 连接健壮性测试,并提供参数设置参考与常见问题解答。

Clumsy 是一个开源的网络故障模拟工具,最早由一位名叫 Jagt 的开发者创建,发布在 GitHub 上。它的设计初衷非常直接明确——为开发者提供一种简单的方式,在本地制造网络问题,以测试程序的容错和健壮性。
Clumsy 的全名不是'Clumsy Network Simulator'之类的官方命名,而是源自英文单词 clumsy,意为'笨拙的、不灵活的',象征它有意'把你的网络搞砸',让一切连接变得不那么顺畅——这正是测试网络稳定性所需要的一部分。
在开发和测试过程中,网络问题常常是'隐形杀手',因为网络问题不像功能 Bug 那样容易被发现——它不会立刻报错、也不一定复现得出来,但是一旦出现问题,往往更致命,比如:
这些问题直接影响用户体验甚至业务逻辑。所以,网络问题常常在你最不注意的地方悄悄埋雷,直到正式部署交付的时候才爆炸,把你从休息日炸出来修 BUG。
为了避免部署后出现突发问题,我们需要在开发和测试阶段尽可能的模拟一下用户实际的使用环境,并借助工具来模拟环境的异常情况,发现问题 - 解决问题,保证我们的程序能稳定运行。
为了模拟网络异常的环境,我们需要借助 Clumsy 这个工具来实现,它可以模拟现实中最常见、最麻烦的几种网络问题:网络延迟不稳定、丢包、接收不到消息、突发断网或断流、重复发送数据。。。并且它还有以下几个优势:
总之,Clumsy 是一个非常实用的'反面测试工具':它不是帮你证明系统能跑,而是帮你发现系统'跑不起来'的边界条件。
访问 Clumsy 的 GitHub 页面:GitHub 链接

点击图中的【Releases】

根据系统版本下载对应的软件压缩包,解压后得到一个文件夹:

注意事项:
双击【clumsy.exe】启动软件,界面如下:

上图是 Clumsy 的主页面截图,可以看到它的界面主要分为三个部分:Filtering(过滤器)、Functions(功能选项)和 NOTICE(提示说明区域)
作用:告诉 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 按钮可以停止拦截。


启动状态按钮前方的绿色指示灯会闪烁,表示网络拦截正在生效。

这是 Clumsy 的核心功能区域,控制你希望模拟哪种网络问题。每项都可以单独启用,也可以多个一起组合使用。 每一行功能结构基本一致:
| 功能名 | 用途说明 | 常用用途示例 |
|---|---|---|
| Lag | 模拟网络延迟,单位是毫秒(ms) | 测试加载时间、用户操作卡顿 |
| Drop | 模拟数据包丢失,设置丢包概率(%) | 测试消息丢失、重传机制 |
| Throttle | 控制吞吐速度,模拟带宽拥堵 | 视频卡顿、文件慢传测试 |
| Duplicate | 模拟重复数据包,设置重复次数 | 测试去重算法、消息唯一性 |
| Out of order | 模拟数据包乱序到达 | 验证 TCP 或协议容错能力 |
| Tamper | 对网络传输中的数据包进行伪造或篡改 | 一般用于测试系统是否对异常或恶意数据有防护能力 |
| Set TCP RST | 主动发送 TCP RST 包,强制中断连接 | 模拟断线、强制退出 |
| Bandwidth | 限制带宽(单位 KB/s) | 模拟窄带网络(如 2G/3G) |
每项功能的右侧有多个可调参数,如:

这部分是对过滤设置的一些补充说明,尤其是捕获本机(localhost)流量时的限制。 截图内容意思为:当你测试的是回环地址(如 127.0.0.1),不能使用 Inbound 过滤条件。也就是说,如果你模拟本地服务器或自己机器的服务,只能用 outbound 来测试。
以下是推荐的几个实用场景示例
背景:在本机运行了一个 Web 服务或后端接口(比如 127.0.0.1:8080),想验证当客户端网络变差时,服务是否能处理超时、重试等逻辑。 设置: Preset:localhost ipv4 tcp(拦截所有本机 IPv4 回环地址的数据流) Lag:500ms(500 毫秒延迟) Drop:10%(10% 的丢包率) Throttle:Timeframe: 30ms;Chance: 30%;Drop Throttled: 不勾选(模拟延迟但不丢包)
测试的目标:
背景: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%(数据包乱序的概率)
测试的目标:
背景:程序需要长时间维持 TCP 连接(如长连接、心跳机制),想看突然断网或重连是否正常恢复。 设置: Preset:tcp ipv4 against 服务端口号(拦截所有走特定端口的 IPv4 数据) Set TCP RST:通过点击 [RST next packet] 立即断开 TCP 连接 Drop:10%(10% 的丢包率) Tamper:勾选 Redo Checksum,10%(篡改数据包,模拟数据解析异常情况)
测试的目标:
如果你所在的公司和我一样,过去并没有系统地做过网络异常模拟测试,那么你作为测试人员要推动这件事,可以参考下面这几个步骤,从无到有逐步落地:
在开始测试前,先明确你想解决的问题:
根据常见网络异常,确定你的测试维度,常见如下:
| 网络现象 | 对应 Clumsy 功能 |
|---|---|
| 网络延迟 | Lag |
| 丢包 | Drop |
| 乱序 | Out of Order |
| 带宽受限 | Throttle, Bandwidth |
| 重复包 | Duplicate |
| TCP 中断 | Set TCP RST |
| 数据篡改 | Tamper |
每个维度建议至少设计 2~3 个强度等级:正常 / 较弱网 / 极端弱网。
用常规测试用例的结构来编写即可,如下示例:
用例编号:NET_001 测试目标:验证订单支付流程在中度延迟(Lag 200ms)情况下是否可用 前置条件:用户已登录并选好商品 步骤:
预期结果:
可以先在几个关键路径和节点写好用例,后续再慢慢补充其它边角逻辑。
可以在团队内建立以下几个标准化内容:
让团队成员都能快速上手,同时保障测试的一致性和可复现性。
以下是一些可用的网络异常测试的常用指标,可供参考:
| 编号 | 测试项 | 参数设置 | 设置说明及原因 |
|---|---|---|---|
| 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 超时 | 验证系统连接机制是否健壮,支持重新发现设备或提供提示/恢复机制,避免死链问题。 |
是的,Clumsy 目前仅支持 Windows 系统(依赖 WinDivert 驱动)。在 Linux 上可使用类似工具如 tc、netem、dummynet 等。
是的。Clumsy 会以全局方式 Hook 网络层(WinDivert 驱动),因此它对所有通过网卡走的 TCP/UDP 流量都生效。建议测试时只运行目标程序,避免干扰其他软件。
完全可以。WebSocket 底层依赖 TCP 连接,所以 Clumsy 对 TCP 包的延迟、丢包等设置都会直接影响 WebSocket 的表现,非常适合做实时控制和视频流的异常测试。

建议使用 ping 命令,ping 想要测试的设备地址,查看其延迟和丢包率是否与设置的异常情况一致。
不会。Clumsy 是一个基于 WinDivert 的临时网络拦截工具,只在运行时生效,不会永久更改系统网络配置或驱动。关闭 Clumsy 后,网络会立即恢复正常。
请检查以下几点:
Clumsy 只能干扰经过运行 Clumsy 的设备的网络消息,如果两个移动设备通讯的网络消息未经过运行 Clumsy 的设备则无法干扰。 这种情况我们可以在运行 Clumsy 的设备上开启一个移动热点,构建一个局域网,要测试的两台移动设备连接到这个局域网中进行通讯,此时运行 Clumsy 即可干扰这两个移动设备间的网络通讯。
Clumsy 本质上是一个基于 WinDivert 的 GUI 工具,它通过拦截、修改、重注入网络数据包来模拟网络异常。 它的核心原理可以简要概括为:
架构图:

WinDivert 是一个开源的 Windows 平台下的网络数据包捕获与修改工具库,它允许开发者在内核态与用户态之间拦截、修改和重注入网络数据包。 简单来说,它是一种驱动级别的网络'钩子'工具,可以用于构建诸如网络调试器、防火墙、VPN、网络模拟器(比如 Clumsy)等工具的底层组件。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online