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

一、实验目的

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

二、实验环境

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

三、实验要求

(一)基本要求

完成Ryu控制器的安装。



搭建下图所示SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器。

通过Ryu的图形界面查看网络拓扑。

阅读Ryu文档的The First Application一节,运行并使用 tcpdump 验证L2Switch,分析和POX的Hub模块有何不同。
代码如下:

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模块相比的区别是:
二者都是泛洪转发,pox是直接向交换机发送流表项的,而ryu要经过处理packet_in事件后,才向交换机下发流表。

个人总结

  • 实验难度:
    实验难度中等,因为跟实验五操作流程大同小异,在实验五的基础三,本次实验可以较快的地理解和得出结果。总的来说,实验比较顺利。

  • 遇到的问题:
    在运行ryu-manager L2Switch.py后,一直无法ping不通,后来发现是端口设置错误,没有从8080变幻城6633

  • 个人感想:
    通过ryu的使用,明白了ryu与pox转发的流表的区别,pox是直接向交换机发送流表项的,而ryu要经过处理packet_in事件后,才向交换机下发流表
    通过本次实验,理解RYU控制器发送流表的原理,并且通过查看源码增加强了源码阅读能力和对openflow协议由更深的理解。

posted @ 2021-10-13 17:22  朝如青丝暮成雪6  阅读(57)  评论(0编辑  收藏  举报