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

一、实验目的

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

二、实验环境

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

三、实验要求

(一)基本要求

  • 完成Ryu控制器的安装。
  • 命令行运行
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
  • 构建下图拓扑,协议使用Open Flow 1.0,并连接Ryu控制器
ryu-manager ryu/ryu/app/gui_topology/gui_topology.py --observe-links

  • 通过Ryu的图形界面查看网络拓扑。
  • 阅读Ryu文档的The First Application一节,运行并使用 tcpdump 验证L2Switch,分析和POX的Hub模块有何不同。

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)

h1 ping h2

h1 ping h3

分析和POX的Hub模块有何不同:

二者均通过洪泛发送报文,但是L2Swtich的下发流表不可查看。

四、个人总结

  • 一开始运行gui_topology.py时提示no module name,后面根据同学的提醒发现是在因为在ryu文件夹下打开的终端,只需要返回学号目录下运行即可。
  • 创建拓扑后pingall不连通,试了一下发现要重新启用ryu控制器,再使用Ryu验证L2Switch,最后创建拓扑。
  • 本次实验与实验五非常相似,都是一个验证性实验,通过实验,我能够独立部署RYU控制器;能够理解RYU控制器实现软件定义的集线器原理;能够理解RYU控制器实现软件定义的交换机原理。
posted @ 2021-10-19 21:50  毛里克  阅读(42)  评论(0编辑  收藏  举报