Mininet简介

Mininet是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,它采用轻量级的虚拟化技术使得系统可以和真实网络相媲美。

Mininet可以很方便地创建一个支持SDN的网络:host就像真实的电脑一样工作,可以使用ssh登录,启动应用程序,程序可以向以太网端口发送数据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。

Mininet的特性

  • 可以简单、迅速地创建一个支持用户自定义的网络拓扑,缩短开发测试周期
  • 可以运行真实的程序,在Linux上运行的程序基本上可以都可以在Mininet上运行,如Wireshark
  • Mininet支持Openflow,在Mininet上运行的代码可以轻松移植到支持OpenFlow的硬件设备上
  • Mininet可以在自己的电脑,或服务器,或虚拟机,或者云(例如Amazon EC2)上运行
  • Mininet提供python API,简单易用
  • Mininet是开源项目,源代码在这里:https://github.com/mininet

实验内容

学习使用mininet基本命令

mininet命令参数分为三大类:

  • 用于创建网络拓扑结构的命令参数;
  • 用于查看现有(或创建好的)网络拓扑中的各个节点(设备)的网络状态(ip地址、连通性等信息);
  • 用于修改当前网络拓扑,对已有的设备进行增删改查操作。

实验1. 查看现有网络拓扑中的节点网络状态的命令参数

1.0 启动 openvswitch

1
# service openvswitch-switch start

image-20230401170709496

1.1 net

查看链路信息,两个设备之间的之间连线,称为一个链路,链路是双向的

1
2
3
4
5
6
# mn
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0
c0

image-20230401170720554

1.2 nodes

查看有哪些可用节点

1
2
3
mininet> nodes
available nodes are:
c0 h1 h2 s1

image-20230401170728707

检测链路是否正常工作

1
2
3
mininet> links
h1-eth0<->s1-eth1 (OK OK)
h2-eth0<->s1-eth2 (OK OK)

image-20230401170736067

1.4 pingall

检测各个主机之间的连通性

1
mininet> pingall

image-20230401170743338

1.5 pingpair

检测前两个主机的连通性

1
mininet> pingpair

image-20230401170751061

1.6 dump

查看节点信息

1
2
3
4
5
mininet> dump
<Host h1: h1-eth0:10.0.0.1 pid=524>
<Host h2: h2-eth0:10.0.0.2 pid=526>
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None pid=531>
<Controller c0: 127.0.0.1:6633 pid=516>

image-20230401170801729

1.7 exit

退出mininet命令模式

1
mininet> exit

image-20230401170808153

实验2. 创建网络拓扑结构的命令参数

1 –topo

可以创建具有一定规则的网络拓扑结构,也可以创建自定义的网络拓扑结构。

1.1 single topo:

1
# mn --topo=single,3

image-20230401170815984

表示创建单个交换机3个主机的拓扑网络结构,如下图:

image-20230401170825192

links用于查看链路连通性

1
2
3
4
mininet> links
h1-eth0<->s1-eth1 (OK OK)
h2-eth0<->s1-eth2 (OK OK)
h3-eth0<->s1-eth3 (OK OK)

image-20230401170836896

dump查看节点信息

1
2
3
4
5
6
mininet> dump
<Host h1: h1-eth0:10.0.0.1 pid=410>
<Host h2: h2-eth0:10.0.0.2 pid=412>
<Host h3: h3-eth0:10.0.0.3 pid=414>
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None,s1-eth3:None pid=419>
<Controller c0: 127.0.0.1:6633 pid=402>

image-20230401170851765

exit 退出 mininet 命令模式

1
mininet> exit

img

1.2 linear topo

1
# mn --topo=linear,5

image-20230401170916218

表示创建一个如下图所示的网络拓扑:

image-20230401170931880

links用于查看链路连通性

1
mininet> links

image-20230401170942540

dump查看节点信息

1
mininet> dump

img

exit 退出 mininet 命令模式

1
mininet> exit

img

1.3 tree topo

1
# mn --topo=tree,depth=2,fanout=3

image-20230401171000025

表示创建了一个如下图所示的网络拓扑:

图片包含 形状  描述已自动生成

links用于查看链路连通性

1
mininet> links

image-20230401171011716

dump查看节点信息

1
mininet> dump

image-20230401171022715

exit 退出 mininet 命令模式

1
mininet> exit

img

2. –switch

定义网络拓扑要使用的交换机。

后面可以接的参数有:ovsk、ovsbr、ivs、lxbr、user,前面三种均为OVS型交换机,后面两种分别为内核型(linux bridge)和用户型(user)交换机。

交换机分类3类:用户型、内核型和OVS型,其中内核型和OVS型的吞吐量比用户性大很多,因此一般采用后两种。可以测试三者的TCP bandwidth(区别UDP bandwidth):

内核型吞吐量测试

1
2
3
4
5
6
# mn --test iperf
部分输出结果如下:
*** Iperf: testing TCP bandwidth between h1 and h2
*** Results: ['20.4 Gbits/sec', '20.4 Gbits/sec']
*** Stopping 1 controllers
completed in 10.558 seconds

img

OVS型吞吐量测试

1
2
3
4
5
# mn --switch ovsk --test iperf
部分输出结果如下:
*** Iperf: testing TCP bandwidth between h1 and h2
*** Results: ['24.7 Gbits/sec', '24.8 Gbits/sec']
*** Stopping 1 controllers

img

3. –mac

使用这个参数可以让MAC地址从小到达排列,使得复杂的网络更清晰,容易辨识各个组件的MAC地址。不使用这个参数的话,复杂的网络容易混乱。

实验3. 修改当前网络拓扑的命令参数

禁用/开启两个节点之间的链路

1
2
3
# mn
mininet> link h2 s1 down
mininet> link h2 s1 up

img

2. iperf

测试两个主机之间的TCP带宽

1
2
3
mininet> iperf
*** Iperf: testing TCP bandwidth between h1 and h2
*** Results: ['22.1 Gbits/sec', '22.1 Gbits/sec']

image-20230401171058961

3. iperfudp

测试两个主机之间的UDP带宽

1
2
3
mininet> iperfudp
*** Iperf: testing UDP bandwidth between h1 and h2
*** Results: ['10M', '10.0 Mbits/sec', '10.0 Mbits/sec']

image-20230401171115259

4. dpctl

对所有交换机操作流表,包括流表的显示、添加、修改、删除,具体用法,参考

5. xterm

如xterm h1打开主机h1的操作窗口