实验一:SDN拓扑实践

一、实验目的

1.能够使用源码安装Mininet
2.能够使用Mininet的可视化工具生成拓扑
3.能够使用Mininet的命令行生成特定拓扑
4.能够使用Mininet交互界面管理SDN拓扑
5.能够使用Python脚本构建SDN拓扑

二、实验环境

buntu 20.04 Desktop amd64

三、实验要求

(一)基本要求

1.使用Mininet可视化工具,生成下图所示的拓扑,并保存拓扑文件名为学号.py

成功搭建要求拓扑
在这里插入图片描述
保存为102101517.py
![102101517.py](https://img-blog.csdnimg.cn/248e140402d94d1c9acf31bdcd39364a.pn

4.编辑基本要求第1步保存的Python脚本,添加如下网络性能限制,生成拓扑:
a) h1的cpu最高不超过50%;
b) h1和s1实践的链路带宽为10,延迟为5ms,最大队列大小为1000,损耗率50

  • 通过sudo chmod -R 777 + 文件名令之前的文件可写,直接在脚本内添加
  • 为先前保存的Python脚本添加题示的网络性能限制:

为先前保存的Python脚本添加题示的网络性能限制

  • 再次生成拓扑

再次生成拓扑
使用iperf测试链路带宽
使用iperf测试链路带宽

(二)进阶要求

编写Python脚本,生成如下数据中心网络拓扑,要求:

  • 使用Python的循环语句实现编写下图所示数据中心胖树拓扑文件,要求交换机名称、链路信息均与
    图中一致,拓扑文件命名为“学号_fattree.py”;
  • 通过Mininet的custom参数载入“学号_fattree.py”,实现在Mininet上创建Fat-Tree拓扑,设备名
    称必须和下图一致;
  • 参考OpenLab-一站式ICT创新服务平台51的“Mininet多数据中心网络拓扑流量带宽实验”以及Mininet多个数据中心的拓扑网络实现 | SDNLAB | 专注网络创新技术,测量下图拓扑的主机连通性及不同层的通信带宽。
  • 代码如下

fattree代码

  • 在终端中输入命令:
sudo mn --custom 102101517_fattree.py --topo mytopo

在测试连通性时,发现主机无法ping通。经过网上资料:可能大多数情况是因为拓扑中有环路导致switch学习的时候没办法收敛。 可以使用如下参数–switch lxbr,stp=1or–switch ovsbr,stp=1 ,选择交换机类型为lxbr或者ovsbr,利用Spanning Tree Protocol(stp)。还有一种选择就是利用dpctl add-flow in_port=[switch端口],actions=output:[switch端口] 手动添加。

  • 改为输入命令:
sudo mn --custom 102101517_fattree.py --topo mytopo --switch ovsbr,stp=1

在这里插入图片描述

  • 输入pingall

pingall

  • 输入net

在这里插入图片描述

  • 输入links

在这里插入图片描述

  • 带宽测试

在这里插入图片描述


实验二:Open vSwitch虚拟交换机实践

一、实验目的

  • 能够对Open vSwitch进行基本操作;
  • 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表;
  • 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机

二、实验环境

  • 下载虚拟机软件Oracle VisualBox 或 VMware;
  • 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet

三、实验要求

(一)、基本要求

1.熟悉网桥管理和流表管理的基础操作实践

  • ovs-vsctl基础操作实践:创建OVS交换机,以ovs-xxxxxxxxx命名,其中xxxxxxxxx为本人学号。在创建的交换机上增加端口p0和p1,设置p0的端口号为100,p1的端口号为101,类型均为internal;为了避免网络接口上的地址和本机已有网络地址冲突,需要创建虚拟网络空间(参考命令netns)ns0和ns1,分别将p0和p1移入,并分别配置p0和p1端口的ip地址为190.168.1.100、192.168.1.101,子网掩码为255.255.255.0;最后测试p0和p1的连通性。
  • 在命令行中输入相关命令,创建OVS

2.使用Mininet搭建的SDN拓扑,如下图所示,要求支持OpenFlow 1.3协议,主机名、交换机名以及端口对应正确。

  • 打开终端并输入以下命令打开Mininet工具
    sudo python miniedit.py
  • 搭建号的拓扑如下
    在这里插入图片描述
  • 点击左上角Edit,再点击Preference,选择OpenFlow 1.3
    在这里插入图片描述
  • 点击左上角的file,再点击export level2 script,将其保存为py文件
  • 打开刚刚保存的Ovstopo.py文件
    • 修改其中Add links部分代码为:
info( '*** Add links\n')
net.addLink(h1, s1, 1, 1)
net.addLink(h2, s1, 1, 2)
net.addLink(s1, s2, 3, 3)
net.addLink(h4, s2, 1, 2)
net.addLink(h3, s2, 1, 1)
  • 在终端中运行Ovstopo.py文件,查看其连接没有问题
    在这里插入图片描述

