275

我想在 Linux 上模拟数据包延迟和丢失,UDPTCP测量应用程序的性能。有没有一种简单的方法可以做到这一点?

4

9 回答 9

353

netem利用 Linux 和用户空间实用程序中已经内置的功能来模拟网络。这实际上是马克的答案所指的,但名称不同。

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

例子

模拟广域网延迟

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

# 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%(即千分之一)的数据包被随机丢弃。

也可以添加可选的相关性。这会导致随机数生成器的随机性降低,并可用于模拟数据包突发丢失。

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

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

概率n = 0.25 × 概率n-1 + 0.75 × 随机

请注意tc qdisc add,如果您没有该接口的规则或者tc qdisc change您已经有该接口的规则,则应使用该接口。尝试tc qdisc change在没有规则的界面上使用会报错RTNETLINK answers: No such file or directory

于 2009-03-05T17:28:50.333 回答
101

对于丢弃的数据包,我只需使用 iptables 和statistic 模块

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

以上将以 1% 的概率丢弃传入的数据包。小心,任何高于 0.14 和大多数 tcp 连接的东西很可能会完全停止。

查看 man iptables 并搜索“statistic”以获取更多信息。

于 2009-07-06T18:17:34.563 回答
6

我的一位同事使用 tc 来执行此操作。有关更多信息,请参阅手册页。您可以在此处查看其用法示例。

于 2009-03-05T15:13:01.050 回答
6

iptables(8) 有一个统计匹配模块,可用于匹配每个第 n 个数据包。要丢弃这个数据包,只需附加-j DROP

于 2009-03-05T14:20:36.120 回答
3

关于网络物理模拟的教程在示例代码中包含一个 C++ 类,用于模拟 UDP 连接中的延迟和数据包丢失,并且可能具有指导意义。请参阅可下载源代码的Connection.h文件中的Connection类的公共延迟packetLoss变量。

于 2009-03-05T14:10:20.217 回答
1

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

于 2009-03-05T13:48:16.683 回答
1

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

  • 总网络分区
  • 远程服务死了(不在预期的端口上监听)
  • 延误
  • 丢包 - TCP 连接超时(当两个系统被有状态防火墙分开时经常发生)
于 2016-04-11T11:34:51.970 回答
1

科学界为此目的最常用的工具之一是DummyNet。安装ipfw内核模块后,为了在两台机器之间引入 50 毫秒的传播延迟,只需运行以下命令:

./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

这里有更多细节。

于 2016-04-11T11:50:00.400 回答
0

您可以尝试http://snad.ncsl.nist.gov/nistnet/ https://www-x.antd.nist.gov/nistnet/ 这是相当古老的 NIST 项目(最后发布 2005 年),但它适用于我。

于 2009-10-23T16:43:07.960 回答