写在前面


本文参考

  • 通过这个实验,我学习到了另一种下流表的方式。
  • 下流表有两种方式(我目前了解):
    • 通过controller下发。
    • 通过OvS提供的API直接向OvS交换机下流表。
  • 本实验脚本已经把相关过程写好,读一下脚本熟悉API是关键。

实验简介


在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为。在本实验中,使用Mininet基于python的脚本,调用“ovs-vsctl”命令直接控制Open vSwitch。

本实验在基于Mininet脚本的不同拓扑环境下使用OpenDaylight控制交换机行为。

  • 任务一:一台交换机两台主机,从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口;
  • 任务二:两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口同任务一;
  • 任务三:与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。

实验步骤


1.搭建环境

  • mininet虚拟机
  • OpenDaylight虚拟机

2.任务一

一台交换机两台主机,实现从1端口进入的数据流转发到2端口,从2端口进入的数据流转发到1端口。

  • 在Mininet里新建文件mymininet1.py。
  • 查看ODL控制器所在主机IP。
  • 编辑myminnet1脚本内容如下:
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import Link
from mininet.log import setLogLevel, info
from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ):
"Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
controller = Node( 'c0', inNamespace=False )
switch0 = Node( 's0', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) info( "*** Creating links\n" )
Link( h0, switch0 )
Link( h1, switch0 ) info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
info( str( h0 ) + '\n' )
info( str( h1 ) + '\n' ) info( "*** Starting network using Open vSwitch\n" )
controller.cmd( cname + ' ' + cargs + '&' )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' ) for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf )
switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' )
while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
sleep( 1 )
info( '.' )
info( '\n' ) info( "*** Running test\n" )
h0.cmdPrint( 'ping -c6 ' + h1.IP() )
h1.cmdPrint( 'ping -c6 ' + h0.IP() ) info( "*** Stopping network\n" )
controller.cmd( 'kill %' + cname )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
scratchNet()
  • 修改其为可执行文件并运行:
chmod +x mymininet1.py
./mymininet1.py

  • mn -c命令清理进程

3.任务二

两台交换机两台主机,主机0连接交换机0,主机1连接交换机1,交换机0连接交换机1,数据转发端口要求同任务一。

  • 在Mininet里新建文件mymininet2.py。
  • 查看ODL控制器所在主机IP。
  • 编辑myminnet2脚本内容如下:
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import Link
from mininet.log import setLogLevel, info
from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ):
"Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
controller = Node( 'c0', inNamespace=False )
switch0 = Node( 's0', inNamespace=False )
switch1 = Node( 's1', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) info( "*** Creating links\n" )
Link( h0, switch0 )
Link( h1, switch1 )
Link( switch0, switch1 ) info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
info( str( h0 ) + '\n' )
info( str( h1 ) + '\n' ) info( "*** Starting network using Open vSwitch\n" )
controller.cmd( cname + ' ' + cargs + '&' )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' )
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.cmd( 'ovs-vsctl add-br dp1' ) for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf ) for intf in switch1.intfs.values():
print intf
print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' )
while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
sleep( 1 )
info( '.' )
info( '\n' )
print switch0.cmd( 'ovs-ofctl show dp0' )
print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" )
h0.cmdPrint( 'ping -c3 ' + h1.IP() )
h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" )
controller.cmd( 'kill %' + cname )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
scratchNet()
  • 修改其为可执行文件并运行:
chmod +x mymininet2.py
./mymininet2.py

  • mn -c命令清理进程

4.任务三

与任务二类似,但是在创建link的时候,设置带宽、延迟以及丢包率。

  • 在Mininet里新建文件mymininet3.py。
  • 查看ODL控制器所在主机IP。
  • 编辑myminnet3脚本内容如下:
