一、安装Mininet

1、直接下载官网提供的含有Mininet的虚拟机镜像,地址:http://mininet.org/download/

2、通过源代码直接安装

1
2
3
4
5
6
#在υbunt14.04或更高版本的环境下,获取源代码:
git clone http://github.com/mininet/mininet.git
#安装 Wininet,需要涉及安装 Wininet、user交换机及OVS软件,可根据wininet/util/install.sh -h命令选择参数进行安装
mininet/util/install.sh -n3V 2.5.0#-n:安装核心文件及依赖,-3:安装openflow的1.3版本,-V:安装openvswitch,其后根版本号
#安装完成后,使用命令测试Wininet是否安装成功
sudo mn --test pingall

3、软件包管理器直接安装

1
2
3
4
5
6
7
8
9
10
11
#如果有mininet、OvS以前版本,先进行删除
sudo rm -rf /usr/local/bin/mn /usr/local/bin/mnexec \
/usr/local/lib/python*/*/*mininet* \
/usr/local/bin/ovs-* /usr/local/sbin/ovs-*
#安装
sudo apt-get install mininet
#安装完成后,验证控制器是否在运行,如果控制器正在运行,停用控制器:
sudo service openvswitch-controller stop
sudo update-rc.d openvswitch-controller disable
#安装完成后,使用命令测试Wininet是否安装成功
sudo mn --test pingall

Mininet文件结构:

  • bin/mn:主运行文件,应用 Python程序编写,定义了MininetRunner类,执行 sudo mn即调用本程序,是模拟网络的主程序,为整个测试创建基础平台。
  • mininet:核心代码基本都在这
  • custom:放置自定义python文件,用来自定义拓扑
  • util:放置辅助文件,包括安装脚本、文档辅助生成等
  • examples:含有很多案例,包括miniedit可视化等

二、命令详解

  • 网络构建启动参数
    • –topo:
    • –custom:
    • –switch:
    • –controller:
    • –mac:
  • 内部交互命令
    • dump
    • net
    • nodes
    • links
    • dpctl
    • iperf
  • 外部运行参数
    • -c:清除配置信息
    • -h:帮助

–topo

  • 单一拓扑:整个网络拓扑中交换机有且只有一个,其可以下挂一个或多个主机sudo mn --topo=single,3
  • 线性拓扑:交换机连接呈线形排列,且每个交换机所连接主机数目只有一个sudo mn --topo=linear,4
  • 树形拓扑:交换机连接成树形排列,且每个交换机所连接主机一般有多个sudo mn --topo=tree,depth=2,fanout=2(depth:交换机的深度,即交换机的层数,fanout:扇出,广度,即每一个交换机下挂几个节点)
  • 自定义拓扑:Python编写文件 file.py,执行此脚本即可创建定义的拓扑,--custon--topo联用sudo mn --custom file.py --topo mytopo(file.py采用绝对路径,mytopo为file.py中自定义的类)

–switch

定义 mininet要使用的交换机(默认使用OVSK,即 OpenVSwitch交换机)

switch参数

–controller

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

连接远程控制器,可以指定存在于本机或者与之相连通设备上的控制器,指定远程控制器方法:

1
sudo mn --controller=remote,--ip=[controller IP],--port=[port]
  • --ip和–port可以忽略,默认为本机ip和6653/6633端口

–mac

自动设置设备的MAC地址

让MAC地址易读,即设置交换机的MAC、主机MAC及IP地址从小到大排序,且设置简单唯一,不仅让机器容易获取,也容易让肉眼很容易识别其ID.使用方法:

1
sudo mn --topo=tree,depth=2,fanout=2,--mac

内部交互命令

使用mn默认创建网络,使用一系列命令査看并验证网络系统的链路健壮性.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
*** No default OpenFlow controller found for default switch!
*** Falling back to OVS Bridge
*** Creating network
*** Adding controller
*** Adding hosts:
h1 h2
*** Adding switches:
s1
*** Adding links:
(h1, s1) (h2, s1)
*** Configuring hosts
h1 h2
*** Starting controller

*** Starting 1 switches
s1 ...
*** Starting CLI:
#查看链路信息
mininet> net
h1 h1-eth0:s1-eth1
h2 h2-eth0:s1-eth2
s1 lo: s1-eth1:h1-eth0 s1-eth2:h2-eth0
#查看网络节点
mininet> nodes
available nodes are:
h1 h2 s1
#查看链路信息
mininet> links
h1-eth0<->s1-eth1 (OK OK)
h2-eth0<->s1-eth2 (OK OK)
#查看连通性
mininet> pingall
*** Ping: testing ping reachability
h1 -> h2
h2 -> h1
*** Results: 0% dropped (2/2 received)

常用内部交互命令

  • py指令的意义是在现有的网络中动态扩展其他网络
    • py help(节点名):查询相关节点的帮助,如py help(h1)
  • 注意dpctl指令的作用范围为全局

注:在内部交互中如需要输入shell命令,只需在shell命令前加上sh即可

三、Mininet可视化

Miniedit可视化,直接在界面上编辑任意拓扑,生成 python自定义拓扑脚本,简单方便.

Mininet2.2.0+内置 miniedit.在mininet/examples下提供 miniedit.py脚本,执行脚本后显示可视化界面,可自定义拓扑及配置属性.

  • 前提条件:安装python-tk:sudo apt install python-tk

四、实验一:玩转流表

掌握 OpenvSwitch下发流表操作;掌握添加、删除流表命令以及设备通信的原理

Mininet创建一个默认树形拓扑并指定Mininet的控制器进行基本的添加、删除流表操作,使网络实现网络通信和不通信.

链接脚本exper1.py文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnertions

class MyTopo( Topo ):
"Simple topology example."

def __init__( self ):
"Create custom topo."

# Initialize topology
Topo.__init__( self )

# Add hosts and switches
Host1 = self.addHost( 'h1' )
Host2 = self.addHost( 'h2' )
Host3 = self.addHost( 'h3' )
Switch1 = self.addSwitch( 's1' )
Switch2 = self.addSwitch( 's2' )

# Add links
self.addLink( Host1, Switch1 )
self.addLink( Host2, Switch1 )
self.addLink( Host3, Switch2 )
self.addLink( Switch1, Switch2 )

topos = { 'mytopo': ( lambda: MyTopo() ) }

整个网络的拓扑如下:

自定义网络拓扑

  • 其中Controller采用ryu远程控制器(该控制器在本地搭建)

步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#首先创建ryu远程控制器
cd ~/ryu/ryu/app
ryu-manager simple_switch.py

#根据脚本产生自定义拓扑网络(其中ip和port为远程控制器的ip和port)
mn --custom exper1.py --topo mytopo --controller=remote,ip=127.0.0.1,port=6633

#查看静态流表(初次查看可以发现并没有流表产生)
mininet> dpctl dump-flows
#ping下后再次查看,发现产生了很多流表
mininet> pingall
mininet> dpctl dump-flows

#删除之前的所有流表
mininet> dpctl del-flows

#通过dpctl手动添加流表,实现数据转发
mininet> dpctl add-flows in_port=1,action=output:2#1号端口进来的数据从2号端口出去
mininet> dpctl add-flows in_port=2,action=output:1#2号端口进来的数据从1号端口出去
mininet> dpctl dump-flows
mininet> h1 ping h2#成功
mininet> h1 ping h3#ping 失败
mininet> h2 ping h3#ping 失败

#删除流表(下述两种方式均可)
mininet> dpctl del-flows in_port=2#删除所有in_port=2的流表
mininet> dpctl dump-flows
mininet> sh ovs-ofctl del-flows s1 in_port=1#调用shell删除s1中in_port=1的流表
mininet> dpctl dump-flows

#添加丢弃数据包的流表
mininet> dpctl add-flows in_port=2,actions=drop#丢弃2号端口输入的
  • 注:dpctl是对全局的交换机起作用,添加删除都是全局的
  • 想要h3和h1或h2通信,需要添加3号端口(s1交换机的3号端口)与1号端口(s2之间的1号端口)之间的的通信
  • 流表具有优先级,一般来说控制器下发的流表是高于用户自己添加到流表

五、实验二:模拟多数据中心带宽实验

  • 通过 Minnett模拟搭建基于不同数据中心的网络拓扑;
  • 掌握多数据中心网络拓扑的构建;
  • 熟悉网络性能测试工具 Iperf,根据实验测试SDN网络的性能;
  • 通过程序生成真实网络流量

应用价值:

  • 树状拓扑结构容错能力强
  • 降低数据中心成本消耗
  • 提供重新排列的全带宽无阻碍路径
  • 提高带宽利用率
  • 分析数据中心网络流量性能
  • 为真实数据中心和仿真测试床提供有用信息

流量模拟:

网络性能评估中—个巨大的挑战就是如何生成真实的网络流量,可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况.此应用主要以数据中心网络为目标场景,在 mininet仿真环境中尽可能地还原数据中心内部的真实流量情况.