clumsy一款模拟弱网的工具
近期工作需要模拟弱网、丢包、延迟等异常网络场景,终于找到一款简单易用的软件:clumsy。
官网:https://jagt.github.io/clumsy/cn/manual.html
“利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。”
未启用clumsy前
Preset设置为“all sending packets”,即“所有从本机发出的数据包”,则过滤规则Filtering会自动显示为“outbound”
设置延迟100ms(勾选Lag并设置为100),随机丢包率10%(勾选Drop并设置为10.0)
点击【Start】启动
可以看出很快就生效了,根据官网的解释,实际延迟会比预设值要大。
以下摘自官网:
延迟(Lag),把数据包缓存一段时间后再发出,这样能够模拟网络延迟的状况。
掉包(Drop),随机丢弃一些数据。
节流(Throttle),把一小段时间内的数据拦截下来后再在之后的同一时间一同发出去。
重发(Duplicate),随机复制一些数据并与其本身一同发送。
乱序(Out of order),打乱数据包发送的顺序。
篡改(Tamper),随机修改小部分的包裹内容。
Filter 语法
这里 filter 中提供的语句会被直接作为参数提供给 WinDivert。语法在 WinDivert 的文档中有详细的描述。如果你写过一点程序你会发现这个语法跟你放在 if 里面的判断表达式非常类似。你可以用 and, or, not 和 括号 来表达简单的逻辑规则。类似 =, !=, ‹, › 的操作符也可以被使用。下面是 filter 中可以使用的变量的列表(直接拷贝自 WinDivert 的文档)。你也可以通过以预设的 filter 作为例子参考。
outbound 是否为输出数据包
inbound 是否为输入数据包
ifIdx 网络设备 index
subIfIdx 副网络设备 index
ip 是否为 IPv4
ipv6 是否为 IPv6
icmp 是否为 ICMP
icmpv6 是否为 ICMPv6
tcp 是否为 TCP
udp 是否为 UDP
ip.* IPv4 的参数 (见 DIVERT_IPHDR)
ipv6.* IPv6 的参数 (见 DIVERT_IPV6HDR)
icmp.* ICMP 的参数 (见 DIVERT_ICMPHDR)
icmpv6.* ICMPV6 的参数 (见 DIVERT_ICMPV6HDR)
tcp.* TCP 的参数 (见 DIVERT_TCPHDR)
tcp.PayloadLength TCP 数据段长度
udp.* UDP 的参数 (见 DIVERT_UDPHDR)
udp.PayloadLength UDP 数据段长度