#!/usr/bin/python
from mininet.net import Mininet
from mininet.node import Node
from mininet.link import TCLink
from mininet.log import setLogLevel, info
from mininet.util import quietRun from time import sleep def scratchNet( cname='controller', cargs='-v ptcp:' ):
"Create network from scratch using Open vSwitch." info( "*** Creating nodes\n" )
controller = Node( 'c0', inNamespace=False )
switch0 = Node( 's0', inNamespace=False )
switch1 = Node( 's1', inNamespace=False )
h0 = Node( 'h0' )
h1 = Node( 'h1' ) info( "*** Creating links\n" ) linkopts0=dict(bw=10)
linkopts1=dict(bw=10, delay='5ms', loss=10)
TCLink( h0, switch0,**linkopts0)
TCLink( h1, switch1,**linkopts0)
TCLink( switch0, switch1,**linkopts1) info( "*** Configuring hosts\n" )
h0.setIP( '192.168.123.1/24' )
h1.setIP( '192.168.123.2/24' )
info( str( h0 ) + '\n' )
info( str( h1 ) + '\n' ) info( "*** Starting network using Open vSwitch\n" )
controller.cmd( cname + ' ' + cargs + '&' )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.cmd( 'ovs-vsctl add-br dp0' )
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.cmd( 'ovs-vsctl add-br dp1' ) for intf in switch0.intfs.values():
print intf
print switch0.cmd( 'ovs-vsctl add-port dp0 %s' % intf ) for intf in switch1.intfs.values():
print intf
print switch1.cmd( 'ovs-vsctl add-port dp1 %s' % intf ) switch0.cmd( 'ovs-vsctl set-controller dp0 tcp:10.0.0.8:6633' )
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=1 actions=output:2\"' )
switch0.cmd( 'ovs-ofctl add-flow dp0 \"in_port=2 actions=output:1\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=1 actions=output:2\"' )
switch1.cmd( 'ovs-ofctl add-flow dp1 \"in_port=2 actions=output:1\"' ) info( '*** Waiting for switch to connect to controller' )
while 'is_connected' not in quietRun( 'ovs-vsctl show' ):
sleep( 1 )
info( '.' )
info( '\n' )
print switch0.cmd( 'ovs-ofctl show dp0' )
print switch1.cmd( 'ovs-ofctl show dp1' ) info( "*** Running test\n" )
h0.cmdPrint( 'ping -c3 ' + h1.IP() )
h1.cmdPrint( 'ping -c3 ' + h0.IP() ) info( "*** Stopping network\n" )
controller.cmd( 'kill %' + cname )
switch0.cmd( 'ovs-vsctl del-br dp0' )
switch0.deleteIntfs()
switch1.cmd( 'ovs-vsctl del-br dp1' )
switch1.deleteIntfs()
info( '\n' ) if __name__ == '__main__':
setLogLevel( 'info' )
info( '*** Scratch network demo (kernel datapath)\n' )
Mininet.init()
scratchNet()
  • 修改其为可执行文件并运行:
chmod +x mymininet2.py
./mymininet2.py

  • mn -c命令清理进程

实验小结


  • 这次实验很顺利,遇见的问题都通过陈翔学长和百度解决掉了。

