我想在 Linux 上模拟数据包延迟和丢失,UDP
以TCP
测量应用程序的性能。有没有一种简单的方法可以做到这一点?
9 回答
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
。
对于丢弃的数据包,我只需使用 iptables 和statistic 模块。
iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP
以上将以 1% 的概率丢弃传入的数据包。小心,任何高于 0.14 和大多数 tcp 连接的东西很可能会完全停止。
查看 man iptables 并搜索“statistic”以获取更多信息。
我的一位同事使用 tc 来执行此操作。有关更多信息,请参阅手册页。您可以在此处查看其用法示例。
iptables(8) 有一个统计匹配模块,可用于匹配每个第 n 个数据包。要丢弃这个数据包,只需附加-j DROP。
本关于网络物理模拟的教程在示例代码中包含一个 C++ 类,用于模拟 UDP 连接中的延迟和数据包丢失,并且可能具有指导意义。请参阅可下载源代码的Connection.h文件中的Connection类的公共延迟和packetLoss变量。
自己没有尝试过,但是这个页面有一个在 Linux 中运行的插件模块列表,内置 iptables IP 过滤系统。其中一个模块称为“nth”,它允许您设置一个规则,该规则将丢弃可配置的数据包速率。至少可能是一个不错的起点。
一个易于使用的网络故障注入工具是Saboteur。它可以模拟:
- 总网络分区
- 远程服务死了(不在预期的端口上监听)
- 延误
- 丢包 - TCP 连接超时(当两个系统被有状态防火墙分开时经常发生)
您可以尝试http://snad.ncsl.nist.gov/nistnet/ https://www-x.antd.nist.gov/nistnet/
这是相当古老的 NIST 项目(最后发布 2005 年),但它适用于我。