此实验基于《软件定义网络实验1-5》,主要内容为:

  • MiniNet常用命令
  • 如何创建网络拓扑
  • OpenFlow流表操作

00x1 搭建SDN环境

SDN 环境配置:Mininet + Ryu

1. 测试环境是否搭建成功

启动Ryu,进入 /ryu/app,启动一个交换机案例app:

ryu-manager simple_switch_13.py

启动Mininet,mn 是创建最简单的默认拓扑,controller 默认是 Mininet 自带的控制器,这里指定为 remote 远端控制器,即 Ryu。

sudo mn --controller=remote

可以看到 Ryu 检测到网络的运行了:

2. 启动 Mininet 可视化界面 MiniEdit

2.2.0以后版本的mininet支持可视化,在 ../mininet/mininet/examples 目录下提供 miniedit.py 脚本,切换到相应目录下,在终端中执行:

sudo python miniedit.py

或者这样也能执行:

wu@wu-ubuntu:~/mininet/mininet/examples$ ./miniedit.py

即打开了 MiniEdit 可视化界面,左边从上到下分别是主机、OpenvSwitch 交换机、传统交换机、传统路由器、链路、控制器。点击后在屏幕上点击可将设备放置到界面中。

00x2 Mininet 具体应用

1. Mininet 常用命令

MIninet 2.3

以上文档中更详细。

创建网络拓扑常用参数:

-c           # 释放之前创建拓扑时占用的未释放的资源
-h           # 查看帮助
--topo       # 在mininet启动时通过命令行定义拓扑
--custom     # 用于创建自定义拓扑
--switch     # 定义要使用的交换机,默认使用oVSK交换机
--controller # 定义要使用的控制器,如果没有指定则使用mininet中默认的控制器
--mac        # 自动设置设备的MAC地址从而使MAC地址更易读。

—-mac 自动设置设备的MAC地址,MAC地址与IP地址的最后一个字节相同,从而使MAC地址更易读。设置交换机的MAC、主机MAC及IP地址从小到大排列,在拓扑比较复杂的情况,容易识别机器ID。如果不设置,默认下主机随机分配MAC地址,且每次执行mn,,MAC都会改变,有些调试比较困难。

Mininet 内部交互常用命令:

mininet > help       # 获取帮助列表。
mininet > nodes      # 查看网络拓扑中结点的状态
mininet > links      # 显示链路健壮性信息
mininet > net        # 显示网络拓扑
mininet > dump       # 显示每个节点的接口设置和表示每个节点的进程的PID
mininet > pingall    # 在网络中的所有主机之间执行ping测试
mininet > pingpair   # 只测试前两个主机的连通性
mininet > iperf      # 两个节点之间进行iperftcp带宽测试(iperf h1 n2)
mininet > iperfudp   # 两节点之间进行iperfudp带宽测试(iperfudp bw h1 h2)
mininet > link       # 禁用或启用节点间链路(link s1 s2 up启用,link s1 s2own禁用s1和s2之间的链路)
mininet > h1 ping h2   # h1和h2节点之间执行ping测试
mininet > h1 ifconfig  # 查看host1的IP等信息。
mininet > xterm h1     # 打开host1的终端。
mininet > exit         # 退出mininet登录。

举例:ip 和 port 可不写,默认本机 ip 和 6633或6653

sudo mn --controller=remote,ip=[控制器IP],port=[监听端口]

2. 命令实操演示

打开某个 Ryu:

ryu-manager simple_switch.py

在 Mininet mininet/examples中执行一个创建好的Python脚本,或者启动Mininet时创建:

sudo mn --controller remote --topo tree,depth=2

pingall 查看连通性:

mininet> pingall
*** Ping: testing ping reachability
h1 -> h2 h3 h4
h2 -> h1 h3 h4
h3 -> h1 h2 h4
h4 -> h1 h2 h3
*** Results: 0% dropped (12/12 received)

net 查看网络拓扑:

