实验6:开源控制器实践——RYU
一、实验目的
1.能够独立部署RYU控制器;
2.能够理解RYU控制器实现软件定义的集线器原理;
3.能够理解RYU控制器实现软件定义的交换机原理。
二、实验环境
Ubuntu 20.04 Desktop amd64
三、实验要求
(一)基本要求
- 搭建下图所示SDN拓扑,协议使用Open Flow 1.0,并连接Ryu控制器,通过Ryu的图形界面查看网络拓扑。
- 阅读Ryu文档的The First Application一节,运行当中的L2Switch,h1 ping h2或h3,在目标主机使用 tcpdump 验证L2Switch,分析L2Switch和POX的Hub模块有何不同。
分析:L2 Switch模块和POX的hub无太大区别,都是使用OFPP_FLOOD标记让数据包向所有端口发送,
分析代码:Hub模块有被动和主动两个方式,被动是处理每个数据包然后让他们泛洪,主动是给交换机下发流表,告诉每个交换机去泛洪。L2 Switch是直接构造一个数据去泛洪。 - 编程修改L2Switch.py,另存为L2xxxxxxxxx.py,使之和POX的Hub模块的变得一致?(xxxxxxxxx为学号)
(二)进阶要求
1.阅读Ryu关于simple_switch.py和simple_switch_1x.py的实现,以simple_switch_13.py为例,完成其代码的注释工作,并回答下列问题:
a)代码当中的mac_to_port的作用是什么?
回答:mac_to_port是一个保存(交换机id, mac地址)到转发端口的字典。
b)simple_switch和simple_switch_13在dpid的输出上有何不同?
回答:simple_switch和simple_switch_13在dpid的输出上的差别如下:
可以看到simple_switch_13中dpid的输出格式为:用0在dpid前填充至总长度为16,而simple_switch直接输出dpid。
c)相比simple_switch,simple_switch_13增加的switch_feature_handler实现了什么功能?
回答:下发流表项。
d)simple_switch_13是如何实现流规则下发的?
回答:有两种情况:
1.当控制器处于CONFIG_DISPATCHER状态(协商版本并发送FEATURE-REQUEST报文)并且接受到FEATURE_REPLY报文时,执行switch_features_handler()函数。该函数的最后一项add_flow是添加流表项的函数,其参数有datapath,优先级,匹配项,动作,buffer_id,当流表项匹配成功后应立即执行所规定的动作,如果此函数参数有buffer_id(就是交换机发送来的数据包有buffer_id,即交换机有缓存),那发送的Flow_Mod报文就带上buffer_id,若没有buffer_id,buffer_id就是None。最后,发出Flow_Mod报文,实现流规则的下发。
2.当控制器处于MAIN_DISPATCHER状态(已收到FEATURE-REPLY报文并发送SET-CONFIG报文)并且触发Packet_In事件时调用_packet_in_handler函数,然后从接收到的Packet_In报文中取出各种信息,用此dpid(交换机id)初始化mac_to_port,然后进行交换机自学习,取来往数据包的交换机id、源mac和入端口绑定来构造表。如果交换机发来的数据包没有buffer_id,则要回复一个Packet_out报文并带上原数据包的信息,实现流规则的下发。
e)switch_features_handler和_packet_in_handler两个事件在发送流规则的优先级上有何不同?
回答:switch_features_handler在发送流规则的优先级比_packet_in_handler更高。
代码注释工作如下:
2.编程实现和ODL实验的一样的硬超时功能。
(三)个人总结
实验过程遇到的困难及解决办法:
1.在使用ryu控制器可视化拓扑时出现了问题,看不到拓扑的情况,暂时还未解决。
2.在完成进阶要求中的代码注释时遇到了困难,很多地方看的不是很懂,于是上网查询了相关的信息完成了注释。
本次实验和实验五二者连接控制器以及验证的过程差别不大。这次进阶要求的问题有很多,需要自己对于相关代码的理解要十分全面,由于都是英语文档看起来特别费力,所以进阶二硬超时还未完成