软件定义网络笔记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):自上而下看网络,关注应用或者服务的需求,同具体的网络技术无关。
北向接口与网络模型
基于意图的业务模型描述
基于意图的描述举例
如企业多分支站点之间基于意图的需求:
① 各分支站点可以访问总部站点的网络数据库,但不可以访问总 部站点的用户数据库。
- 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设计:
REST的几个重要概念
URI 与 URL 的区别?
REST的约束条件与原则
- 客户-服务器(Client-Server):用户接口和数据存储的分离;
- 无状态(Stateless):要求每一个请求必须包含服务器处理该请求所需的所有信息;
- 缓存(Cache):要求一个请求的响应中的数据标记为是否可缓存;
- 统一接口(Uniform Interface):核心特征,强调组件之间要有一个统一的接口;
- 分层系统(Layered System):限制组件的行为,将架构分为若干等级的层;
- 按需代码(Code-On-Demand,可选):服务器可以提供一些代码或者脚本并在客户的运行环境中执行。
(具体的可看课程更为具体)
REST API的设计
REST API的设计
HTTP动词 + URI
- HTTP动词描述操作; URI是标识资源。
HTTP动词
资源的原型
- 文档(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网络课程