• 实验内容

本实验在基于 Mininet 脚本的不同拓扑环境下使用 OpenDaylight 控制交换机行为。任务一:一台交换机两台主机,从1端口进入的数据流转发到 2 端口,从 2 端口进入的数据流转发到1端口;任务二:两台交换机两台主机,主机 0 连接交换机 0,主机 1 连接交换机 1,交换机 0 连接交换机 1,数据转发端口同任务一;任务三:与任务二类似,但是在创建 link 的时候,设置带宽、延迟以及丢包率。

  • 参考

Mininet脚本实现控制交换机行为

  • 实验环境

虚拟机: Oracle VM VirtualBox Ubuntu16.04LTS

  • 实验步骤

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

1.在~/mininet目录里新建文件 mymininet1.py

# cd mininet
# touch mininet
# vim mymininet1.py

脚本内容如下:

#!/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.2.15:6633' )
# 这里的 IP 地址改为自己本机的,例如我的是10.0.2.15
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()

2.执行该脚本

# python mymininet1.py

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

1.在~/mininet目录里新建文件 mymininet2.py

# cd mininet
# touch mininet
# vim mymininet2.py

脚本内容如下:

#!/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' )
# 这里的 IP 地址改为自己本机的,例如我的是10.0.2.15
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
# 这里的 IP 地址改为自己本机的,例如我的是10.0.2.15
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()

2.执行该脚本

# python mymininet2.py



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

1.在~/mininet目录里新建文件 mymininet3.py

# cd mininet
# touch mininet
# vim mymininet3.py

脚本内容如下:

#!/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' )
# 这里的 IP 地址改为自己本机的,例如我的是10.0.2.15
switch1.cmd( 'ovs-vsctl set-controller dp1 tcp: 10.0.0.8:6633' )
# 这里的 IP 地址改为自己本机的,例如我的是10.0.2.15
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()

2.执行该脚本

# python mymininet3.py



  • 总结

1. 实验过程中遇到的问题

  • 一开始忘记修改代码中控制器的 IP 地址导致连接不上

2. 收获

  • 熟悉 Mininet 自定义拓扑脚本的编写;
  • 掌握使用「ovs-vsctl」命令直接控制 Open vSwitch。

Mininet 系列实验(七)的更多相关文章

  1. Mininet 系列实验(六)

    写在前面 这次实验遇到了非常多问题,非常非常多,花了很多时间去解决,还是有一些小问题没有解决,但是基本上能完成实验.建议先看完全文再开始做实验. 实验内容 先看一下本次实验的拓扑图: 在该环境下,假设 ...

  2. Mininet 系列实验(四)

    实验内容 本次实验拓扑图: 在该环境下,h0 向 h1 发送数据包,由于在 mininet 脚本中设置了连接损耗率,在传输过程中会丢失一些包,本次实验的目的是展示如何通过控制器计算路径损耗速率(h0- ...

  3. Mininet 系列实验(三)

    实验内容 基础 Mininet 可视化界面进行自定义拓扑及拓扑设备自定义设置,实现自定义脚本应用. 参考 Mininet可视化应用 实验环境 虚拟机: Oracle VM VirtualBox Ubu ...

  4. Mininet 系列实验(一)

    关于SDN的第一个实验,似乎实验室里的前辈们也都是从这里开始的. 实验内容 使用源码安装Mininet 参考 Mininet使用源码安装 实验环境 虚拟机:Oracle VM VirtualBox U ...

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

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

  6. Mininet 系列实验(五)

    实验内容 实现一个单个交换机的拓扑,添加一个交换机,和N个主机到网络中.交换机和主机之间的每个链路能够设置带宽.延迟时间.以及丢包率.创建一个包含一个交换机和四个主机的网络,使用iperf测试主机之间 ...

  7. Mininet 系列实验(二)

    实验内容 分别通过命令行创建.Python脚本编写以及交互式界面创建来熟悉Mininet的基本功能. 参考 Mininet命令延伸实验扩展 实验环境 虚拟机:Oracle VM VirtualBox ...

  8. Mininet系列实验(六):Mininet动态改变转发规则实验

    一. 实验目的 熟悉Mininet自定义拓扑脚本的编写:熟悉编写POX脚本动态改变转发规则 二.实验原理 在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为.在本实验中,基于Mi ...

  9. Mininet系列实验(五):Mininet设置带宽之简单性能测试

    1.实验目的 该实验通过Mininet学习python自定义拓扑实现,可在python脚本文件中设计任意想要的拓扑,简单方便,并通过设置交换机和主机之间链路的带宽.延迟及丢包率,测试主机之间的性能.在 ...

随机推荐

  1. Table 组件构建过程中遇到的问题与解决思路

    在 GearCase 开源项目构建 Table 组件的过程中.遇到了各式各样的问题,最后尝试了各种方法去解决这些问题. 遇到的部分问题 checkbox 的全选和半选问题 table 组件的排序请求方 ...

  2. Linux系统下搭建FTP/SFTP服务器

    传输文件经常使用ftp和sftp服务器.Windows下有多种可视化工具,使用快捷.Linux经常需要自行搭建这两种服务器,当然搭建熟练的话,会更加快捷. 1.检查Linux系统是否安装了vsftp和 ...

  3. 黑客攻防web安全实战详解笔记

    如有不足,欢迎指出,谢谢! ----------------------------------------- 1,url传值 GET传值:其传递的值会附加到url上  POST传值:其传递的值不会加 ...

  4. kali vmtools 不能复制粘贴解决方法(绝对实用)

    朋友问起怎么vm kali 2019怎么不能复制了,而且网上的方法大多不适合.我就在这儿记录一笔吧,方便大家. 之前发现最新kali复制粘贴不能用,后来发现一个奇妙的套路,不是共享文件夹.只需要把文件 ...

  5. 马赛克是否无法逆转?Python简单消除,看片无忧!

    图片水印,轻松去除 前段时间玩过了全民K歌,不知道大家是否玩过,还是做得挺好的,就我这嗓子都能唱出张学友的味道,其中更是有消除噪声的功能,就是朋友们都在吃鸡大叫,我在旁边唱歌依然不受影响. 既然声音可 ...

  6. 2018-2019-20172329 《Java软件结构与数据结构》第六周学习总结

    2018-2019-20172329 <Java软件结构与数据结构>第六周学习总结 学无止境,希望自己可以坚持下去,就算自己有太多的事情也不希望自己落下学习,也希望自己可以活成自己想要的样 ...

  7. 第二阶段Sprint4

    昨天:事实现保存到指定路径,并能够选择播放 今天:放弃改文件名,自动生成,实现暂停后继续录制 遇到的问题:不知道为什么实现不了,不然之前录制的视频就会丢失重新录

  8. spring冲刺第九天

    昨天使炸弹可以炸死人物并可以炸没砖块,并试着将小怪加入地图. 今天设计游戏的道具,比如吃了道具人物反方向运动等. 遇到的问题设计不够完善,道具单一.

  9. Spring笔记①--helloworld

    Spring Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架,它主要是为了解决企业应用开发的复杂性而诞生的: 目的:解决企业应用开发的复杂性 功能:使用基本的Javabean ...

  10. 团队作业之404 Note Found Team

    如果记忆是一个罐头的话,我希望这一罐罐头不会过期----<重庆森林> 404 Note Found Team 如果记忆是一个备忘录的话,别说了,它不会过期----<404 Note ...