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)一样带有集群功能,不过好在较为方便,直观。
然后,继续努力吧。