生动的SDN基础内容介绍(三)--Ryu控制器
控制器
之前介绍完了南向协议OpenFlow,这次说一说Ryu。因为毕设的时候师兄推荐了Ryu,再考虑到Python方便开发,我也就继续用Ryu了。但是后续发现好像支持Ryu开发的框架相较Floodlight、OpenDaylight、ONOS没那么多(但也可能只是我没找到)。
首先非常强烈推荐这位大哥的博客:
https://www.cnblogs.com/ssyfj/p/11730362.html
当时学习的时候多亏了这位大哥,大哥博客里面有很多关于SDN的实验,讲解的很细致。
其次要强烈推荐Ryu官方的手册:
https://ryu.readthedocs.io/en/latest/ofproto_v1_3_ref.html
有不懂的就翻手册。
Ryu的目录
Ryu的安装网上有很多介绍了,这里就不说了。
我用的是Ubuntu20.04,Ryu4.34的目录(ryu/ryu)如下所示:
1、base:
里面有一个很重要的文件:app_manager.py,其作用是Ryu应用的管理中心。用于加载RYU应用程序,接受从APP发送过来的信息,同时也完成消息的路由。其主要的函数有app注册、注销、查找、并定义了Ryu APP基类,定义了Ryu APP的基本属性。
Ryu APP是啥,其实就是用Ryu控制器编写的应用代码,我们在Ryu框架的基础上进行开发,注意这里APP与应用平面不同,我们现在讨论的都是控制平面。
2、controller:
实现控制器和交换机之间的连接和事件处理。
3、lib:
实现了网络的基本协议以及基本的数据结构。
ofctl_v1_3.py中的代码有匹配的函数,可对照之前OpenFlow介绍中显示的匹配域:
4、ofproto:
这里有两类文件,一类是协议的数据结构定义,另外一类是协议的解析,即处理的函数。
如ofproto_v1_3.py是1.3版本的OpenFlow协议数据结构的定义,而ofproto_v1_3_parser.py则定义了1.3版本的协议编码和解码。
5、topology:
这里定义了交换机的数据结构和一些event。
可以看到这里的Switches class将交换机基本的内容已经定义好了:
定义了可支持的OpenFlow的版本、时间、链路、主机、端口等。
6、contrib:
存放了开源社区贡献者的代码。
7、cmd:
为控制器的执行创建环境,执行命令行的命令。
Ryu的学习
Ryu的目录里有一个app目录,这里存放了开发者给我们写好了的一些app。
simple_switch_13.py
这里最要关注的是simple_switch_13.py,这个文件很适合刚接触Ryu的人来熟悉Ryu。
它基于OpenFlow1.3协议实现了简单的学习交换机,为啥叫学习呢,因为最开始交换机不知道去往MAC1的数据包该往哪儿发,然后接受到了一次之后就把要转发的端口记录下来了,下次就知道去MAC1的数据包要从哪个端口走了。其实就是实现了平常咱们用的二层交换机的功能。
关于这个文件的源码讲解,这篇博客还是很好的:
https://www.cnblogs.com/kl107/p/13138568.html
当然还有大哥的这篇:
https://www.cnblogs.com/ssyfj/p/11748465.html
我把我自己的一些注释写在下面的代码里
# Copyright (C) 2011 Nippon Telegraph and Telephone Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from ryu.base import app_manager #app的基类
from ryu.controller import ofp_event #OpenFlow的事件
from ryu.controller.handler import CONFIG_DISPATCHER, MAIN_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.ofproto import ofproto_v1_3#应用的是OpenFlow1.3协议
from ryu.lib.packet import packet
from ryu.lib.packet import ethernet #引入了基本的网络协议
from ryu.lib.packet import ether_types
class SimpleSwitch13(app_manager.RyuApp):
OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION] #应用的版本是OpenFlow1.3
def __init__(self, *args