2019 SDN上机第5次作业

1.浏览RYU官网学习RYU控制器的安装和RYU开发入门教程,提交你对于教程代码的理解,包括但不限于:

描述官方教程实现了一个什么样的交换机功能?

Add some features to enable the switch to forward the received packets to all ports.

控制器设定交换机支持什么版本的OpenFlow?

OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

OpenFlow1.0

控制器设定了交换机如何处理数据包?

控制器执行流程如下

 @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
     //表明当Ryu收到OpenFlow packet_in消息时,将产生事件(调用“packet_in_handler”方法)
    def packet_in_handler(self, ev):
        msg = ev.msg//ev.msg是表示packet_in数据结构的对象。
        dp = msg.datapath//msg.dp是代表数据路径(开关)的对象。
        ofp = dp.ofproto
        ofp_parser = dp.ofproto_parser
           //dp.ofproto和dp.ofproto_parser是代表Ryu和交换机协商的OpenFlow协议的对象。
        actions = [ofp_parser.OFPActionOutput(ofp.OFPP_FLOOD)]
           //动作列表。OFPActionOutput类与packet_out消息一起使用,以指定要从中发送数据包的交换机端口。该应用程序使用OFPP_FLOOD标志来指示应在所有端口上发送数据包。
        out = ofp_parser.OFPPacketOut(
           //OFPPacketOut类用于构建packet_out消息。
            datapath=dp, buffer_id=msg.buffer_id, in_port=msg.in_port,
            actions=actions)
        dp.send_msg(out)
           //datapath类的send_msg方法,Ryu生成联机数据格式并将其发送到交换机。

2.根据官方教程和提供的示例代码(SimpleSwitch.py),将具有自学习功能的交换机代码(SelfLearning.py)补充完整

感谢贴心的助教和老师,在哪补充,怎么补充都讲得明明白白了。o( ̄▽ ̄)o

# TODO define OpenFlow 1.0 version for the switch
  OFP_VERSIONS = [ofproto_v1_0.OFP_VERSION]

# TODO send modified message out
  datapath.send_msg(mod)
    
# TODO define the action for output
  actions = [datapath.ofproto_parser.OFPActionOutput(out_port)]
    
# TODO define the OpenFlow Packet Out
  out = datapath.ofproto_parser.OFPPacketOut(
      datapath=datapath, 
      buffer_id=msg.buffer_id, 
      in_port=msg.in_port,
      actions=actions, data=data)
  datapath.send_msg(out)

可根据教程理解相关语句,填入对应的标识变量即可。

3.在mininet创建一个最简拓扑,并连接RYU控制器

如下,创建拓扑,并连接至控制器ip,此时还没开启RYU控制器。

4.验证自学习交换机的功能,提交分析过程和验证结果

在mininet中查看此时s1的流表

开启具有SelfLearning功能的控制器

进行h1对h2的ping操作

控制器中显示出预期信息

此时再次查看s1的流表

至此,Selflearning简单验证成功

5.写下你的实验体会

安装RYU搞得我心态崩了,一会儿是pip版本不对,一会儿是初始化失败,一会儿是py环境不匹配.../(ㄒoㄒ)/
询问再三后还是痛下决心重装虚拟机呜呜。
就作业任务而言较为轻松,难处在对RYU控制器框架的理解。
Ryu是基于Python的控制器,不像java类型的控制器(例如ODL)一样带有集群功能,不过好在较为方便,直观。
然后,继续努力吧。

posted @ 2019-11-25 22:02  LudwigCh  阅读(366)  评论(0编辑  收藏  举报