当前位置:网站首页>软件定义网络实验之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控制器,了解流表项的字段的设置和作用,主机之间无法通信的几种情况。
边栏推荐
猜你喜欢

Latex-查看预收录在arXiv.org上论文的TeX源文件

电压传感器: 工作原理、类型及电路图

2022-08-02:小红拿到了一个大立方体,该大立方体由1*1*1的小方块拼成,初始每个小方块都是白色。 小红可以每次选择一个小方块染成红色, 每次小红可能选择同一个小方块重复染色, 每次染色以后,

【图像分类】2022-MPViT CVPR

【图像分类】2021-EfficientNetV2 CVPR

GoLang 使用 goroutine 停止的几种办法

Greenplum database failure analysis, can not listen to the port

中科磁业IPO过会:年营收5.5亿 吴中平家族持股85%

【问题征集】向 iPod 之父、iPhone 联合设计者、Google Nest 创始人 Tony Fadell 提问啦

一套开源的可快速搭建自己的物联网/智能家居系统源码
随机推荐
全栈---JSONP
matlab常微分方程在传染病建模中的应用
js显示隐藏手机号
SAP 电商云 Spartacus UI 的持续集成 - Continous integration
【遥控器开发基础教程4】疯壳·开源编队无人机-SPI(OLED)
全栈---Proxy
2022 开放原子全球开源峰会 | 麒麟信安携手openEuler助力开源产业繁荣发展
【多线程】线程与进程、以及线程进程的调度
北路智控上市首日破发:公司市值59亿 募资15.6亿
优秀论文以及思路分析02
图文详细解决IDEA使用Debug模式启动项目一直转圈圈跑起不来(亲测可以)
有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf
【mysql知识点整理】--- order by 、group by 出现Using filesort原因详解
担心的事情
从 npm 切换到 pnpm,真香!
Servlet——请求(request)与响应(response)
v-if、v-else、v-elseif v-show v-for
【MySQL —— 数据库约束】
C语言:链表
236. 二叉树的最近公共祖先