软件定义网络实验之SDN网络简单管理及开发
目录
- 实验名称
- 实验目的
- 实验内容
- 1、结合Mininet及RYU组建SDN网络
- 2、基于RYU及Mininet管理网络、开发简单网络管理程序
- 实验步骤
- 1、结合Mininet及RYU组建SDN网络
- 2、基于RYU及Mininet管理网络、开发简单网络管理程序
- 总结
实验名称
SDN网络简单管理及开发实验
实验目的
基于RYU及Mininet管理网络、开发管理网络应用程序
实验内容
1、结合Mininet及RYU组建SDN网络
运行RYU远程控制器,在mininet上开发实现如图1所示的一个包含两个交换机、两个客户端主机(每个交换机连接一个主机)的简单拓扑,并连接运行的RYU控制器。
2、基于RYU及Mininet管理网络、开发简单网络管理程序
使用mininet命令操作流表项,使主机h1和h2之间不能通信;使用RYU开发简单网络管理程序,使主机h1和h2之间不能通信。
实验步骤
1、结合Mininet及RYU组建SDN网络
1.1 开发基于mininet的网络,编写python程序。
import osfrom mininet.net import Mininet
from mininet.node import RemoteController
from mininet.cli import CLI
from mininet.log import setLogLevel
from mininet.link import TCLink
from mininet.topo import Topoclass linearTopo(Topo):def __init__(self):self.switchList = []self.hostList = []Topo.__init__(self)def create_topo(self):self.create_switch()self.create_host()self.create_link()def create_switch(self):self.switchList.append(self.addSwitch('s1'))self.switchList.append(self.addSwitch('s2'))def create_host(self):self.hostList.append(self.addHost('h1'))self.hostList.append(self.addHost('h2'))def create_link(self):self.addLink(self.switchList[0], self.switchList[1], bw=100, delay='5ms', loss=0)self.addLink(self.switchList[0], self.hostList[0], bw=100, delay='5ms', loss=0)self.addLink(self.switchList[1], self.hostList[1], bw=100, delay='5ms', loss=0)def create_topo():topo = linearTopo()topo.create_topo()net = Mininet(topo=topo, link=TCLink, controller=None, autoSetMacs=True)controller_ip = "127.0.0.1"controller_port = 6633net.addController('controller',controller=RemoteController,ip=controller_ip,port=controller_port)net.start()CLI(net)net.stop()if __name__ == '__main__':setLogLevel('info')if os.getuid() != 0:logger.debug("You are NOT root")elif os.getuid() == 0:create_topo()
1.2 运行RYU控制器
1.3 运行mininet程序
1.4 查看运行结果
(1)查看创建的网络的组成部分
(2)使用ICMP会话测试h1和h2之间的连通性,分析原因
2、基于RYU及Mininet管理网络、开发简单网络管理程序
2.1 使用mininet命令操作流表项,使主机h1和h2之间不能通信
(1)中断h1和h2之间的ICMP会话;
(2)查看交换机s1上的流表项;
xterm s1
ovs-ofctl dump-flows s1
(3)修改交换机s1上的流表项,使主机h1和h2之间不能通信:
所添加的流表项match域设置为:源IP地址为h1的IP地址,目的IP地址为h2的IP地址。同时,将该流表项优先级设置为最高(65535),actions设置为drop,使用的命令为:
ovs-ofctl add-flow s1 priority=65535,icmp,nw_src=10.0.0.1,nw_dst=10.0.0.2,actions=drop
注意:1、未打“空格”的地方不能输入空格!2、此命令需在交换机上运行!
(4)查看交换机s1上的流表项是否发生了变化;
(5)使用ICMP会话测试h1和h2之间的联通性;
(6)中断ICMP会话,再次查看交换机s1上的流表项,分析与上次抓获的流表项的不同点
分析2.1中抓获流表项的不同点:
修改后抓获的流表项
①增加了一条流表项
②增加的流表项额外设置了优先级(65535)和匹配协议类型(ICMP)
③增加的流表项中动作字段为丢弃,而不是从某端口转发
(7)分析h1和h2之间不能通信的原理。
分析h1和h2之间不能通信的原理:
匹配流表项时选择优先级最高的优先匹配,故进行h1、h2的ICMP会话时,一直与优先级最高的流表项匹配,并且该流表项的动作字段为丢弃,即ICMP报文一直被丢弃。故h1和h2之间不能通信。
2.2 使用RYU开发简单网络管理程序,使主机h1和h2之间不能通信
(1)关闭mininet、ryu程序;
(2)运行编写的mininet程序;
(3)阅读并分析ryu.ryu.app.simple_switch.py程序;
def _packet_in_handler(self, ev): #交换机向控制器上交packet-in消息msg = ev.msg #获取事件消息datapath = msg.datapath #获取数据通路ofproto = datapath.ofproto #获取数据通路的协议#提取数据包的信息pkt = packet.Packet(msg.data)eth = pkt.get_protocol(ethernet.ethernet)#获取以太网协议信息if eth.ethertype == ether_types.ETH_TYPE_LLDP:# 忽略 lldp packetreturndst = eth.dst #获取源MAC地址src = eth.src #获取目的MAC地址dpid = datapath.id #即交换机的idself.mac_to_port.setdefault(dpid, {}) #设置mac_to_port的默认值self.logger.info("packet in %s %s %s %s", dpid, src, dst, msg.in_port) #日志信息# learn a mac address to avoid FLOOD next time.self.mac_to_port[dpid][src] = msg.in_port
#交换机连接的主机的端口信息,即输入端口#若通往目的主机的端口号找得到,设置为输出端口号,即单播if dst in self.mac_to_port[dpid]: out_port = self.mac_to_port[dpid][dst]else:#找不到,设置输出端口为其他所有端口,即洪泛out_port = ofproto.OFPP_FLOOD # 动作为从输出端口转发# actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]actions = [] #动作为空# install a flow to avoid packet_in next time安装流表项if out_port != ofproto.OFPP_FLOOD: #不是洪泛的情况self.add_flow(datapath, msg.in_port, dst, src, actions)data = None #数据部分为空if msg.buffer_id == ofproto.OFP_NO_BUFFER:data = msg.data#下发流表项out = datapath.ofproto_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=msg.in_port,actions=actions, data=data)datapath.send_msg(out)
(4)阻断h1和h2之间的通信:将程序第81行的“actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]”修改为“actions = []”;注:可先将原第81行的代码注释,另起一行再重新写“actions = []”。
(5)使用ICMP会话测试h1和h2之间的联通性;
(6)分析h1和h2之间不能通信的原理。
程序中action设为空,则在s1中无法安装流表项。由于交换机s1没有流表项,所有ping操作不可达,故h1和h2之间不能通信。
总结
此次实验初步学习RYU控制器,了解流表项的字段的设置和作用,主机之间无法通信的几种情况。
软件定义网络实验之SDN网络简单管理及开发相关推荐
- 软件定义网络实验之SDN环境使用及OpenFLow协议流程分析
文章目录 实验名称 实验目的及要求 实验内容 一.Mininet的基本操作应用 二.OpenFlow协议通信流程解析 实验步骤 一.Mininet基本操作应用实验 二.OpenFlow协议通信流程解析 ...
- python开发网络小工具_Python 实现简单网络应用程序开发
最后一次更新于 2019/07/10 ICMP Ping 目的 此任务是重新创建第3讲(延迟,丢失和吞吐量)中讨论的ping客户端. Ping 是一个用于在计算机网络中测量延迟和丢失的工具. 在实际应 ...
- 开源技术分享:SDN网络浅析与选型
SDN的概念已经流行了很多年了,从一开始的实验室产品到2012年谷歌宣布其主干网络已经全面运行在OpenFlow上,使广域线路的利用率从30%提升到接近饱和.从而证明了OpenFlow不再仅仅是停留在 ...
- 数据中心网络架构 — 云数据中心网络 — SDN 网络技术
目录 文章目录 目录 SDN 网络技术 Overlay Controller Underlay Network 如何大一统的全域 SDN 管控? SDN 网络技术 通过 SDN 网络技术,可以将数据中 ...
- SDN网络的工作原理
SDN的工作原理 一.SDN网络架构的三层模型 架构主要分为协同应用层,控制层,转发层三层,网络架构本身包括管理平面,控制平面和转发平面,与这三层对应. 传统的IP网络具有转发平面,控制平面和管理平面 ...
- 【深度学习】图像匹配Siamese网络实验记录
图像匹配Siamese网络实验记录 Ⅰ. Siamese 网络介绍 Ⅱ. 数据集 AT&T 分拣行李匹配图像 Ⅲ. 实验记录 A. 模型1 1. 实验1 2. 实验2 3. 实验3 B. 模型 ...
- 基于模拟实验理解SDN与传统路由交换网络的关系
[前言] 近年来,随着"云架构"或者"新基建"等概念不断被提及,以及与之相关的IT项目落地,SDN(软件定义网络)也随之被炒热,加上媒体或者许多培训机构因为各种 ...
- 软件定义网络基础(SDN①)
1.SDN的产生: SDN(软件定义网络)的产生源于传统网络无法满足现代网络环境对网络灵活性.可扩展性和安全性等方面的要求.传统网络架构中,网络设备(如交换机和路由器)负责控制和转发数据流量,网络管理 ...
- 软件定义网络基础(SDN④)
一:SDN控制平面 一个或多个SDN控制器组成,是网络的大脑. 对底层网络交换设备进行集中管理,状态监测.转发决策以及处理和调 度数据平面的流量:通过北向接口向上层应用开放多个层次的可编程能力. 1. ...
最新文章
- 用supervisord管理杂乱的服务
- 2019-2020-3 《Java 程序设计》第三周知识总结
- Webdriver定位不到元素的解决办法
- 文献记录(part44)--Skeletonisation algorithms with theoretical guarantees for unorganised point ...
- h3c s7506e 配置手册_H3C交换机s5500Web登录配置
- MySQL数据库视图(view),视图定义、创建视图、修改视图
- Vue 教程第九篇—— 动画和过度效果
- StringBuffer append整数0001的问题
- java被oracle收购,sun被oracle收购了,openoffice和virtualbox会不会死?
- 超星阅读器pdz文件转为xps文件或pdf文件说明
- Linux 常用的zip压缩和解压命令详解
- 优酷路由宝设置虚拟服务器,优酷路由宝设置步骤
- 医疗AI的dicom图像拉取模块设计
- html首页随机飘浮图片,jQuery 全屏随机漂浮图片广告
- 阿里云性能测试工具PTS
- 第二章 关系映射详解
- [转载](asp.net大型项目实践)
- 【Docker】Docker安装
- 主动/被动唤醒源与网络主动/被动唤醒
- python 多进程 提高运行效率