3.通过命令行终端输入“ovs-ofctl”命令,直接在s1和s2上添加流表,划分出所要求的VLAN。
在这里插入图片描述

  • 下发流表
    • 保持前面拓扑的运行,再开启一个终端,在终端中依次输入以下命令:
# s1下发流表
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1
sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2

# s2下发流表
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1
sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2
# 查看s1的流表
sudo ovs-ofctl -O OpenFlow13 dump-flows s1

流表s1

# 查看s2的流表
sudo ovs-ofctl -O OpenFlow13 dump-flows s2

流表s1

4.主机连通性要求:

  • h1 – h3互通
  • h2 – h4互通
  • 其余主机不通

在这里插入图片描述

(二)、进阶要求

  • 基本要求中交换机的流表要手动添加,逐条命令输入,能否尝试将命
    令写到代码里,在构造拓扑的时候就把命令下发?阅读Open vSwitch
    使用案例扩展实验 | SDNLAB | 专注网络创新技术使用Mininet,
    编写Python代码,生成(一)中的SDN拓扑,并在代码中直接使用
    OVS命令,做到可以直接运行Python程序完成和(一)相同的VLAN
    划分。

  • 将命令写到代码里

# !/usr/bin/env python

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 call


def mynet():
    net = Mininet(topo=None, build=False, ipBase='10.0.0.0/8')

    info('*** Adding controller\n')
    c0 = net.addController(name='c0', controller=Controller, protocol='tcp', port=6633)

    info('*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch)

    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(h1, s1, 1, 1)
    net.addLink(h2, s1, 1, 2)
    net.addLink(s1, s2, 3, 3)
    net.addLink(h3, s2, 1, 1)
    net.addLink(h4, s2, 1, 2)

    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')

    # 添加流表并划分VLAN
    s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3')
    s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
    s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=0,actions=pop_vlan,output:1')
    s1.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s1 priority=1,dl_vlan=1,actions=pop_vlan,output:2')

    s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=1,actions=push_vlan:0x8100,set_field:4096-\>vlan_vid,output:3')
    s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,in_port=2,actions=push_vlan:0x8100,set_field:4097-\>vlan_vid,output:3')
    s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=0,actions=pop_vlan,output:1')
    s2.cmd('sudo ovs-ofctl -O OpenFlow13 add-flow s2 priority=1,dl_vlan=1,actions=pop_vlan,output:2')

    CLI(net)
    net.stop()
if __name__ == '__main__':
    setLogLevel('info')
    mynet()
  • sudo wireshark,抓取s1(或s2)的3号端口

在这里插入图片描述
在这里插入图片描述

四、个人总结

  • 实验难度:适中
  • 实验过程中遇到的困难与解决办法:刚开始安装虚拟机和配置实验环境的时候,也遇到了不少报错,比如java环境配置,python库安装,ryu插件的安装,基本都是自己通过网上的教程,反复地去尝试,一步一步排除错误。因为是第一次用虚拟机,所以刚开始对各种操作都比较生疏,但经过这一次实验,变得更加熟练。
    开始做实验的时候,发生了棘手的问题,一个是重启系统后虚拟机启动时候报错,为了解决这个错误,花费了不少时间,终于在一个偏僻的个人网站找到了解决方法;一个是重启虚拟机后所有图标和菜单栏都消失了,后来得到解决方法:启动时候应该优先启动硬盘。
    在51OpenLab平台,我学带了很多关于构造拓扑网络的知识,令我对何为软件定义网络有了更加直观且全面的认识。在构造fattree时,还有一个问题就是在进行连通性测试的时候,很多时候都pingall不成功,于是上网查询别人的解决办法,发现可能大多数情况是因为拓扑中有环路导致switch学习的时候没办法收敛。 可以使用如下参数–switch lxbr,stp=1or–switch ovsbr,stp=1 ,选择交换机类型为lxbr或者ovsbr,利用Spanning Tree Protocol(stp)。还有一种选择就是利用dpctl add-flow in_port=[switch端口],actions=output:[switch端口] 手动添加,我自己是使用了STP生成树协议。一开始在创建OVS交换机端口时在终端上输入sudo ovs-vsctl add-port ovs-switch102101517 p0语句时,报了个error,上网找了许多资料,有的说要先写什么语句,有的说要重新初始化某些文件,我尝试先往下做看看情况,结果发现它不影响后面的操作。
  • 个人感想:感觉每一个新的实验的开始总是困难的,但熟能生巧,相信自己会慢慢适应,最让我感兴趣的是Mininet的可视化拓扑,通过自己的布置主机以及交换机等,就可以让他们互相连通起来,以及进阶要求中用编写python脚本来生成复杂的数据中心网络拓扑,也挺有挑战性的。我也算逐渐步入了软件定义网络的殿堂。
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