SDN实验-Mininet常用命令和Mininet创建网络拓扑

  • Mininet是一个开源的网络仿真器,是一个轻量级软件定义网络和测试平台,支持OpenFlow、
    OpenvSwith 等各种协议。
  • 使用Mininet可以很方便地创建一个支持SDN的网络。用户可以自定义网络拓扑,灵活地为网络添加新的功能并进行相关测试,从而缩短开发测试周期。在Mininet 上运行的代码可以轻松移植到支持OpenFlow的硬件设备上。
  • Mininet可以在自己的电脑,或服务器,或虚拟机,或者云(例如AmazonEC2)上运行。
  • Mininet提供 python APl,简单易用。

1.Mininet创建网络拓扑的常用的命令

  • -c 释放之前创建拓扑时占用的未释放的资源

  • -h 查看帮助

  • –topo 在mininet启动时通过命令行定义拓扑

  • –custom 用于创建自定义拓扑

  • –switch 定义要使用的交换机,默认使用OVSK交换机

  • –controller 定义要使用的控制器,如果没有指定则使用mininet中默认的控制器

  • –mac 自动设置设备的MAC地址,从而使MAC地址更易读

2.Mininet部分命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mininet> help  获取帮助列表
mininet> nodes 查看网络拓扑中的节点的状态
mininet> links 显示链路健壮性信息
mininet> net 显示网络拓扑
mininet> dump 显示每个节点的接口设置和表示每个节点的进程的PID
mininet> pingall 在网络中所有主机之间执行ping测试
mininet> pingair 只测试前两个主机的连通性
mininet> iperf 两个节点之间进行iperftcp带宽测试(iperf h1 h2)
mininet> iperfudp 两个节点之间进行iperfudp带宽测试(iperfudp bw h1 h2)
mininet> link 禁用或启用节点间链路(link s1 s2 up 启用s1和s2之间的链路 link s1 s2 down 禁用s1和s2之间的链路)
mininet> h1 ping h2 h1和h2节点之间执行ping测试
mininet> h1 ifconfig 查看host1的IP等信息
mininet> xterm h1 打开host1的终端
mininet> exit 退出mininet登录

3.常用命令用法举例

(1)--confroller

sudo mn --controller=remote, --ip=[controller IP], --port=[port]

其中ip指的是远程控制器的IP,port指的是监听端口。IP和port可忽略不写,不写默认使用本机IP和6633或6653端口。

(2)--mac

自动设置设备的MAC地址,从而使MAC地址更易读。

设置交换机的MAC、主机MAC及IP地址从小到大排列,在拓扑比较复杂的情况容易识别机器ID。如果不设置,默认下主机随机分配MAC地址,且每次执行mn,MAC都会改变,有些调试比较困难。

用例

1
2
3
4
5
6
7
8
9
10
11
12
cd ryu

cd ryu

cd app

ls

sz@ubuntu16:~/ryu/ryu/app$ sudo ryu-manager simple_switch.py #运行这个脚本



1
2
3
4
5
6
7
8
9
10
11
12
13
cd mininet

cd mininet

cd examples

ls

sz@ubuntu16:~/mininet/mininet/examples$ sudo python 2.py
#执行2.py这个脚本



Ryu运行界面:

image-20230414012145685

Mininet运行界面:

image-20230414012305506

输入pingall查看所有主机的连通性

image-20230414013009824

这里应该是我之前建立的网络拓扑有问题,都不通,哈哈哈哈~~

应该是链路被down了。

输入net 显示网络拓扑

image-20230414013240555

输入links 显示链路健壮性信息

image-20230414013441946

输入dump 显示每个节点的接口设置和表示每个节点的进程的PID

image-20230414013741454

输入iperf h1 h2,对h1和h2进行网络的带宽测试

image-20230414014009357

这里出错了,应该是没有连通。

下面是示例跑的结果:

image-20230414014319914

4.Mininet创建网络拓扑的三种方式

4.1 通过交互界面(命令行)创建

(1)单一(single)拓扑

整个网络拓扑中有且只有一个交换机,交换机可下挂一个或多个主机

举例:

sudo mn --topo=single,3 表示创建了一台交换机,交换机下挂3台主机

image-20230414015339334

image-20230414014923187

image-20230414015027907

(2)线性(linear)拓扑

交换机连接呈线性排列,且每个交换机所连接主机数目只有一个(交换机与主机数相同)

举例:sudo mn --topo=linear,3

image-20230414015306962

image-20230414015847088

image-20230414015930627

(3)树形(tree)拓扑

