在智能家居领域,由于设备经常通过MQTT协议连接云端,并且因硬件条件及其在家中的摆放位置不同,经常会遇到网络信号弱导致的频繁断连或消息传输延迟等问题。针对这一挑战,专门的弱网环境模拟工具就显得尤为重要。它们能够帮助开发者在多种网络状况下测试和优化产品性能。
在Windows平台上,我们有Clumsy这样的工具;而在Linux系统中,则可以通过tc和netem命令来实现网络环境的模拟。
🗑 Windows 弱网模拟工具
Clumsy是Windows的一个开源弱网模拟工具,基于WinDivert实现,能够模拟各种网络不良条件,如延迟、丢包、流量限制、数据包重复、乱序和篡改。它通过操作系统级别拦截网络数据包来工作,允许用户在不改变网络硬件或使用复杂模拟器的情况下,测试软件在各种网络环境下的表现。这对于开发网络应用程序和游戏的开发者来说非常有用,因为它可以帮助他们理解和改进他们的应用程序在不理想的网络条件下的性能和稳定性。
Clumsy官方仓库地址:https://github.com/jagt/clumsy
首先需要到【官方下载地址】下载最新版本的软件包,目前最新为0.3版本。

根据自己电脑下载Windows64或32位的zip包,一般都是64位的。它这个-a -b -c版本是没有区别的,只是内部使用的WinDivert驱动程序签名不同。

直接下载【clumsy-0.3-win64-a.zip】,解压后即可双击exe运行。


对应选项的含义如下:
- 延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。
- 掉包(Drop),随机丢弃一些数据。
- 节流(hrottle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。
- 重发(Duplicate),随机复制一些数据并与其本身一同发送。
- 乱序(Out of order),打乱数据包发送的顺序。
- 篡改(Tamper),随机修改小部分的包裹内容。
- TCP RST攻击模拟(Set TCP RST)
- 带宽限制(BandWidth),通过限制带宽来达到不同级别宽带下的表现
可以通过配置【config.txt】文件来新增预设,比如将MQTT常用的端口添加进预设
修改后的【config.txt】文件

重新打开软件就可以看到配置了

点击【start】后,勾选需要模拟的弱网场景,然后修改参数值就可以了。这里模拟增加了MQTT的延时。

通过MQTTX上的发送接收时间可以看到确实生效了。

🔋 Linux 弱网模拟工具
tc (Traffic Control) 和 netem (Network Emulator) 是 Linux 下用于流量控制和网络模拟的强大工具,它们可以用来模拟各种网络环境,帮助开发者和测试人员评估应用在不同网络条件下的表现。下面是一个更详细的命令行介绍:tc(Traffic Control)
tc 是 Linux 内核的一部分,用于控制网络流量分发的工具。它可以用来限制带宽、排队、优先级处理以及数据包分类。tc 的功能通过以下主要组件实现:- qdisc (队列规则): 控制数据包的排队策略。每个网络接口至少有一个 qdisc,称为 root qdisc。
- class (分类): 在某些类型的 qdisc 中,可以将流量进一步分类,每个类可以有自己的队列规则。
- filter (过滤器): 将传入的数据包分配到不同的类中。基于多种标准进行匹配,如 IP 地址、端口号等。
基本命令格式
- 添加 qdisc:
sudo tc qdisc add dev <interface> root <qdisc-type> [options]
- 修改 qdisc:
sudo tc qdisc change dev <interface> root <qdisc-type> [options]
- 删除 qdisc:
sudo tc qdisc del dev <interface> root
- 查看 qdisc 设置:
sudo tc qdisc show dev <interface>
netem(Network Emulator)
netem 是 tc 的一个扩展,提供网络环境模拟功能,如延迟、丢包、乱序等。netem 通常作为 qdisc 使用,可以单独使用或与其他 qdisc 结合使用以提供更复杂的网络模拟。添加延迟
- 基本延迟:
sudo tc qdisc add dev <interface> root netem delay <time> <time>: 延迟时间,可以是毫秒(ms)或微秒(us)。
- 带有随机变化的延迟:
delay <time> <jitter> <correlation> <jitter>: 延迟波动值。<correlation>: 后续包延迟与前一个包延迟相似的概率。
添加丢包
sudo tc qdisc add dev <interface> root netem loss <percentage><percentage>: 丢包概率。
添加乱序
sudo tc qdisc add dev <interface> root netem reorder <percentage> <correlation> delay <time><percentage>: 以一定概率乱序的数据包比例。<correlation>: 后续包乱序的概率与前一个包相比。<time>: 延迟时间,对乱序的数据包有效。
组合使用
netem 允许组合使用上述参数来模拟更复杂的网络环境。例如,同时模拟延迟和丢包:sudo tc qdisc add dev <interface> root netem delay <time> loss <percentage>
以下是一些常见的命令使用例子,涵盖了延迟、丢包、带宽限制等场景。
1. 添加固定延迟
为网络接口添加100毫秒的固定延迟:
这个命令会导致通过
eth0 接口的所有出口流量都会经历100毫秒的延迟。2. 添加变化的延迟
为网络接口添加100毫秒的平均延迟,并让延迟在10毫秒的范围内随机变化:
这会创建一个平均延迟为100毫秒,但实际延迟在90到110毫秒之间变化的网络环境。
3. 模拟丢包
设置网络接口的数据包丢失率为1%:
这个命令会让通过
eth0 接口的所有出口流量有1%的丢包率。4. 模拟包乱序
添加10%的数据包乱序,有5%的概率乱序发生,延迟为100毫秒:
这个命令设置网络环境,使得有10%的数据包会被乱序处理,乱序的发生概率为5%,并且所有数据包都会经历100毫秒的延迟。
5. 限制带宽
使用HTB (Hierarchical Token Bucket) 限制网络接口的带宽为1Mbps:
这组命令首先在
eth0 上创建了一个HTB qdisc,然后设置了一个带宽为1Mbps的类。6. 删除tc设置
移除已经设置的
tc 规则:这个命令会删除
eth0 接口上的所有 tc 配置,包括延迟、丢包、带宽限制等。📎 参考链接
《文档》
- 作者:Yibin
- 链接:https://yibin.dev/article/ffdcb350-bdf1-4134-8e56-c05287cd2115
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章











