在Linux上模拟延迟和丢弃的包

我想在Linux上模拟UDPTCP的包延迟和丢失,以衡量应用程序的性能。有什么简单的方法吗?

232696 次浏览

我自己没有尝试过,但是这个页面有一个在Linux内置iptables IP过滤系统中运行的插件模块列表。其中一个模块叫做"nth",它允许您设置一个规则,该规则将丢弃一个可配置的数据包速率。至少这是个不错的开始。

Iptables(8)有一个统计匹配模块,可以用来匹配每n个数据包。要删除这个包,只需添加- j下降

没多大利用已经内置在Linux和用户空间实用程序中的功能来模拟网络。这实际上就是马克的答案所指的,只不过名字不同罢了。

他们的主页上的例子已经展示了如何实现你所要求的:

例子

模拟广域网时延

这是一个最简单的例子,它只是给所有从本地以太网发出的数据包增加了一个固定的延迟。

# tc qdisc add dev eth0 root netem delay 100ms

现在,对本地网络上的主机进行一个简单的ping测试,应该显示增加了100毫秒。延迟受内核的时钟分辨率(Hz)的限制。在大多数2.4系统上,系统时钟运行在100 Hz,允许延迟增加10 ms。2.6版本为1000 ~ 100hz的配置参数。

后面的例子只是改变参数而不重新加载qdisc

真正的广域网具有可变性,因此可以添加随机变化。

# tc qdisc change dev eth0 root netem delay 100ms 10ms

这导致增加的延迟为100±10毫秒。网络延迟的变化并不是完全随机的,所以为了模拟它,还需要一个相关值。

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

这导致增加的延迟为100±10毫秒,下一个随机元素取决于上一个元素的25%。这不是真正的统计相关性,而是一个近似值。

延迟分布

通常,网络中的延迟是不均匀的。更常见的是使用一个类似正态分布的东西来描述延迟的变化。netem规程可以使用一个表来指定非均匀分布。

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

实际的表(normal, pareto, paretonormal)是作为iproute2编译的一部分生成的,并放在/usr/lib/tc中;所以我们可以根据实验数据做出自己的分布。

包丢失

在'tc'命令中以百分比为单位指定随机丢包。最小的非零值为:

2__abc0 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

这会导致千分之一(即1000个中的1个)的数据包被随机丢弃。

还可以添加可选的相关性。这使得随机数发生器不那么随机,可以用来模拟分组突发损失。

# tc qdisc change dev eth0 root netem loss 0.3% 25%

这将导致0.3%的数据包丢失,每个后续概率都取决于上一个概率的四分之一。

Probn = 0.25 × Probn - 1 + 0.75 × Random

请注意,如果你没有接口规则,你应该使用tc qdisc add;如果你已经有接口规则,你应该使用tc qdisc change。尝试在没有规则的接口上使用tc qdisc change将会给出错误RTNETLINK answers: No such file or directory

对于丢弃的包,我将简单地使用iptables和统计模块

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

以上将以1%的概率丢弃一个传入数据包。小心,任何超过0.14的东西,你们中的大多数tcp连接很可能会完全失速。

使用-D撤销:

iptables -D INPUT -m statistic --mode random --probability 0.01 -j DROP

看看man iptables,搜索“statistic"获取更多信息。

破坏者是一个易于使用的网络故障注入工具。它可以模拟:

  • 网络总分区
  • 远程服务关闭(没有监听预期的端口)
  • 延迟
  • <李>包损失 -TCP连接超时(当两个系统被一个有状态防火墙隔开时经常发生)

在科学界最常用的工具之一是DummyNet。一旦你安装了ipfw内核模块,为了在2台机器之间引入50ms的传播延迟,只需运行这些命令:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

为了引入50%的丢包,你必须运行:

./ipfw pipe 1 config plr 0.5

在这里更多细节。