clumsy一款模拟弱网的工具

近期工作需要模拟弱网、丢包、延迟等异常网络场景,终于找到一款简单易用的软件:clumsy。

官网:https://jagt.github.io/clumsy/cn/manual.html

“利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。”

clumsy一款模拟弱网的工具

未启用clumsy前

clumsy一款模拟弱网的工具

Preset设置为“all sending packets”,即“所有从本机发出的数据包”,则过滤规则Filtering会自动显示为“outbound”

设置延迟100ms(勾选Lag并设置为100),随机丢包率10%(勾选Drop并设置为10.0)

点击【Start】启动

可以看出很快就生效了,根据官网的解释,实际延迟会比预设值要大。

clumsy一款模拟弱网的工具

以下摘自官网:

    延迟(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 数据段长度