软件定义网络笔记PART 6

  • 北向接口协议
  • 北向接口协议概述
  • 什么是北向接口?
  • 北向接口标准化工作
  • 北向接口设计(两类)
  • 北向接口与网络模型
  • 基于意图的业务模型描述
  • 基于意图的描述举例
  • 北向接口的实现
  • 什么是REST API?
  • 什么是REST?
  • RESTful与REST API
  • 为什么需要RESTful?
  • REST的几个重要概念
  • URI 与 URL 的区别?
  • REST的约束条件与原则
  • REST API的设计
  • REST API的设计
  • HTTP动词
  • 资源的原型
  • URI命名规范
  • URI格式规范
  • 举例:id为123的user相关操作:
  • URI的query字段
  • HTTP响应状态码的使用
  • 常用状态码
  • 元数据设计
  • 举例:Floodlight REST API


北向接口协议

北向接口协议概述

什么是北向接口?

  • 应用平面与控制平面之间的接口(NBI),通过控制器向上层业务应用开放的接口,为上层业务应用和资源管理系统提供灵活的网络资源抽象;
  • 需要满足多样性、合理性和开放性,未形成业界公认标准;

北向接口标准化工作

  • ONF 北向接口工作组NBI-WG:给出了SDN北向接口不同层次的抽象及接口范围;
  • IRTF (Internet Research Task Force)的SDN研究工作组SDNRG:提出SDN的层次化架构,在管理和控制层面上给出网络服务抽象层(Network Service Abstraction Layer,NSAL),即北向接口。
  • IETF的SFC工作组:确立各网络功能服务整合的体系架构及对外的接口。

北向接口设计(两类)

  • 功能型北向接口(Functional NBI):自下而上看网络,重点在网络资源抽象及控制能力的开放,包括Topology、L2VPN、L3VPN、Tunnel等接口。
  • 基于意图的北向接口(Intent-based Interface):自上而下看网络,关注应用或者服务的需求,同具体的网络技术无关。

北向接口与网络模型

java北向接口与南向接口的区别 北向接口 协议_API

基于意图的业务模型描述

java北向接口与南向接口的区别 北向接口 协议_REST_02

基于意图的描述举例

如企业多分支站点之间基于意图的需求:
① 各分支站点可以访问总部站点的网络数据库,但不可以访问总 部站点的用户数据库。

  • a) 目标:各分支、总部网络数据库、总部用户数据库
  • b) 操作:可以访问、不可以访问

b) 各分支站点间的带宽利用率保持大于80%

  • a) 目标:各站点间的带宽资源
  • b) 结果:期待带宽利用率大于80%

北向接口的实现

  • Rest API: SDN北向接口的主流实现方式。实现Rest API的控制器
    有RYU、Floodlight、Opendaylight等
  • 其他方案:RPC、JAVA API、CORBA、SOAP等

什么是REST API?

什么是REST?

REST (Representational State Transfer,表述化状态转移)首次出现在 2000 年 Roy Thomas Fielding 的博士论文中, 指的是一组架构约束条件和原则。

RESTful与REST API

  • RESTful:满足REST约束条件和原则的设计规范或者架构风格 ;
  • REST API:遵循RESTful设计的API。
为什么需要RESTful?

HTTP协议使用不规范、随意、混乱

  • 比如删除一个id号为10的学生,URL有多种写法:
/student/delete/id=10
    /student/id=10&method=delete 
    /deleteStudentById?id=10

RESTful设计:

java北向接口与南向接口的区别 北向接口 协议_REST_03

REST的几个重要概念

java北向接口与南向接口的区别 北向接口 协议_API_04

URI 与 URL 的区别?

java北向接口与南向接口的区别 北向接口 协议_API_05

REST的约束条件与原则

  • 客户-服务器(Client-Server):用户接口和数据存储的分离;
  • 无状态(Stateless):要求每一个请求必须包含服务器处理该请求所需的所有信息;
  • 缓存(Cache):要求一个请求的响应中的数据标记为是否可缓存;
  • 统一接口(Uniform Interface):核心特征,强调组件之间要有一个统一的接口;
  • 分层系统(Layered System):限制组件的行为,将架构分为若干等级的层;
  • 按需代码(Code-On-Demand,可选):服务器可以提供一些代码或者脚本并在客户的运行环境中执行。
(具体的可看课程更为具体)

REST API的设计

REST API的设计