mininet> net
h1 h1-eth0:s2-eth1    # h1和s2连接
h2 h2-eth0:s2-eth2
h3 h3-eth0:s3-eth1
h4 h4-eth0:s3-eth2
s1 lo:  s1-eth1:s2-eth3 s1-eth2:s3-eth3     # s1和s2、s3相连通
s2 lo:  s2-eth1:h1-eth0 s2-eth2:h2-eth0 s2-eth3:s1-eth1
s3 lo:  s3-eth1:h3-eth0 s3-eth2:h4-eth0 s3-eth3:s1-eth2
c0

link s2 h1 down 禁用 s2 和 h1 之间的链路。

link s2 h1 up 连接 s2 和 h1 之间的链路。

links 查看健壮性

mininet> links
s1-eth1<->s2-eth3 (OK OK)
s1-eth2<->s3-eth3 (OK OK)
s2-eth1<->h1-eth0 (OK OK)
s2-eth2<->h2-eth0 (OK OK)
s3-eth1<->h3-eth0 (OK OK)
s3-eth2<->h4-eth0 (OK OK)

dump 查看节点接口设置和节点 PID

mininet> dump
<Host h1: h1-eth0:10.0.0.1 pid=41581>
<Host h2: h2-eth0:10.0.0.2 pid=41583>
<Host h3: h3-eth0:10.0.0.3 pid=41585>
<Host h4: h4-eth0:10.0.0.4 pid=41587>
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None pid=41592>
<OVSSwitch s2: lo:127.0.0.1,s2-eth1:None,s2-eth2:None,s2-eth3:None pid=41595>
<OVSSwitch s3: lo:127.0.0.1,s3-eth1:None,s3-eth2:None,s3-eth3:None pid=41598>
<RemoteController c0: 127.0.0.1:6653 pid=41575>

iperf 进行网络带宽测试,例如h1和h2:

mininet> iperf h1 h2
*** Iperf: testing TCP bandwidth between h1 and h2
*** Results: ['65.3 Gbits/sec', '65.5 Gbits/sec']

help 查看帮助,显示所有可以执行的命令。

mininet> help
Documented commands (type help <topic>):
========================================
EOF    gterm  iperfudp  nodes        pingpair      py      switch  xterm
dpctl  help   link      noecho       pingpairfull  quit    time
dump   intfs  links     pingall      ports         sh      wait
exit   iperf  net       pingallfull  px            source  x

exit 退出Mininet。

3. Mininet 创建网络拓扑的常见方式

通过命令行创建

  1. 单一(single)拓扑

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

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

  2. 线形(linear)拓扑

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

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

  3. 树形(tree)拓扑

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

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

  4. 自定义拓扑

    即用 Python 命令创建,后面讲脚本时候再讲。

通过可视化界面 MiniEdit 创建

打开 MiniEdit 可视化界面miniedit.py,自行点击图标搭建网络拓扑,然后进行配置。

左上角 Edit - Preference,网段可根据需要自己设置(之后主机IP需要根据网段配置),钩上 Start CLI 开启命令行修改拓扑,OpenFLow 可勾选 1.0 和 1.3。

然后修改节点配置,控制器上 右键 - Property,控制类型 Controller Type 改为远端控制器 Remote,IP为远程控制器的IP(这里就是本机IP)。交换机上设置一下16位 DPID(如0000000000000001),类型为 OpenvSwith 内核模式。主机设置网段和 IP Base 相同。回到命令行可以看到所有配置在命令行都有反馈。

运行网络拓扑之前先去开启Ryu控制器。

然后回到 MiniEdit,点左下角的 Run,即可在命令行看到启动情况。

回到 MiniEdit 停止运行,左上角 File - Export Level 2 Script 保存为 xxx.py 的Python文件到 example 目录,回到命令行在 example 目录下就能看到保存的文件了。后期修改网络拓扑也可以直接修改这个 Python 文件。

通过 Python 脚本创建