交换机连接呈树形排列,且每个交换机下挂的主机一般有多个,类似于数据结构的二叉树。其中,depth指的是交换机的深度,depth=2表示交换机有两层,fanout表示广度/扇出,fanout=3表示每台交换机均下挂3台设备。

举例: sudo mn --topo=tree,depth=2,fanout=3

image-20230414020332093

image-20230414020447433

image-20230414020630017

(4)自定义(custom)拓扑

可以直接执行编写好的Python脚本创建拓扑。

举例:

py net.addSwitch(‘s3’) 添加交换机s3

py net.addHost(‘h3’) 添加主机h3

py net.addLink(s1,net.get(‘h3’)) 添加s1和s3之间的链接

py s1.attach(‘s1-eth3’) s1上添加eth3接口(端口)

py net.get(‘h3’).cmd(‘ifconfig h3-eth0 10.3’) 给h3配置ip地址为10.0.0.3

4.2 通过可视化界面创建

首先打开miniedit

image-20230414021558487

image-20230414021826334

先画一个简单的网络拓扑。

然后点击左上角的Edit,选择Preferences。

image-20230414022057491

默认交换机选这个。

image-20230414022138027

openflow的版本可以选1.0和1.3

image-20230414022315317

点击OK。

然后是设备的配置

鼠标右键选中控制器,选择Properties,Name控制器的名字,Controller Port监听端口,Controller Type选择Remote Controller也就是远程控制器,如果你的控制器是安装在虚拟机上的话,它默认的是本机地址也就是127.0.0.1点击ok。

image-20230414022541267

image-20230414022819717

交换机的设置也是类似的。

Hostname交换机的名字。DPID指的是在 Mininet 中,DPID 指的是数据通路 ID(Datapath ID)。它是 OpenFlow 协议中用于识别交换机的唯一标识符。每个 OpenFlow 交换机都有一个唯一的 DPID,它是一个 64 位的整数。

这里可以设置s1的DPID为000000000000001

S2的DPID为000000000000002

Switch Type选择内核模式,Open vSwitch Knernel Mode。

其他的可以不勾选。

在 Mininet 中,可以通过在构建拓扑时使用 dpid 参数来指定交换机的 DPID。例如,在 Python 脚本中创建一个包含两个交换机的拓扑,可以使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import OVSSwitch

class MyTopo(Topo):
def __init__(self):
Topo.__init__(self)

s1 = self.addSwitch('s1', dpid='0000000000000001')
s2 = self.addSwitch('s2', dpid='0000000000000002')
self.addLink(s1, s2)

net = Mininet(topo=MyTopo(), switch=OVSSwitch)
net.start()

在这个例子中,使用 dpid 参数为交换机指定了 DPID。使用 00000000000000010000000000000002 作为示例 DPID,您可以根据需要替换它们。

需要注意的是,如果没有为交换机指定 DPID,则 Mininet 会生成一个随机的 DPID。在编写 OpenFlow 控制器代码时,需要使用正确的 DPID 来识别 Mininet 中的交换机。

最后是主机的配置,IP Address需要和Miniedit的IP base的网段对应起来,h1的IP Address设置为10.0.0.1,h2 10.0.0.2 , h3 10.0.0.3

image-20230414024001804

这样网络拓扑就设置完了。

回到执行mininet的终端,可以看到我们在miniedit执行的所有设置在mininet都有反馈。

image-20230414024209408

我们再运行这个网络拓扑,在运行网络拓扑之前我们需要先开启Ryu,也就是控制器。

image-20230414024532788

sudo ryu-manager simple_switch.py 选这个执行

然后在MiniEdit中点击左下角的run。

image-20230414024627681

可以看到在Ryu已经检测到了这个网络拓扑,在Mininet中可以看到创建了网络拓扑。

image-20230414024720904

image-20230414024847582

下面测试一下网络的连通性等。

image-20230414024949664

发现没有问题,接下来我们把这个网络拓扑保存成python文件方便以后随时使用。

首先点击stop,将运行停止。

image-20230414025117021

image-20230414025158103

image-20230414025311434

image-20230414025521242

看到文件已经保存了。

我们可以运行这个文件,看结果是否相同。

image-20230414025839487

image-20230414025909906

4.3 如何编写python脚本创建网络拓扑

image-20230414030206357

先修改文件权限,然后编辑3.py文件。

比如增加一台主机h4与s2交换机进行连接。

仿照修改即可。

image-20230414030508428

image-20230414030552836

保存退出即可。

执行文件查看效果。

image-20230414030735915

image-20230414030832971