为网络模拟发送通用 UDP 流量

网络工程 通讯协议 测试 UDP
2021-07-22 05:15:40

我需要测试一个丢弃用户指定百分比的数据包的应用程序。现在,它会丢弃任何我可以通过发送 ping 和观察 Wireshark 中的 ICMP 消息来轻松验证的数据包类型。

我想增强它,以便用户可以指定他们只想丢弃 20% 的 UDP 数据包,例如,但我不知道如何发送受控数量的 UDP 数据包以进行测试。我现在只要求发送 UDP。传输速率没有限制。我已经有来自 OSPF hello 消息的其他流量,并且还可以使用来自 ping 的 ICMP 流量来查看仅指定协议的输入百分比被丢弃。

如何使用 Linux 机器使用免费工具来测试上述 UDP 数据包丢失?

3个回答

我会看看iperf您应该能够使用iperf 中的内置报告来验证丢弃的流量。

iperf 通常在两个系统之间的网络上运行。我在两台 CentOS 机器上安装了 iperf3,如下所示,一台配置为服务器,另一台配置为客户端。

安装iperf rpm,先启动服务器,再启动客户端。启动iperf服务器就像运行以下命令一样简单:

机器 #1

iperf3 -s

-s选项指定在服务器(接收器)模式下运行iperf最初(默认情况下)服务器将侦听将用作控制通道的 5201/tcp,此端口是可配置的。确保您的iptables(或等效的)配置为适应初始控制通道和任何后续 udp 流。

您的客户端命令和传输后的后续报告将如下所示。

机器 #2

机器 #2(这个命令本质上是说“充当客户端,连接到 192.168.2.202,使用 udp 协议,以 100Mbps 的数据速率发送 1GB 数据)

$ iperf3 -c 192.168.2.202 -u -n 1G -b 100M 

Connecting to host 192.168.2.202, port 5201

[  4] local 192.168.2.160 port 54356 connected to 192.168.2.202 port 5201
[ ID] Interval           Transfer     Bandwidth

[  4]   0.00-82.00  sec  1.00 GBytes   105 Mbits/sec
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-82.00  sec  1.00 GBytes   105 Mbits/sec  5.016 ms  12372/131072 (9.4%)
[  4] Sent 131072 datagrams

这就是你需要用iperf做的所有事情

使用搜索“linux 以太网数据包生成器”使我成为第一个命中的packeth

packeth解决方案:

  • 有 GUI 和 CLI 版本
  • 不仅生成UDP,还生成许多其他协议,包括QinQ
  • 为 RedHat 打包为rpmDebian 包

netcattcpdump解决方案:

如果是我,我会做一个快速而肮脏的10 秒netcat测试,因为netcat已经安装在大多数 linux 发行版中……这是/dev/urandom通过 UDP发送 linux 文件(或在我的示例中)的示例...

在两边启动tcpdump,监听一个稀有的UDP端口(本例使用65535/udp)。我用它-s 1来减少tcpdump必须做的工作量(这意味着它捕获速度更快)。

  • tcpdump -s 1 -ni eth0 udp and port 65535

接下来,可以选择以定时结束启动您的接收器(在子外壳中将netcat部分作为背景,这样它就不会阻塞)。如果您不关心对接收到的数据进行校验和,则这实际上不是必需的。:

(nc -q 1 -u -l -p 65535 > /dev/null &); sleep 10; fuser -k 65535/udp;

然后,启动你的发射器......在这种情况下,我展示了它/dev/urandom在 udp/65535 上推送to的输出如果您愿意,请使用真实文件...

(cat /dev/urandom | nc -u <DESTINATION_IP> 65535&); sleep 10; \
    fuser -n udp ,<DESTINATION_IP>,65535 -k

确保您选择的超时时间(我在sleep 10上面使用)足够长,以便对 shell 命令进行排序并完成网络传输。如果您传输的内容不是/dev/urandom,请确保您有sleep足够的时间来完成文件传输。

完成后,停止双方的tcpdump当它退出时,您将从tcpdump获得数据包计数

[mpenning@tsunami ~]$ sudo tcpdump -s 1 -ni eth0 udp and port 65535
14:18:55.563674 [|ether]
14:18:55.563688 [|ether]

^C
2000 packets captured
2000 packets received by filter
0 packets dropped by kernel
[mpenning@tsunami ~]$

计算sender_count- receiver_count,这就是您的数据包丢失。

到目前为止,我在 Linux 上遇到的最好的数据包和流量生成器是PacketETH

您可以通过 CLI 或 GUI 使用它。它用于生成以太网帧,但您也可以指定更高的协议,例如 IPv4/6 和 TCP/UDP 等。

它非常强大,让您可以直接为第 2、3 和 4 层(例如以太网、IPv4/6、TCP/UDP)中的协议自定义几乎所有标头选项。不过,您可以发送任何更高层协议,而不仅仅是每个编程的协议,因为一旦您创建了一个以太网帧,您就可以写入有效负载,当然可以是您喜欢的任何其他更高层协议的标头和有效负载。

如果你使用 Linux 你应该拥有它,几乎知道一个人似乎知道它,它是如此强大!

您还有一些功能,例如保存您创建的自定义数据包设计并在以后重新加载它们。您也可以发送它们的“批次”,这就是您想要的 1000 个数据包的突发(例如)或以 2Mbps 的恒定速率(也作为示例)。