背景
经过前几章的讲解,现在回过头来再看看SDN的架构
自底向上看一遍:
1、网络设备就是交换机,也就是上一章提到的OVS。
2、南向协议就是OpenFlow协议。
3、SDN控制器有很多种,我们之前关注的是Ryu。
现在就剩北向协议和应用平面了。
这章会关注北向协议和意图驱动,下章会以网络测量为例子说一下应用平面。
北向协议
北向协议/接口的定义:
SDN北向接口是通过控制器向上层业务应用开放的接口,其目标是使得业务应用能够便利地调用底层的网络资源和能力。
通过北向接口,网络业务的开发者能以软件编程的形式调用各种网络资源;同时上层的网络资源管理系统可以通过控制器的北向接口全局把控整个网网络的资源状态,并对资源进行统一调度。
因为北向接口是直接为业务应用服务的,因此其设计需要密切联系业务应用需求,具有多样化的特征。
同时,北向接口的设计是否合理、便捷,以便能被业务应用广泛调用,会直接影响到SDN控制器厂商的市场前景。
来源:
https://zhuanlan.zhihu.com/p/74465580
打住!说了这么多其实可以总结为一句话:
北向协议就是用户与控制器沟通的渠道。
那怎么理解呢:
用户说我现在想删除一个交换机里面的一个流表项,具体的删除逻辑是控制器干的事情,用户只需要告诉控制器他想删掉交换机1的匹配域为“目的ip:10.0.0.1”的那个流表项。
好,用户只表达了三个需求:
1、交换机1
2、匹配域为“目的ip:10.0.0.1”
3、删除这个流表项
具体怎么干用户才懒得去弄,直接让控制器去决定怎么删除,具体的删除逻辑是什么样子的。
按前几章的比喻其实就是,甲方给领导提了三个要求,领导想怎么干就怎么干,只要最后完成了这三个要求就可以。
也就是说北向协议将底层的具体实现抽象化了。
北向协议有很多,也没有规定说是一定要用哪个,因为Ryu用的是REST API,而且REST API在当今的软件开发中也是一种很主流的风格,因此这里我只介绍一下REST API。
REST API
REST API不是一个什么新的技术,它只是一种风格,把之前章节的部分内容搬过来。
REST (Representational State Transfer) API,这是Roy Fielding在2000年提出的一种架构风格或设计原则。REST的原则是将系统中的所有事物抽象为URL表示的资源。客户端可以通过 HTTP 请求(如 GET、POST、PUT、DELETE等)来操作资源。服务器收到请求后会根据不同的方法采取不同的响应,最终将数据以XML、JSON等格式返回给客户端。
说白了就是用URL表示资源然后用GET/POST等常见的动作来对资源进行操作。
一些更详细的讨论可以看
https://www.zhihu.com/question/28557115
我认为REST API为什么被大家喜爱主要有两个优点:
1、简单:
这种设计风格十分简洁易懂,因为大家都接触过HTTP协议,对URL请求也不陌生,以上一章用过的http://127.0.0.1:8080/stats/flow/1为例,很容易就能理解这是对flow流表的查询,最后的1就表示是对交换机1的查询,结合起来就是对交换机1的流表进行查询,是不是很容易理解。
还有就是使用上的简单,大家已经习惯了client-server形式的资源请求,在使用相似的REST API的时候就很容易了。
2、通用性:
由于互联网的快速发展,各种客户端应用和服务器应用层出不穷,REST API可以通过一套一致的接口为各种应用提供服务。换到SDN这里来说就是不管上层应用是啥,只要你们按着我提供好的接口给我发http请求,我就帮你干活。
尽管在SDN里没有明确的client-server结构,但是也可以这么抽象地理解:
用户,也就是应用平面,是client
控制器,也就是帮用户干活的,是server
然后REST API就可以完美地契合进去:
REST API在Ryu中的实现
ofctl_rest.py实现了很多REST API,上一章已经介绍过了,详情见
https://www.freesion.com/article/8090870623/
但是这些都是Ryu预定义好了的,我们如果想自己定义新的该怎么办?
比如说我的毕设需要我自己实现一些REST API来完成应用层与控制层的通信。
让我们看一下Ryu控制器给我们写好了的示例:simple_switch_rest_13.py
详情见
https://osrg.github.io/ryu-book/en/html/rest_api.html
# Copyright (C) 2016 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.
import json
from ryu.app import simple_switch_13
from ryu.controller import ofp_event
from ryu.controller.handler import CONFIG_DISPATCHER
from ryu.controller.handler import set_ev_cls
from ryu.app.wsgi import ControllerBase
from ryu.app.wsgi import Response
from ryu.app.wsgi import route
from ryu.app.wsgi import WSGIApplication
from ryu.lib import dpid as dpid_lib
simple_switch_instance_name = 'simple_switch_api_app'
url = '/simpleswitch/mactable/{dpid}'
class SimpleSwitchRest13(simple_switch_13.SimpleSwitch13):
_CONTEXTS = {
'wsgi': WSGIApplication}
def __init__