每个子系统的所有组件分布于ONOS系统三个主要层级中,并且可以通过它们实现的一个或多个Java接口识别。

如上图描述了子系统组件之间的关系。图中顶端和底端的虚点线分别代表由北向和南向APIs创建的层级间边界。下面讨论ONOS的子系统结构。
### 提供者
提供者(Provider)位于ONOS堆栈中最底层部分。Provider向下通过特定协议(protocol-specific)的库建立与底层网络的连接,向上通过ProviderService接口建立与ONOS core的联系。协议相关的(protocol-aware)provider使用多种控制和配置协议与网络环境互动,同时想core实时提供特定服务(service-specific)的感知(sensory)数据。有时Provider也会收集来自其他子系统的数据,转换为相应的服务数据。
某些providers也可能需要从core接收控制命令,并使用特定协议将它们应用到底层网络中。
#### 提供者标识(Provider ID)
每个Provider必须和一个ProviderId关联。ProviderId的主要目的是为了提供providers家族的外部标识,允许设备和其他模型实体关联到provider标识,并在provider被卸载后保持它们的存在。
ProviderId提供基于URI方案设计,允许松散地配对不同provider家族的设备,而无须访问Provider本身。
#### 多Providers
子系统可能会包含多个Provider,那么可以指定Provider是主(primary)Provider还是从属的(ancillary)Provider。主Provider拥有其服务的相关实体。这种机制为主要的provider信息提供了优先权。ONOS的Device子系统就是能够支持多Provider的一个例子。
### 管理者
管理者(Manager)是位于ONOS core中的组件,Manager负责接收来自Provider的信息,并为上层应用和服务提供服务等工作。它提供了多种接口:
* 一个用于应用程序或其它core组件读取网络状态的北向服务(Service)接口;
* `AdminService`接口,用于执行管理命令并将命令应用于底层网络状态或系统;
* `ProviderRegistry`南向接口,底层Provider用于向Manager注册,实现彼此的交互;
* `ProviderService`南向接口,提供给已经注册的Provider,用来从manager收发信息;
Manager服务接口的接收者(consumers)可以既可以通过同步地询问服务接收信息,也可以以异步的方式作为事件监听者接收信息(例如,使用每个服务(Service)接口中包含的`ListenerService`接口,注册监听哪些事件,并实现`EventListener`接口接收事件。
### 库(Store)
在core中有一个Store组件,与Manager紧密结合,它主要负责索引、持久化和同步由Manager接收的消息。通过直接与其它ONOS实例的store通信,多个ONOS实例之间确保信息的一致性和鲁棒性。关于分布式设置下的stores的深入讨论见于集群协同章节。
### 应用程序
应用程序(Application)通过`AdminService`和其他服务接口使用和操作由manager聚合的消息。应用程序的功能多种多样,比如在web浏览器中显示网络拓扑,为网络流量设置路径等。
`Application`和`Provider`一样要和一个Id关联,这里称之为`Application Id`。它被ONOS用来跟踪应用程序的上下文(例如,诸如意图(intent)和流表项)。每个应用程序若想得到一个合法ID,它必须提供它的名字,使用`CoreService`注册。应用程序名字遵循反向DNS服务,如,`org.onlab.onos.fwd`。
### 小结
总之,对于子系统,并不是所有的子系统都拥有上述所有组件,也不是所有组件严格地遵守这些功能。例如,`TopologyProvider`纯粹地依靠设备和链路的协议无关抽象,不直接与基础设施交互,且`CoreService`由`CoreManager`实现,一个`manager`只实现一个服务接口。
- 目录
- 前言
- 第一部分 SDN基础
- 第一章 SDN控制器综述
- 1 引言
- 2 控制器架构
- 2.1 集中式控制器
- 2.2 分布式控制器
- 2.3 北向接口编程语言
- 2.4 SDN功能组合
- 2.5 策略更新一致性
- 参考文献
- 第二章 OpenFlow学习指南
- 1 概述
- 2 环境配置
- 2.1 相关软件
- 3 虚拟机设置
- 3.1 导入虚拟机镜像
- 3.2 网络访问
- 4 开发工具手册
- 4.1 Hello world网络
- 4.2 Mininet简介
- 4.3 其它工具
- 4.4 初识控制器
- 5 控制器介绍:以创建学习型交换机为例
- 5.1 POX控制器
- 参考文献
- 第三章 Karaf使用手册
- 1 Apache Karaf
- 2 安装Apache Karaf
- 2.1 依赖条件
- 2.2 获得Apache Karaf发布包
- 2.3 安装Apache Karaf
- 2.4 首次启动
- 2.5 总结
- 3 命令行操作
- 3.1 常用命令
- 3.2 远程控制台访问
- 3.3 自定义命令
- 3.4 可选的web控制台
- 3.5 总结
- 4 仓库
- 4.1 Apache Maven库
- 4.2 Karaf系统库
- 第二部分 ONOS体系架构
- 第一章 ONOS体系概述
- 1.1 设计目标
- 1.2 剩余章节
- 第二章 系统组件
- 2.1 系统层级(system ties)
- 2.2 服务和子系统
- 2.3 子系统结构
- 2.4 事件和描述
- 第三章 构建网络状态
- 3.1 ONOS表示网络
- 3.2 网络发现
- 3.3 网络配置子系统
- 第四章 设备子对象
- 4.1 概述
- 4.2 模型对象和提供者表达
- 4.3 OpenFlow子系统
- 4.4 交换机状态
- 第五章 设备驱动子系统
- 5.1 定义
- 5.2 交付机制
- 5.3 查询机制
- 5.4 模型
- 5.5 上下文
- 第六章 分布式操作
- 6.1 集群协同
- 6.2 网络拓扑状态
- 第七章 意图框架(intent framework)
- 7.1 概述
- 7.2 意图
- 7.3 意图汇编
- 第八章 Web UI架构
- 8.1 概述
- 8.2 客户端架构
- 8.3 服务端架构
- 8.4 处理流程
- 第九章 核心UI扩展体系
- 9.1 拓扑视图架构
- 9.2 关于链路
- 第十章 联盟ONOS web UI
- 第十一章 GUI源代码目录结构
- 第十二章 组件配置
- 12.1 概述
- 12.2 组件代码示例
- 12.3 Maven例子
- 12.4 CLI命令
- 第十三章 应用程序子系统
- 13.1 概述
- 13.2 应用程序包
- 13.3 CLI命令
- 13.4 REST API和shell工具
- 13.5 Maven例子
- 13.6 内建范例和测试应用程序
- 第十四章 分布式原语
- 第十五章 标签(Label)子系统
- 15.1 概述
- 15.2 ONOS应用程序编程接口
- 15.3 使用CLI命令管理标签
- 第十六章 隧道(tunnel)子系统
- 16.1 概述
- 16.2 ONOS应用程序使用的可编程APIs
- 16.3 使用CLI命令管理隧道
- 第十七章 北向接口扩展
- 17.1 概述
- 17.2 驱动器行为
- 17.3 Treatment扩展
- 17.4 selector扩展
- 17.5 应用程序使用范例
- 第三部分 ONOS用户手册(未完,待续)
- 1 获得ONOS
- 2 ONOS源码安装
- 2.1 系统要求
- 2.2 安装JAVA,Maven and Karaf
- 2.3 使用onos测试工具远程部署onos
- 3 ONOS可执行程序安装和配置
- 3.1 运行要求
- 3.2 单机安装ONOS
- 3.3 将ONOS作为系统服务
- 3.4 通过CLI和GUI访问ONOS
- 3.5 组合一个集群
- 4 配置ONOS
- 4.1 管理ONOS应用程序
- 5 ONOS交互接口
- 6 附录A-CLI命令大全
- 7 附录B-REST APIs大全
- 第四部分 ONOS开发指南(未完,待续)
- 开发者快速入门(...)
- 开发ONOS应用程序
- 导入ONOS源码到IDEA
- 开发前配置
- 基于Maven原型生成ONOS应用工程
- 1.3.1 生成应用模板
- 1.3.2 导入APP
- 1.3.3 app添加CLI支持
- 1.3.4 app添加GUI支持
- 第五部分 OpenVirteX架构
- 第一章 OpenVirteX概述
- 1.1 网络虚拟化
- 1.2 OpenVirteX架构
- 第二章 OpenVirteX组件简介
- 2.1 概述
- 2.1.1 实现类
- 2.2 组件状态机
- 2.2.1 基本FSM状态
- 2.2.2 组件FSM的接口
- 2.3 组件的持久化
- 2.4 交换机[net.onrc.openvirtex.elements.datapath]
- 2.5 Ports[package net.onrc.openvirtex.elements.port]
- 2.6 Links和Routes[package net.onrc.openvirtex.elements.link/net.onrc.openvirtex.routing]
- 2.7 Addresses[package net.onrc.openvirtex.elements.address]
- 2.8 Hosts[package net.onrc.openvirtex.elements.host]
- 2.9 Networks[package net.onrc.openvirtex.elements.network]
- 2.10 共享的全局映射[package net.onrc.openvirtex.elements]和 ovxPortMap
- 2.11 消息[package net.onrc.openvirtex.messages]
- 第三章 操作和子系统
- 3.1 系统概述
- 3.2 启动和关闭
- 3.3 事件循环
- OpenVirteX API
- 使用指南
- 第六部分 实验设置