首页 > 其他分享 >实验6:开源控制器实践——RYU

实验6:开源控制器实践——RYU

时间:2022-10-19 11:55:07浏览次数:45  
标签:控制器 ryu parser 开源 datapath msg ofp ofproto RYU

实验6:开源控制器实践——RYU

实验目的

  • 能够独立部署RYU控制器;
  • 能够理解RYU控制器实现软件定义的集线器原理;
  • 能够理解RYU控制器实现软件定义的交换机原理。

实验要求

(一)基本要求

1.搭建下图所示SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器,通过Ryu的图形界面查看网络拓扑

  • 建立拓扑
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk

  • 连接Ryu控制器
ryu-manager ryu/ryu/app/gui_topology/gui_topology.py --observe-links

  • 通过Ryu的图形界面查看网络拓扑
    在浏览器中输入地址http://127.0.0.1:8080即可打开ryu的图形界面

(二)阅读Ryu文档的The First Application一节,运行当中的L2Switch,h1 ping h2或h3,在目标主机使用 tcpdump 验证L2Switch,分析L2Switch和POX的Hub模块有何不同。

  • 创建L2Switch文件并添加代码
from ryu.base import app_manager
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_0

class L2Switch(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

    def __init__(self, *args, **kwargs):
        super(L2Switch, self).__init__(*args, **kwargs)

    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        dp = msg.datapath
        ofp = dp.ofproto
        ofp_parser = dp.ofproto_parser

        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]

        data = None
        if msg.buffer_id == ofp.OFP_NO_BUFFER:
             data = msg.data

        out = ofp_parser.OFPPacketOut(
            datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
            actions=actions, data = data)
        dp.send_msg(out)
  • 运行L2Switch
ryu-manager L2Switch.py
  • pingall可以ping通
  • 开启主机终端
mininet>xterm h2 h3
  • 在h2主机终端中输入
tcpdump -nn -i h2-eth0
  • 在h3主机终端中输入
tcpdump -nn -i h3-eth0
  • h1 ping h2
  • h1 ping h3
  • 分析L2Switch和POX的Hub模块有何不同
    Hub和L2Switch模块都是洪泛转发,但L2Switch模块下发的流表无法查看,而Hub模块下发的流表可以查看

(三)编程修改L2Switch.py,另存为L2132002143.py,使之和POX的Hub模块的变得一致

  • 代码
from ryu.base import app_manager
from ryu.ofproto import ofproto_v1_3
from ryu.controller import ofp_event
from ryu.controller.handler import MAIN_DISPATCHER, CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
 
 
class hub(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
 
    def __init__(self, *args, **kwargs):
        super(hub, self).__init__(*args, **kwargs)
 
    @set_ev_cls(ofp_event.EventOFPSwitchFeatures, CONFIG_DISPATCHER)
    def switch_feathers_handler(self, ev):
        datapath = ev.msg.datapath
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser
 
        # install flow table-miss flow entry
        match = ofp_parser.OFPMatch()
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_CONTROLLER, ofproto.OFPCML_NO_BUFFER)]
        # 1\OUTPUT PORT, 2\BUFF IN SWITCH?
        self.add_flow(datapath, 0, match, actions)
 
    def add_flow(self, datapath, priority, match, actions):
        # 1\ datapath for the switch, 2\priority for flow entry, 3\match field, 4\action for packet
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser
        # install flow
        inst = [ofp_parser.OFPInstructionActions(ofproto.OFPIT_APPLY_ACTIONS, actions)]
        mod = ofp_parser.OFPFlowMod(datapath=datapath, priority=priority, match=match, instructions=inst)
        datapath.send_msg(mod)
 
    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        datapath = msg.datapath
        ofproto = datapath.ofproto
        ofp_parser = datapath.ofproto_parser
        in_port = msg.match['in_port']  # get in port of the packet
 
        # add a flow entry for the packet
        match = ofp_parser.OFPMatch()
        actions = [ofp_parser.OFPActionOutput(ofproto.OFPP_FLOOD)]
        self.add_flow(datapath, 1, match, actions)
 
        # to output the current packet. for install rules only output later packets
        out = ofp_parser.OFPPacketOut(datapath=datapath, buffer_id=msg.buffer_id, in_port=in_port, actions=actions)
        # buffer id: locate the buffered packet
        datapath.send_msg(out)

  • 运行结果:
    运行
