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

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

时间:2022-10-23 23:13:55浏览次数:55  
标签:控制器 switch parser 开源 datapath msg ofp ofproto RYU


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

一、实验目的

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

二、实验环境

Ubuntu 20.04 Desktop amd64

三、实验要求

(一)基本要求

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

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

    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)
    

    h1 ping h2

    h1 ping h3

    编程修改L2Switch.py

    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关于simple_switch.py和simple_switch_1x.py的实现,以simple_switch_13.py为例,完成其代码的注释工作,并回答下列问题:

    a)代码当中的mac_to_port的作用是什么?

    保存mac地址到交换机端口的映射

    b)simple_switch和simple_switch_13在dpid的输出上有何不同?

    simple_switch_13对dpid进行了格式化,并填充为16位数字,simple_switch.py直接输出dpid

    c)相比simple_switch,simple_switch_13增加的switch_feature_handler实现了什么功能?

    增加了实现交换机以特性应答消息响应特性请求功能

    d)simple_switch_13是如何实现流规则下发的?

    触发PacketIn事件后,先解析相关数据结构,获取协议信息、获取源端口、包学习,交换机信息,以太网信息等。如果以太网类型是LLDP类型,则忽略。如果不是LLDP类型,则获取目的端口和源端口还有交换机id,然后进行交换机自学习,先学习源地址对应的交换机的入端口,再查看是否已经学习目的mac地址,如果没有就洪泛转发。如果学习过,则查看是否有buffer_id,如果有则在添加流时加上buffer_id,向交换机发送数据包和流表

    e)switch_features_handler和_packet_in_handler两个事件在发送流规则的优先级上有何不同?

    switch_features_handler下发流表的优先级比_packet_in_handler高

    实验反思

    实验中对一些概念不理解,以及一些操作不熟练等在实验中出现很多问题,通过查阅csdn,以及问学长,及参考其他同学的方法使得问题解决,不能闭门造车

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

相关文章

  • 实验5:开源控制器实践——POX
     实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;......
  • 实用的开源博客系统|果断收藏!
    今天来分享几个开源的纯静态博客系统。无需后端,克隆项目,安装依赖,打包部署即可!AuroraAurora是一款基于Vuepress2的博客主题,将本地Markdown文件解析成静态html页......
  • 实验5:开源控制器实践——POX.md
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;......
  • 实验5:开源控制器实践——POX
    一)基本要求1.搭建下图所示SDN拓扑,协议使用OpenFlow1.0,控制器使用部署于本地的POX(默认监听6633端口)生成拓扑sudomn--topo=single,3--mac--controller=remote,ip=......
  • 实验6:开源控制器实践——RYU
    基本要求搭建下图所示SDN拓扑,协议使用OpenFlow1.0,并连接Ryu控制器建立拓扑连接RYU控制器L2Switch.pyfromryu.baseimportapp_managerfromryu.controllerim......
  • 实验5:开源控制器实践——POX
    一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够运用POX控制器编写自定义网络......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够运......
  • 实验5:开源控制器实践——POX
    基本要求1.阅读Hub模块代码,使用tcpdump验证Hub模块;2.阅读L2_learning模块代码,画出程序流程图,使用tcpdump验证Switch模块;进阶要求1.重新搭建(一)的拓扑,此时交换机......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......
  • 实验6:开源控制器实践——RYU
    一、实验目的能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。二、实验环境Ubuntu20.04Desktopamd64......