1.总述
结论先写在前面:若使用veth pair,不建议直接拉取iperf3镜像用于sdn网络测试,因为sdn里要将net设为none(bridge模式下同网段的docker可以直接ping通而不经过sdn网络)。但是设置成none之后不能下载其他的功能,让配网段成了问题。这就需要提前写dockerfile做镜像了,而且需要做server和client的镜像,比较麻烦。
但是net不设置成none的时候应该是可以直接拉取用的,可以参考第二点。
总之,我选择制作一个新的可以运行iperf的ubuntu镜像来进行测试。
参考:
基本指令:iperf测试Docker网络性能_docker 使用iperf-CSDN博客
测TCP、UDP:使用iPerf进行网络吞吐量测试-CSDN博客
docker配置iperf:IPerf网络性能测试工1具_iperf 镜像-CSDN博客
iperf3网络测试工具使用方法_iperf3使用方法-CSDN博客
使用python提取iperf数据并绘制吞吐率曲线-CSDN博客
《基于 SDN 和 Docker 容器的网络虚拟化研究》徐维波
iperf实验验证及抓包分析系列之三:验证iperf3中打UDP流时报告中显示的丢包率是否准确?_iperf3丢包-CSDN博客
2.拉取镜像并配置容器(x)
2.1 拉取镜像
使用docker search命令查看dockerhub里提供的iperf相关镜像。决定使用networkstatic/iperf3镜像。
docker search iperf
然后拉取这个镜像即可
docker pull networkstatic/iperf3
2.2 运行容器
- 对于server:为确保后续实验顺利进行,必须先行配置好权限和网络设置。若未开启权限,将无法进行网络地址分配。同时,网络设置需选择"none",否则Docker容器将能自行连接网络,而无需通过SDN网络连接。因此,合理配置权限和网络是实验顺利进行的前提。
- 需要在结尾加上-s(server) 可以创建docker容器,但是容器会对后续配置ip有影响。
- 在结尾加上-c(client)后面还要添加serverip。
docker run -itd --name test01 --net=none --privileged=true -p 5201:5201 networkstatic/iperf3 -s
docker run -itd --name test02 --net=none --privileged=true -p 5202:5201 networkstatic/iperf3 -c
2.3 将容器连入sdn网络
考虑到ovs-docker命令创建的连接,在ovs显示的名称是一段乱码,不能自行命名;我这里采用veth pair进行连接。具体步骤请参考我写的4我写的4我写的4
3.制作ubuntu镜像,添加iperf功能(✔)
首先需要说明的是:我已经使用了一个预先配置好的包含ifconfig
和ping
工具的Ubuntu Docker镜像(步骤参考我写的2),并且利用commit
命令简单地向其中添加了iperf3
工具。然而,标准做法是通过编写Dockerfile来自动化构建镜像,这样可以确保构建过程的可重复性和可维护性。
3.1 制作新镜像
#运行并进入容器
docker run -itd --name iperfimage myubuntu:host
docker exec -it iperfimage /bin/bash
#在容器内装iperf3
apt-get update
apt install iperf3
#检查是否安装成功
iperf3 -v
#commit为容器
exit
docker commit iperfimage myubuntu:iperf
3.2 使用镜像创建server和client
这里不知道是什么原因,不需要增加-s,-c的后缀也可以正常打开了
docker run -itd --privileged=true --net=none --name test01 myubuntu:iperf
docker run -itd --privileged=true --net=none --name test02 myubuntu:iperf
3.3 将两个测试的容器添加至sdn网络中(代码略,具体步骤参考我写的4)
在ODL的web界面看到了连接的拓扑结构如下:
4.使用iperf监控sdn网络的通信指标
4.1测试带宽
将两个容器分别指定为server和client,测试带宽:
#server
iperf3 -s
#client
iperf3 -c 10.1.1.1 -p 5201 -f m -i 1 -t 5 -O 3 -R
-c 10.1.1.1
: 指定iperf3
客户端要连接的服务器 IP 地址为10.1.1.1
。-p 5201
: 指定连接到服务器上的端口号为5201
。默认情况下,iperf3
服务器监听在5201
端口,但这里明确指定了端口号以确保正确性。-f m
: 指定报告带宽的格式为 Mbps(兆比特每秒)。这样输出的结果将以 Mbps 为单位。-i 1
: 设置报告间隔为 1 秒。也就是说,iperf3
每秒会输出一次测试结果的统计信息。-t 5
: 设置测试时间为 5 秒。测试将在开始后持续 5 秒,然后结束。-O 3
: 在测试开始前先预热 3 秒。预热期间,客户端和服务器会建立连接并准备进行数据传输,但预热期间的数据不会被计入最终的测试结果。这有助于消除因建立连接和网络延迟等初始开销对测试结果的影响。-R
: 运行在反向模式。在反向模式下,服务器会向客户端发送数据,而不是客户端向服务器发送数据。这通常用于测试服务器上传带宽的能力。(解释来自文心一言)
4.2 TCP
#server
iperf3 -s
#client
iperf3 -c 10.1.1.1 -p 5201 -f m -i 1 -t 5 -O 3
4.3 UDP
#server
iperf3 -s
#client
iperf3 -c 10.1.1.1 -p 5201 -f m -i 1 -t 5 -O 3 -u
比较UDP和TCP的数据会发现:对于sdn网络下的同一链路,UDP利用了更多的带宽而传输的数据量明显少于TCP。
4.4 丢包率
使用tc命令指定端口的丢包率,并且使用ping命令查看。
tc qdisc add dev veth01 root netem loss 8%
ping 10.1.1.2
tc qdisc del dev veth01 root
tc qdisc add dev veth01 root netem loss 0%
ping 10.1.1.2
设置成8%丢包率,ping的情况
设置成0%丢包率,ping的情况