HTTP动词 + URI

  • HTTP动词描述操作; URI是标识资源。
HTTP动词

java北向接口与南向接口的区别 北向接口 协议_java北向接口与南向接口的区别_06

资源的原型
  • 文档(Document):文档是资源的单一表现形式;
  • 集合(Collection):集合是资源的一个容器(目录),可以向里面添加 资源(文档);
  • 仓库(Store):客户端管理的一个资源库,可以向仓库中新增资源 或者删除资源,或者从仓库中获取资源;
  • 控制器(Controller):可以执行一个方法,支持参数输入,结果返回。
URI命名规范

资源命名规范:

  • 文档(Document)类型的资源用名词单数命名
  • 集合(Collection)类型的资源用名词复数命名
  • 仓库(Store)类型的资源用名词复数命名
  • 控制器(Controller)类型的资源用动词命名

URI中有些字段可以是变量,在实际使用中可以按需替换,
例如: http://api.soccer.restapi.org/leagues/{leagueId}/teams/{teamId}/players/{playerId}

  • 其中:leagueId,teamId,playerId 是变量(数字,字符串等类型都可以)。
URI格式规范
  • URI中分隔符“/”一般用来对资源层级的划分, ”/“不应该出现在URL的末尾;
  • URI中尽量使用连字符"-“代替下划线”_"的使用
    例如: http://api.example.restapi.org/blogs/mark-masse/entries/this-is-my-first-post
  • URI中统一使用小写字母
  • URI中不要包含文件(或脚本)的扩展名
    例如:不要出来.php或者.json之类的后缀名。
  • CRUD的操作不要体现在URI中
举例:id为123的user相关操作:
GET /deleteUser?id=123    X
	GET /deleteUser/1234  X
	DELETE /deleteUser/123 X
	POST /users/123/delete X
	
	GET /users/123 √
	POST /users/123  √
	DELETE /users/123 √
URI的query字段
  • 作为查询的参数补充,以标示一个唯一的资源
  • 作为过滤条件使用,例如:
    GET /users?role=admin
  • 作为资源列表分页标示使用,例如:
    GET /users?pageSize=25&pageStartIndex=50
HTTP响应状态码的使用

REST API相关的响应状态码

  • 2xx:操作成功
  • 3xx:重定向
  • 4xx:客户端错误
  • 5xx:服务器错误
常用状态码
200 (“OK”) :一般性的成功返回,不可用于请求错误返回;
  201 (“Created”) :资源被创建;
  202 (“Accepted”) :Controller控制类资源异步处理的返回,仅表示请求已经收到;
  204 (“No Content”) :可能会出现在PUT、POST、DELETE的请求中;
  303 (“See Other”) :返回一个资源地址URI的引用,但不强制要求客户端获取该地址的状态;
  400 (“Bad Request”) :客户端一般性错误返回, 其它4xx的错误,也可以使用400, 具体错误信息可以放在body中;
  401 (“Unauthorized”) :认证错误;
  404 (“Not Found”) :找不到URI对应的资源;
  500 Internal Server Error:服务器处理请求时发生了意外;
  503 Service Unavailable:服务器无法处理请求,一般用于网站维护状态。
元数据设计

HTTP Headers

Content-Type :body的数据格式,如Content-type: application/json,表示主类型是application,数据格式是json
Content-Length :body 数据体的大小
Last-Modified :资源最后被修改的时间戳
ETag :服务器端资源版本的标示
Location :在响应header中使用
Cache-Control, Expires, Date : 通过缓存机制提升接口响应性能
举例:Floodlight REST API

Floodlight的北向API:OpenFlow流表、防火墙、ACL、多租户网络虚拟化。

ACL模块API:

查询所有ACL规则:GET http://<controller_ip>:8080/wm/acl/rules/json
添加ACL规则:POST http://<controller_ip>:8080/wm/acl/rules/json
删除一条ACL:DELETE http://<controller_ip>:8080/wm/acl/rules/json
删除所有ACL:GET http://<controller_ip>:8080/wm/acl/clear/json

使用POST动词具体创建ACL或是使用DELETE动词删除某条ACL时,还需要在json中带上需要传输的数据。例如以curl为例:

curl -X POST -d
'{"src-ip":"10.0.0.1/32","dst-ip":"10.0.0.2/32","action":"deny"}'
http://<controller_ip>:8080/wm/acl/rules/json

参考资料:中国大学MOCC SDN网络课程