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

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

一、实验目的

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

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox或VMware;
  2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;

三、实验要求

(一)基本要求

  1. 完成Ryu控制器的安装。
    img
  2. 搭建下图所示SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器。
    img
  3. 通过Ryu的图形界面查看网络拓扑。
  4. 阅读Ryu文档的The First Application一节,运行并使用 tcpdump 验证L2Switch,分析和POX的Hub模块有何不同。
    h1 ping h2

img

h1 ping p3

img

L2Switch.py

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)
 

img

RYU的L2Switch模块和POX的Hub模块都采用洪泛转发,pox的Hub模块可以在运行时查看流表,ryu的L2Switch模块无法查看运行时的流表

(二)进阶要求

  1. 阅读Ryu关于simple_switch.py和simple_switch_1x.py的实现,以simple_switch_13.py为例,完成其代码的注释工作,并回答下列问题:
    a) 代码当中的mac_to_port的作用是什么?
    b) simple_switch和simple_switch_13在dpid的输出上有何不同?
    c) 相比simple_switch,simple_switch_13增加的switch_feature_handler实现了什么功能?
    d) simple_switch_13是如何实现流规则下发的?
    e) switch_features_handler和_packet_in_handler两个事件在发送流规则的优先级上有何不同?

个人总结

这次实验总体不难,但是因为各种奇奇怪怪的BUG费了大段时间.
先是RYU安装时因为网络的问题报错了好几次,后面关掉了网络代理后可以正常安装了.
然后是开启RYU的时候报错
查了下没找到解决办法,最后重装虚拟机
img

posted @ 2022-11-08 21:37  瀚垠  阅读(80)  评论(0)    收藏  举报