教学目的与学时建议
- 能够运用 mininet 可视化工具创建计算机网络拓扑结构
- 能够运用 mininet 交互界面创建拓扑结构
- 能够运用 python 脚本构建计算机网络拓扑结构
- 建议:2 学时
实验环境
- 下载并安装虚拟机 VMware workstation;
- 下载虚拟机镜像( SDNHub_tutorial_VM_64-bit[NEW](可直接导入 VMware).ova ),百度网盘下载链接 提取码:mhfi
- 因为虚拟机镜像是ova格式,所以只需要打开即可使用,无需创建新的虚拟机。
- 还有使用命令行、安装包的方式来安装,参考文章
技术与知识背景
1,什么是 Mininet?
- Mininet 是由一些虚拟的终端节点(end-hosts)、交换机、路由器连接而成的一个网络仿真器,是一个轻量级软件定义网络和测试平台;它采用轻量级的虚拟化技术使一个单一的系统看起来像一个完整的网络运行想过的内核系统和用户代码,也可简单理解为 SDN 网络。
- 系统中的一种基于进程虚拟化平台,它支持 OpenFlow、OpenvSwith 等各种协议,Mininet 也可以模拟一个完整的网络主机、链接和交换机在同一台计算机上且有助于互动开发、测试和演示,尤其是那些使用 OpenFlow 和 SDN 技术;同时也可将此进程虚拟化的平台下代码迁移到真实的环境中。
- Mininet 可以很方便地创建一个支持 SDN 的网络:host 就像真实的电脑一样工作,可以使用 ssh 登录,启动应用程序,程序可以向以太网端口发送数据包,数据包会被交换机、路由器接收并处理。有了这个网络,就可以灵活地为网络添加新的功能并进行相关测试,然后轻松部署到真实的硬件环境中。
2,Mininet 的特性:
- 可以简单、迅速地创建一个支持用户自定义的网络拓扑,缩短开发测试周期
- 可以运行真实的程序,在 Linux 上运行的程序基本上可以都可以在 Mininet 上运行,如 Wireshark
- Mininet 支持 Openflow,在 Mininet 上运行的代码可以轻松移植到支持OpenFlow 的硬件设备上
- Mininet 可以在自己的电脑,或服务器,或虚拟机,或者云(例如 Amazon EC2)上运行
- Mininet 提供 python API,简单易用
- Mininet 是开源项目
3,Mininet 部分命令
4,命令操作
- 终端输入mn,可以创建一个简单的网络,创建完成之后,命令行变为mininet>
- Mininet>iperf <node id> <node id>—两个节点之间的网络性能测试
-
Mininet><node id> route—类似于Linux命令,用于定义节点路由表中的条目
- Mininet>help
-
Mininet>nodes
- Mininet>net
-
Mininet>pingall
-
Mininet>dump
- Mininet>h1 ping h2
- Mininet>h2 ifconfig
-
Mininet>xterm h1
- Mininet>exit
- 更多操作命令
测试Mininet是否正常工作
- 要快速检查它是否工作,请键入以下命令:
- 此命令将:
- 创建一个单一网络,其中3台主机以非交互模式连接到单个交换机。
- 执行从所有主机到所有其他主机的ping。
- 此命令使用默认的交换机与控制器。
sudo mn --test pingall --topo single,3
- 命令讲解
创建拓扑
- 运用mininet可视化工具创建网络拓扑结构
- 运用mininet命令行工具创建网络拓扑结构
- 运用mininet交互界面创建网络拓扑结构
- 运用python脚本构建网络拓扑结构
- 参考博客
基本命令行参数 ——后面会用得到
- --topo—在mininet启动时通过命令行定义拓扑
- --switch—定义要使用的交换机。默认情况下,使用ovsk软件交换机
- --controller—定义要使用的控制器。如果未指定默认控制器,作为集线器使用
可视化工具创建拓扑
- 导入镜像后,默认处在/home/ubuntu的位置,可以使用pwd来查看当前的路径,动态调整。进入/home/ubuntu/mininet/examples文件夹,使用命令cd
- 使用命令sudo su,切换到root身份,执行python miniedit.py启动可视化界面
- 按照下面的操作步骤和页面布局进行操作
- 右键点击图标,选中preferences,对网络拓扑结构进行相关配置,此处使用默认配置,即不进行任何操作。
- “Edit”→“Preferences”,勾选 strat CLI(允许通过交互界面对拓扑结构进行调整),选择所支持 Openflow 协议版本。
- 保存为 python 文件,选择“File”→“Export Level 2 Script”,起一个名字,在终端运行保存下来的 python 文件即可。
- 或者点击左下角的run运行,如果需要停止,则点击stop即可。
命令行创建拓扑
- 最小网络,两台主机连接到一台交换机。
- sudo mn –topo minimal
- 每个主机都连接到一个交换机,所有交换机都彼此连接。
- 在本例中,有4个主机和4个交换机。
- sudo mn --topo linear,4
- 下图纯属虚构,请以实物为准
- 每个主机都连接到一个交换机。
- 在本例中,有3个主机和1个交换机。
- sudo mn --topo single,3
- 下图纯属虚构,请以实物为准
- 具有定义深度和扇出的基于树的拓扑。
- sudo mn --topo tree,depth=2,fanout=2
- 下图纯属虚构,请以实物为准
交互式创建拓扑
启动参数总结
- -h, --help show this help message and exit
- --switch=SWITCH [kernel user ovsk]
- --host=HOST [process]
- --controller=CONTROLLER [nox_dump none ref remote nox_pysw]
- --topo=TOPO [tree reversed single linear minimal],arg1,arg2,...argN
- -c, --clean clean and exit
- --custom=CUSTOM read custom topo and node params from .py file
- --test=TEST [cli build pingall pingpair iperf all iperfudp none]
- -x, --xterms spawn xterms for each node
- --mac set MACs equal to DPIDs
- --arp set all-pairs ARP entries
- -v VERBOSITY, --verbosity=VERBOSITY [info warning critical error debug output]
- --ip=IP [ip address as a dotted decimal string for aremote controller]
- --port=PORT [port integer for a listening remote controller]
- --innamespace sw and ctrl in namespace?
- --listenport=LISTENPORT [base port for passive switch listening controller]
- --nolistenport don't use passive listening port
- --pre=PRE [CLI script to run before tests]
- --post=POST [CLI script to run after tests]
python 脚本定义拓扑
- 用 python 脚本创建与上述对应拓扑,创建完后的文件需要增加可执行权限chmod +x test.py,还是用sudo python test.py执行。
- --topo linear,4
-
操作:
- 新建名字为linear的python文件 touch linear.py
- 赋予权限 chmod +x linear.py
- 对文件进行写入操作 vi linear.py
- 将下文的代码复制黏贴到linear.py文件中,先按下i,进行输入操作;鼠标右键,选择黏贴代码;按下Esc按键,同时按下shift和:按键,然后输入wq保存代码;*代码里面不可以包含中文,否则会报错,也可以添加# -*- coding: utf8 -*-改变编码格式,解决代码包含中文的问题
- 运行代码 sudo python linear.py
- 查看输出
-
代码
from mininet.net import Mininet
from mininet.topo import LinearTopo
Linear4 = LinearTopo(k=4)
net = Mininet(topo=Linear4)
net.start()
net.pingAll()
net.stop()
-
实践
- --topo single,3
- 操作:
- 新建名字为single的python文件 touch single.py
- 赋予权限 chmod +x single.py
- 对文件进行写入操作 vi single.py
- 将下文的代码复制黏贴到single.py文件中,先按下i,进行输入操作;鼠标右键,选择黏贴代码;按下Esc按键,同时按下shift和:按键,然后输入wq保存代码;
- 运行代码 sudo python single.py
- 查看输出
- 代码:
from mininet.net import Mininet
from mininet.topo import SingleSwitchTopo
Single3 = SingleSwitchTopo(k=3)
net = Mininet(topo=Single3)
net.start()
net.pingAll()
net.stop()
- 实践
- --topo tree,depth=2,fanout=2
- 操作:
- 新建名字为tree的python文件 touch tree.py
- 赋予权限 chmod +x tree.py
- 对文件进行写入操作 vi tree.py
- 将下文的代码复制黏贴到tree.py文件中,先按下i,进行输入操作;鼠标右键,选择黏贴代码;按下Esc按键,同时按下shift和:按键,然后输入wq保存代码;
- 运行代码 sudo python tree.py
- 查看输出
- 代码:
from mininet.net import Mininet
from mininet.topolib import TreeTopo
Tree22 = TreeTopo(depth=2,fanout=2)
net = Mininet(topo=Tree22)
net.start()
net.pingAll()
net.stop()
- 实践
- 对于性能的限制
- 操作:
- 新建名字为test的python文件 touch test.py
- 赋予权限 chmod +x test.py
- 对文件进行写入操作 vi test.py
- 将下文的代码复制黏贴到test.py文件中,先按下i,进行输入操作;鼠标右键,选择黏贴代码;按下Esc按键,同时按下shift和:按键,然后输入wq保存代码;
- 运行代码 sudo python test.py
- 查看输出
- 讲解:
除了可以通过Python脚本创建基本的拓扑以外,还能在此基础上对性能进行限制。观察下面给出的脚本文件,addHost()语法可以对主机cpu进行设置,以百分数的形式;addLink()语法可以设置带宽bw、延迟delay、最大队列的大小max_queue_size、损耗率loss。
- 代码:
from mininet.net import Mininet
from mininet.node import CPULimitedHost
from mininet.link import TCLink
net = Mininet(host=CPULimitedHost, link=TCLink)
c0 = net.addController()
s0 = net.addSwitch('s0')
h0 = net.addHost('h0')
h1 = net.addHost('h1', cpu=0.5)
h2 = net.addHost('h1', cpu=0.5)
net.addLink(s0, h0, bw=10, delay='5ms',
max_queue_size=1000, loss=10, use_htb=True)
net.addLink(s0, h1)
net.addLink(s0, h2)
net.start()
net.pingAll()
net.stop()
- 实践