当前位置:网站首页>软件定义网络实验之SDN网络简单管理及开发
软件定义网络实验之SDN网络简单管理及开发
2022-08-03 00:35:00 【小许要好学啊】
目录
实验名称
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 os
from 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 Topo
class 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 = 6633
net.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 packet
return
dst = eth.dst #获取源MAC地址
src = eth.src #获取目的MAC地址
dpid = datapath.id #即交换机的id
self.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控制器,了解流表项的字段的设置和作用,主机之间无法通信的几种情况。
边栏推荐
- fifa将采用半自动越位技术计算进球
- 中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%
- 增删改查这么多年,最后栽在MySQL的架构设计上!
- 【mysql知识点整理】--- order by 、group by 出现Using filesort原因详解
- Greenplum database failure analysis, can not listen to the port
- 德邦科技通过注册:年营收5.8亿 国家集成电路基金为大股东
- 通力传动递交注册:年营收4.7亿 实控人项献忠家族色彩浓厚
- 精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
- 北路智控上市首日破发:公司市值59亿 募资15.6亿
- 【问题征集】向 iPod 之父、iPhone 联合设计者、Google Nest 创始人 Tony Fadell 提问啦
猜你喜欢
一套开源的可快速搭建自己的物联网/智能家居系统源码
v-if条件判断及v-show
有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf
npm运行项目dependencies were not found: core-js/modules/es6.array.fill
Visual Studio中vim模拟器
并发模型和I/O模型介绍
Violence recursion to dynamic programming 08 (pony go chess)
Greenplum database failure analysis, can not listen to the port
优秀论文以及思路分析02
中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%
随机推荐
NLP commonly used Backbone model cheat sheet (1)
流程控制for和while循环语句
高并发基石:多线程、守护线程、线程安全、线程同步、互斥锁,一文扫尽!...
北路智控上市首日破发:公司市值59亿 募资15.6亿
【深度学习】基于tensorflow的小型物体识别训练(数据集:CIFAR-10)
浅谈I2C知识
智能合约安全-可重入攻击(SW107-Reentrancy)
dataBinding的import导入
暴力递归到动态规划 07(516. 最长回文子序列)
通力传动递交注册:年营收4.7亿 实控人项献忠家族色彩浓厚
【软考 系统架构设计师】软件架构设计① 软件架构的概念
ASP.NET网络版进销存管理系统源码【源码免费分享】
Greenplum数据库故障分析——can not listen port
8 个常用的 Wireshark 使用技巧,一看就会
可编程逻辑控制器(PLC) : 基础、类型和应用
华为防火墙双机热备技术:HRP、VGMP、VRRP,三大技术值得一学!
alibaba数据同步组件canal的实践整理
Carefully organize 16 MySQL usage specifications to reduce problems by 80% and recommend sharing with the team
【遥控器开发基础教程4】疯壳·开源编队无人机-SPI(OLED)
Visual Studio中vim模拟器