mininet实验 脚本实现控制交换机行为的更多相关文章

  1. Mininet系列实验(七):Mininet脚本实现控制交换机行为

    1 实验目的 熟悉Mininet自定义拓扑脚本的编写: 掌握使用“ovs-vsctl”命令直接控制Open vSwitch. 2 实验原理 在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换 ...

  2. 实验 2:Mininet 实验——拓扑的命令脚本生成

    实验 2:Mininet 实验--拓扑的命令脚本生成 一.实验目的 掌握 Mininet 的自定义拓扑生成方法:命令行创建.Python 脚本编写 二.实验任务 通过使用命令行创建.Python 脚本 ...

  3. 实验 2 :Mininet 实验 —— 拓扑的命令脚本

    实验2: Mininet 实验--拓扑的命令脚本 一.实验目的 掌握 Mininet 的自定义拓扑生成方法:命令行创建.Python 脚本编写 二 .实验任务 通过使用命令行创建.Python 脚本编 ...

  4. Mininet实验 基于Mininet测量路径的损耗率

    实验原理 在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为,此外,还可以利用控制器测量路径的损耗率.在本实验中,基于Mininet脚本,设置特定的交换机间的路径损耗速率,然后编 ...

  5. 软件定义网络实验记录③--Mininet 实验——测量路径的损耗率

    一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定: 初步了解 Mininet 安装时自带的 POX 控制器脚本编写,测试路径损耗率. 二.实验任务 ...

  6. Mininet实验 自定义拓扑结构

    参考:MiniNet实验2 通过Mininet学习可视化操作,可以在界面上方便的构建拓扑结构. 最新的Mininet 2.2.0内置了一个mininet可视化工具miniedit.miniedit在/ ...

  7. SDN实验 3: Mininet 实验——测量路径的损耗率

    验 3:Mininet 实验--测量路径的损耗率 一.实验目的 在实验 2 的基础上进一步熟悉 Mininet 自定义拓扑脚本,以及与损耗率相关的设定:初步了解 Mininet 安装时自带的 POX ...

  8. Mininet实验 源码安装Mininet

    参考:MiniNet实验1 安装命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install git(安装过git就可以忽略此步) ...

  9. 使用Js脚本 修改控制IE的注册表相关设置(activex等)

    使用Js脚本 修改控制IE的注册表相关设置(activex等) 分类: PHP2012-12-05 18:51 2035人阅读 评论(2) 收藏 举报 脚本写法: <SCRIPT LANGUAG ...

随机推荐

  1. Python中级 —— 01面向对象进阶

    面向对象进阶 总结.补充(http://blog.csdn.net/fgf00/article/details/52479307) 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 ...

  2. vue项目使用微信公众号支付总结

    微信公众号支付 1. 使用jssdk调用微信支付,具体查看开发文档: 使用的vuex,在mutations中 wechatPay (state, data) { state.payObject = d ...

  3. Delphi的FIFO实现

    FIFO主要用于多个不同线程或进程之间数据交换时做缓冲区用,尤其适合实时数据通讯应用中的数据缓冲,接收线程(进程)将数据写入FIFO,处理线程(进程)从FIFO取出数据 本单元中: TMemoryFI ...

  4. VM上Hadoop3.1伪分布式模式搭建

    https://www.cnblogs.com/asker009/p/9126354.html 最近要搭建一个Hadoop做实验,因为版本的问题遇到不少的坑,本文记录VM上搭建的CentOS7.0+H ...

  5. Qt界面编程基本操作

    Qt界面编程基本操作 了解基本代码构成 类widget的头文件widget.h如下: #ifndef WIDGET_H #define WIDGET_H #include <QWidget> ...

  6. 飞控入门之C语言结构体、枚举

    结构体 先来说明一下,结构体存在的意义.比如说有一只猫,要在C语言程序中综合描述它,那么可以这样说,它的体重是float类型的,颜色是char类型的,它的一些食物名字是一个数组,那么如果分开定义这些变 ...

  7. python 文件读取方法详解

    话不多说直接码 # 绝对路径 # f = open('/Users/fangxiang/Downloads/我的古诗.text', mode='r', encoding='utf-8') # cont ...

  8. cocos2d-x安装

    mac 安装2.2.6为例 1.进入cocos2d-x/tools/project-creator/ 2.输入 python create_project.py -project HelloWorld ...

  9. R语言学习笔记—朴素贝叶斯分类

    朴素贝叶斯分类(naive bayesian,nb)源于贝叶斯理论,其基本思想:假设样本属性之间相互独立,对于给定的待分类项,求解在此项出现的情况下其他各个类别出现的概率,哪个最大,就认为待分类项属于 ...

  10. 20155215 2016-2017-2 《Java程序设计》第6周学习总结

    20155215 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 stream:串流.抽象化输入/输出概念.将数据从来源取出,使用输入串流:将数据写入 ...