我想在Linux上模拟UDP
和TCP
的数据包延迟和丢失,以衡量应用程序的性能。有一种简单的方法可以做到这一点吗?
答案 0 :(得分:296)
netem利用已经内置在Linux和用户空间实用程序中的功能来模拟网络。这实际上是马克的答案所指的不同名称。
their homepage上的示例已经展示了如何实现您的要求:
实施例
模拟广域网延迟
这是最简单的例子,它只是为从本地以太网发出的所有数据包增加了一定量的延迟。
# tc qdisc add dev eth0 root netem delay 100ms
现在,在本地网络上进行主机的简单ping测试应显示增加100毫秒。延迟受内核时钟分辨率(Hz)的限制。在大多数2.4系统中,系统时钟以100 Hz运行,允许延迟增量为10 ms。在2.6上,该值是1000到100 Hz的配置参数。
后面的示例只是更改参数而不重新加载qdisc
真正的广域网显示出可变性,因此可以添加随机变化。
# tc qdisc change dev eth0 root netem delay 100ms 10ms
这导致增加的延迟为100±10 ms。网络延迟变化不是纯粹随机的,因此要模拟相关值。
# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%
这导致增加的延迟为100±10 ms,下一个随机元素取决于最后一个随机元素的25%。这不是真正的统计相关性,而是近似值。
延迟分发
通常,网络中的延迟不均匀。使用类似正态分布的东西来描述延迟的变化更为常见。 netem规则可以采用表格来指定非均匀分布。
# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal
实际表(normal,pareto,paretonormal)作为iproute2编译的一部分生成并放在/ usr / lib / tc中;所以可以通过一些努力根据实验数据进行自己的分发。
丢包
随机数据包丢失在'tc'命令中以百分比形式指定。最小可能的非零值是:
2 -32 = 0.0000000232%
# tc qdisc change dev eth0 root netem loss 0.1%
这导致1/10百分比(即1000个中的1个)数据包被随机丢弃。
还可以添加可选的关联。这会使随机数发生器的随机性降低,并可用于模拟数据包突发丢失。
# tc qdisc change dev eth0 root netem loss 0.3% 25%
这将导致0.3%的数据包丢失,并且每个连续概率取决于最后一个数据包的四分之一。
Prob n = 0.25×Prob n-1 + 0.75×Random
注意如果您没有该接口的规则,则应使用tc qdisc add
;如果您已有该接口的规则,则应使用tc qdisc change
。尝试在没有规则的界面上使用tc qdisc change
会出现错误 RTNETLINK answers: No such file or directory
。
答案 1 :(得分:78)
对于丢弃的数据包,我只需使用iptables和statistic module。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
以上将以1%的概率丢弃传入的数据包。要小心,大约0.14以上的任何东西,大多数人tcp连接很可能完全停止。
查看man iptables并搜索“statistic”以获取更多信息。
答案 2 :(得分:7)
我的一位同事使用tc来做到这一点。有关更多信息,请参见手册页。您可以看到其使用情况的示例here。
答案 3 :(得分:5)
iptables(8)有一个统计模块,可用于匹配每个第n个数据包。要删除此数据包,只需附加 -j DROP 。
答案 4 :(得分:3)
此tutorial on networking physics simulations包含sample code中的C ++类,用于模拟UDP连接中的延迟和数据包丢失,可能具有指导意义。请参阅{{Connection> 文件中找到的 Connection 类的公共延迟和 packetLoss 变量{{ 3}}
答案 5 :(得分:1)
我自己没有尝试过,但this page有一个插件模块列表,这些模块在Linux内置的iptables IP过滤系统中运行。其中一个模块称为“nth”,允许您设置一个规则,该规则将丢弃可配置的数据包速率。至少可能是一个好的开始。
答案 6 :(得分:1)
您可以尝试http://snad.ncsl.nist.gov/nistnet/ 这是一个非常古老的NIST项目(2005年最后一个版本),但它对我有用。
答案 7 :(得分:1)
易于使用的网络故障注入工具是Saboteur。它可以模拟:
- 总网络分区
- 远程服务已停止(未在预期端口上侦听)
- 时滞
- 数据包丢失 -TCP连接超时(通常在两个系统被状态防火墙隔开时发生)