vim打开上一步保存的.py文件,可看到文件构成:

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import calldef myNetwork():net = Mininet( topo=None,build=False,ipBase='10.0.0.0/8')info( '*** Adding controller\n' )c0=net.addController(name='c0',controller=RemoteController,ip='127.0.0.1',protocol='tcp',port=6633)info( '*** Add switches\n')s1 = net.addSwitch('s1', cls=OVSKernelSwitch, dpid='0000000000000001')s2 = net.addSwitch('s2', cls=OVSKernelSwitch, dpid='0000000000000002')info( '*** Add hosts\n')h1 = net.addHost('h1', cls=Host, ip='10.0.0.1', defaultRoute=None)h2 = net.addHost('h2', cls=Host, ip='10.0.0.2', defaultRoute=None)h3 = net.addHost('h3', cls=Host, ip='10.0.0.3', defaultRoute=None)# h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)info( '*** Add links\n')net.addLink(s1, s2)net.addLink(s1, h1)net.addLink(s2, h2)net.addLink(s2, h3)# net.addLink(s2, h4)info( '*** Starting network\n')net.build()info( '*** Starting controllers\n')for controller in net.controllers:controller.start()info( '*** Starting switches\n')net.get('s1').start([c0])net.get('s2').start([c0])info( '*** Post configure switches and hosts\n')s1.cmd('ifconfig s1 10.0.0.0/8')s2.cmd('ifconfig s2 10.0.0.0/8')CLI(net)net.stop()if __name__ == '__main__':setLogLevel( 'info' )myNetwork()

接下来增加一台主机h4,将h4和s2进行连接,即对应位置增加两行代码(上面注释掉了):

h4 = net.addHost('h4', cls=Host, ip='10.0.0.4', defaultRoute=None)net.addLink(s2, h4)

00x3 OpenFlow 协议和流表基本操作

1. OpenFlow协议工作原理

h1想和h2通信,先给s1,s1流表中没有inport=2的流表项,就发送packin消息给控制器,控制器收到后下发packout消息给s1,s1根据收到的流表转发数据包给s2,s2流表中也没有匹配项,也需要发packin给控制器,控制器下发packout,s2进行转发给h2.

h2收到消息后想给h1发送数据包,先给s2,s2也没有inport=2的流表项,联系控制器packin-packout,s2再转发给s1,s1已经有了inport=2的流表项,直接转发给h1。

2. OpenFlow 流表常用配置命令

# 查看流表
dpctl dump-flows# 添加流表(1号端口进,2号端口出的转发流表)
dpctl add-flow in_port=1,actions=output:2# 添加丢弃数据包流表(2号端口进,丢弃数据包)
dpctl add-flow in_port=2,actions=drop# 删除所有交换机的所有流表
dpctl del-flows# 删除所有交换机的特定流表项(输出2号端口进的流表项)
dpctl del-flows in_port=2 # 删除某个交换机的流表(删除s1中从2号端口进的流表项)
sh ovs-ofctl del-flows s1 in_port=2

3. 命令实操

打开ryu控制器和mininet,以simple_switch.py和之前自建的1222.py为例。

available nodes are:
c0 h1 h2 h3 h4 s1 s2
mininet> links            # 后面的-eth?就是端口号
s1-eth1<->s2-eth1 (OK OK)
s1-eth2<->h1-eth0 (OK OK)
s2-eth2<->h2-eth0 (OK OK)
s2-eth3<->h3-eth0 (OK OK)
s2-eth4<->h4-eth0 (OK OK)

拓扑图如下:

输入dpctl dump-flows查看流表项:

mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------
*** s2 ------------------------------------------------------------------------

可见s1和s2中都还没有流表项。

执行一下pingall后再查看流表项,就能看到s1和s2都生成了很多流表项,以s1部分流表项为例:

