实验6:开源控制器实践——RYU
一、实验目的
1.能够独立部署RYU控制器;
2.能够理解RYU控制器实现软件定义的集线器原理;
3.能够理解RYU控制器实现软件定义的交换机原理。
二、实验环境
1.下载虚拟机软件Oracle VisualBox或VMware;
2.在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;
三、实验要求
1.完成Ryu控制器的安装。
2.搭建下图所示SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器。
3.通过Ryu的图形界面查看网络拓扑。
4.阅读Ryu文档的The First Application一节,运行并使用 tcpdump 验证L2Switch,分析和POX的Hub模块有何不同。
-
通过 vim 编辑保存 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
-
两个模块都使用的是洪泛转发 ICMP 报文,当h1 ping h2时 h3都能抓到数据包。L2Switch 与 Hub 模块的不同在于———— L2Switch 下发的流表无法在 mininet 查看(如下图),Hub 可以。
四、个人总结
- 本次实验难度中等偏上,主要难点在于拓补构建和Ryu控制器的连接顺序,还有之前L2Switch文件的编写验证也花了一些时间,实验原理本身也能有比较清晰的概念,在一些小的点上有些出入,但是对于POX和Ryu的控制器原理的理解大致上对照实验流程和代码模块也能比较好的分析和思考,主要难度还是在于实验操作的问题,Ryu控制器的连接和拓补构建的顺序会导致主机通讯可达的问题,好多次主机之间都无法ping,在参考一些文档和百度查询了相关的问题才得以解决。