ryu-manager L2132002143.py
mininet>dpctl dump-flows

自我小结

  • 本次实验对我来说较有难度,首先是对ryu不太熟悉,在做实验时比较茫然,不知道该怎么做,都是在借鉴他人的情况下将此次实验完成。最重要的是实验过程中我遇到了不少困难与问题。比如,在运行L2Switch文件时,一直pingall不通,试了很多方法,后来是在网上查询到应该先打开ryu控制器和运行L2Switch.py文件后再建立拓扑进行pingall,而且有时候还需要多试几次才能ping通。。本次实验让我对ryu的学习更加深入,让我能够独立部署RYU控制器,且能够理解RYU控制器实现软件定义的集线器原理和交换机原理,收获满满。

标签:控制器,ryu,parser,开源,datapath,msg,ofp,ofproto,RYU
From: https://www.cnblogs.com/yiguan123668/p/16805772.html

相关文章

  • 将控制器添加到 ASP.NET Core MVC 应用
    模型-视图-控制器(MVC)体系结构模式将应用分成3个主要组件:模型(M)、视图(V)和控制器(C)。 MVC模式有助于创建比传统单片应用更易于测试和更新的应用。 基于MVC......
  • 实验6:开源控制器实践——RYU
    实验要求(一)基本要求1.搭建下图所示SDN拓扑,协议使用OpenFlow1.0,并连接Ryu控制器。2.建立拓扑并连接RYU控制器3.通过Ryu的图形界面查看网络拓扑4.阅读Ryu文档的The......
  • Notepad++ 替代品开源了!
    在公众号后台回复:JGNB,可获取杰哥原创的PDF手册。JackTian我就是我,是颜色不一样的烟火。24篇原创内容公众号提到文本编辑工具,大家肯定第一时间想到的是Notepad++。Notepa......
  • 一文读懂:开源大数据调度系统Taier1.2版本新增的「工作流」到底是什么?
    一、什么是工作流?在阐述什么是工作流之前,先说一下工作流和普通任务的区别,在于依赖视图。普通任务本身他只会有自己的dag图,依赖视图是无边界的,不可控的,而工作流则是把整个......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......
  • 实验6:开源控制器实践——RYU
    (一)基本要求搭建下图所示SDN拓扑,协议使用OpenFlow1.0,并连接Ryu控制器,通过Ryu的图形界面查看网络拓扑。阅读Ryu文档的TheFirstApplication一节,运行当中的L2Switch,h1......
  • 实验6:开源控制器实践——RYU
    实验6:开源控制器实践——RYU实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。实验要求(一)基本......
  • 实验6:开源控制器实践——RYU
    一、实验目的1.能够独立部署RYU控制器;2.能够理解RYU控制器实现软件定义的集线器原理;3.能够理解RYU控制器实现软件定义的交换机原理。二、实验环境(一)基本要求1.搭建......
  • 实验6:开源控制器实践——RYU
    实验6:开源控制器实践——RYU一、实验目的1.能够独立部署RYU控制器;2.能够理解RYU控制器实现软件定义的集线器原理;3.能够理解RYU控制器实现软件定义的交换机原理。二、......
  • 实验6:开源控制器实践——RYU
    1.建立拓扑并连接RYU控制器2.通过Ryu的图形界面查看网络拓扑3.(1)创建L2Switch.py文件点击查看代码fromryu.baseimportapp_managerfromryu.controllerimporto......