本节描述ONOS内部如何表示其控制的基础设施。
### 概述
为了管理网络基础设施,ONOS必须维护并跟踪关于网络基础设施的信息(拓扑,安装的流等),并向应用程序提供上述信息。更重要地,应用程序必须屏蔽协议的细节,即使网络状态信息是通过协议相关的方法收集的。
作为一种方案,ONOS维护协议无关(protocol-agnostic)和协议相关(protocol-specific)网络元素和状态表示。这种表示可以从一种类型转化为另一种类型。前者是内核层级(core tier)的结构体,称为模型对象(Model Objects),后者是特定provider的结构体。例如,`DeviceStore`将网络设备看作是一个普通设备(Device),`而OpenFlowDeviceProvider`将网络设备看作一个`OpenFlowSwitch`。这两种表示通过中间转换为一个`DeviceDescription`来连接provider和内核层。模型对象是ONOS暴露给其应用程序的。
另外,如果可能的话,某些自定义的富数据类型(rich data types)用于替换Java原语以避免歧义和混淆。例如,IP地址可由`IPAddress` 类描述,而不是一个`int`型变量。类似地,Mac地址有`MACAddress`类描述,而不是一个`byte[]`或者`long`型。本节剩余部分将聚焦于模型对象。
### 模型对象类型
这些模型对象的接口定义和实现可以在多个程序包[`org.onlab.onos.net.*`]中看到。虽然不正式,隐含的对象分类也在这些包的组织结构中呈现出来。下面我们套路ONOS中主要的模型对象。
#### 网络拓扑
许多模型对象具有图形类似物,就像ONOS将网络表示为有向图。
* 设备(`device`):一种网络基础设施元素,例如,交换机,路由器,访问点(access-point),或者中间设备(middlebox)。设备包含接口/端口(interfaces/ports)集合,以及一个`DeviceId`。设备是网络图中的内部节点(interior vertices)。
* 端口(`port`):设备上的一种网络接口。一个端口和DeviceId对形成一个接入点(ConnectPoint),代表一个图的边(graph edge)的一端。
* 主机(`Host`):网络端实体,具有IP地址,Mac地址,VLAN ID,以及一个`ConnectPoint`。主机网络图的外部节点 (exterior vertices),也就是,叶子节点。
* 链路(`Link`):两个基础设施的设备之间的有向链路,或者说两个ConnectPoints之间的有向链路。链路是网络图中的内部边(interior edges)。
* 边缘链路(`edgeLink`):一个连接主机和设备的特定链路。边缘链路是网络图的外部边(exterior edges)。
* 路径(`Path`):相邻链路的列表,包括边缘链路。如果边缘链路出现在了路径中,那么它只能是一个外部链路(列表的起点或终点)。
* 拓扑(`topology`):一个表示网络的可遍历图的快照(snapshot)。基于该图的路径计算可以使用任意图遍历算法完成,例如,BFS,Dijkstra,或者Bellman-Ford。
#### 网络控制
在应用层,网络指令被表达成高级流规则,给定准则(匹配,match)和处理(动作,action)对。一个ONOS实例相对于某设备来说具有某种角色(role)。该角色决定了实例的指令是否能够应用到设备上。
* FlowRule:给定一个匹配和一个动作的高级流规则。动作可以是一个组合的动作。该抽象不同于OpenFlow中的流规则的概念,例如,流表和OF match-action对的数量。
* 意图Intent:一个高层次的意图,影响网络的配置或连接的网络流量的子集。它允许应用程序指明期望什么事情会发生,而不是指定如何让期望的事情发生。
* RoleValue:对于一个设备,一个ONOS实例的角色。
对于操作网络逻辑的深入讨论将在意图框架(Intent Framework)一节中讨论,而角色的解释将在集群协同(Cluster Coordination)一节详细讨论。
#### 网络报文
来自网络流量的报文,以及注入到网络中的报文,与OpenFlow PacketIn和PacketOut类似。
* `OutboundPacket`:一个合成报文的协议无关表示被发送到网络中。它包括有关在哪里发送这个数据包的信息。
* `InboundPacket`:由一个设备发送到控制器的协议无关表示的报文。在响应式报文处理中,它将PacketIns传递到providers和应用程序中,例如,主机跟踪(host tracking)和链路检测(link detection)。
#### 网络对象依赖
一些对象依赖于其它对象的存在,正如端口,不可能脱离设备而独自存在。类似地,链路也一样。如果没有端口,拓扑也不可能存在。因此,在ONOS的网络表示中,我们将设备看作一等(first-class)对象。
- 目录
- 前言
- 第一部分 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
- 使用指南
- 第六部分 实验设置