*** s1 ------------------------------------------------------------------------cookie=0x0, duration=50.671s, table=0, n_packets=3, n_bytes=238, in_port="s1-eth1",dl_src=c6:bf:4f:c2:93:4d,dl_dst=be:d8:db:39:8d:0e actions=output:"s1-eth2"cookie=0x0, duration=50.669s, table=0, n_packets=2, n_bytes=140, in_port="s1-eth2",dl_src=be:d8:db:39:8d:0e,dl_dst=c6:bf:4f:c2:93:4d actions=output:"s1-eth1"

第一条流表中,in_port="s1-eth1"表示从s1的1号端口进,actions=output:"s1-eth2"表示从s1的2号端口出的转发动作,dl_srcdl_dst分别为原MAC地址和目的MAC地址。

执行dpctl del-flows即可删除所有流表。


执行手动添加流表dpctl add-flow in_port=1,actions=output:2

dpctl dump-flows查询流表可以看到s1和s2都生成了1号端口进2号端口出的流表:

mininet> dpctl dump-flows
*** s1 ------------------------------------------------------------------------cookie=0x0, duration=5.018s, table=0, n_packets=0, n_bytes=0, in_port="s1-eth1" actions=output:"s1-eth2"
*** s2 ------------------------------------------------------------------------cookie=0x0, duration=5.018s, table=0, n_packets=0, n_bytes=0, in_port="s2-eth1" actions=output:"s2-eth2"

再添加一条从2号端口进1号端口出的流表:dpctl add-flow in_port=2,actions=output:1

执行h1 ping h2,即可ping通,ctrl+c退出ping。

再执行h1 ping h3,无法ping通,原因是没有s2的3号端口转发的流表。s2根据流表只能1号端口进转发给2号端口出,3号端口连接的h3无法收到数据包。


删除交换机s1中从2号端口进的所有流表sh ovs-ofctl del-flows s1 in_port=2,再查看流表可以看到被删除。

删除所有交换机中输入端口为1的流表项dpctl del-flows in_port=1

删除所有交换机中输入端口为2的流表项dpctl del-flows in_port=2

再查看流表可见s1和s2中都没有流表项。


添加丢弃从2号端口进的数据包的流表项:dpctl add-flow in_port=2,actions=drop

再执行pingall,发现只有h3和h4之间是互通的。原因是2号端口进的数据包都匹配到流表项需要丢弃,h3从3号端口进的和h4从4号端口进的没有流表项匹配,就向控制器申请下发流表。

mininet> pingall
*** Ping: testing ping reachability
h1 -> X X X
h2 -> X X X
h3 -> X X h4
h4 -> X X h3
*** Results: 83% dropped (2/12 received)

dpctl dump-flows查询流表可以看到s2中新增了关于3号4号端口的流表项。

如果这里把2号3号端口进的都丢弃,那么虽然4号进的会下发流表发出数据包,但是2号3号端口不会回应,所以pingall都不能通。


删除所有流表后pingall,即让控制器下发所有端口的流表项。然后再手动添加丢弃2号和3号端口的流表项,再执行pingall,会发现所有通信仍是正常的。

原因是此时手动添加的流表项和控制器下发的流表项共存,而控制器下发的流表项优先级更高,所以会执行控制器下发的流表项。

软件定义网络SDN基础实验:MiniNet常用命令、创建网络拓扑、OpenFlow流表操作相关推荐

  1. Openlab实验平台实验--Mininet 常用命令

    任务目的 1.掌握使用Mininet命令行创建拓扑的方法. 2.掌握使用Python脚本定义拓扑的方法. 3.掌握使用交互式界面自定义拓扑的实现方法. 任务环境 注:系统默认的账户为root/root ...

  2. matlab搭建sdn,软件定义网络SDN简介和简单仿真实验

    阅读: 11,620 SDN是在2009年左右出现的一种新型网络结构,它将数据层面与控制层面分离,使用中央控制器完成网络的操作和管理,并通常采用OpenFlow协议作为其核心通信协议,拥有着集中式控制 ...

  3. Linux基础系统优化及常用命令

    # Linux基础系统优化及常用命令 [TOC] ## Linux基础系统优化 Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. - ...

  4. 软件定义网络SDN(特点、实现途径与展望)

    SDN软件定义网络简介 软件定义网络(SDN,Software Defined Network),是由美国斯坦福大学clean slate研究组提出的一种新型网络创新架构,其核心技术OpenFlow通 ...

  5. 浅谈软件定义网络(SDN)技术研究现状和发展趋势

                       浅谈软件定义网络(SDN)技术研究现状和发展趋势 友情全文PDF链接:浅谈软件定义网络(SDN)技术研究现状和发展趋势.pdf-网络基础文档类资源-CSDN下载 ...

  6. Linux基础概念及常用命令

    Linux基础概念及常用命令 文章目录 Linux基础概念及常用命令 1 Linux概述 1.1 为什么要学Linux 1.2 Linux简介 1.3 Linux 发行版 1.4 Linux 应用领域 ...

  7. 【Java从0到架构师】Linux 基础知识、常用命令

    Linux 基础知识.常用命令 Linux 基础知识 内核和发行版 常见的 Linux 发行版 Linux 的应用领域 Linux 与 Windows 的区别 Linux 常用命令 *系统目录结构 s ...

  8. 浅谈软件定义网络SDN

    浅谈软件定义网络SDN 前言 学习主要内容 一.SDN简介 二.SDN的三个主要特征 转控分离 集中控制 开放接口 三.SDN的工作原理 SDN网络架构的三层模型 SDN网络架构下的三个接口 SDN基 ...

  9. 计算机网络实验ping命令,计算机网络基础实验一 ping命令的使用.doc

    计算机网络基础实验一 ping命令的使用 贵州大学实验报告 学院 : 职业技术学院 专业 :计算机科学与技术 班级 :计科职111 姓名程能云学号1120020322实验组1实验时间2014/03/1 ...

最新文章

  1. 给接口自动化测试框架增色,实现企业微信测试报告
  2. 人工智能商业化的重点:语音交互和人脸识别
  3. FastReport分页和空行填充
  4. JVM-07垃圾收集Garbage Collection【GC日志分析】
  5. bootstrap的栅格系统和响应式工具
  6. 【转】电脑GPS导航软件下载,教你把笔记本做成GPS
  7. ios 设置属性的center_【从0到1的Stata图表学习1】图例设置
  8. Windows中导出电脑文件名或者文件结构的方法
  9. Java与Cuda混合编程
  10. maven项目建立pom xml报无法解析org apache maven plugins maven resource
  11. html打开后繁体字怎么变成规范,对HTML标准的思考 - 记解决H5随机显示简繁体汉字问题...
  12. opencv背景抠图
  13. 学习笔记之DNS配置(视图,日志,动态DNS)
  14. UVM中starting_phase
  15. 共线方程求解外方位元素--单片空间后方交会
  16. latex 学习使用记录(插图片,插表格,插公式,插参考文献)
  17. 用robot framework + python实现http接口自动化测试框架
  18. Redis集群入门实践教程
  19. 论文学习笔记: Graph Attention Network
  20. 法建强同志主持召开了全区领导干部大会

热门文章

  1. c++ opencv随机画不同颜色的线条
  2. 反射PropertyInfo.GetValue()取值抛出需使用DBNull的异常
  3. AlphabetJS --- 在console或者shell中打印字符图案的小工具
  4. idea:光标消失无法编辑解决方法
  5. 阶段二 网页搭建入门之javaScript与前端案例 javaScript轮播图
  6. Unity 从零开始的2D游戏开发 —— [Animator] 使用动画状态机制作简单动画
  7. 红米note4x linux,谁会用红米note2安装kali Linux
  8. 从设计到开发,10大不容错过的效率提升工具
  9. jquery实现点击复制文本
  10. 怎么装作自己学过java_【求教】明明只学过java基础,怎么装得像学完javaweb的