一个交换机代表了一个数据路径(datapath),由一组端口、一个交换机ID(DPID)、相关能力和属性(capabilities / attributes)的描述以及一个channel组成。
protected boolean isConnected = false; // Channel liveness indication
protected OVXDescriptionStatistics desc = null; // Switch statistics
// T extends Port.
protected HashMap<Short, T> portMap // The ports on this switch, keyed by port number
protected OFFeaturesReply featuresReply // The Features Reply
protected Long switchId // The DPID of the switch
protected Channel channel // The control channel to the datapath
Switch子类作为OVX与租户NOS()之间、OVX与datapath (PhysicalSwitch)之间的OpenFlow信道的锚点。所有到达OVX的消息要么分别被北向或南向的事件循环直接处理,要么通过sendMsg() 和 handleIO()方法发送到交换机。下面介绍继承了Switch的几个类:
**PhysicalSwitch (extends Switch)**代表物理网络中的交换机。在OVX与交换机的握手通信期间,每个PhysicalSwitch的属性值来自两方面:由来自OVX的OpenFlow消息的内容填充,或者由运行时的状态消息填充。PhysicalSwitch维护了一张交换机的流表,每个XID翻译器代表与租户控制器之间的控制流量的OpenFlow XID。
相关组件:
* `StatisticsManager statsMan` : 来自相关交换机的统计集合(MongoDB概念)
* `AtomicReference<Map<Integer, List<OVXFlowStatisticsReply>>> flowStats` : 流表、以租户为key的项。
* `AtomicReference<Map<Short, OVXPortStatisticsReply>> portStats `: 端口统计,以端口为键值*
* `XidTranslator<OVXSwitch> translator `: XID 聚合/分发器((de)multiplexer);
* ` SwitchState state` : PhysicalSwitch实例的FSM。
PhysicalSwitch也包含了一个内部类,SwitchDeregAction,同步PhysicalSwitch之上的虚拟元素的状态。下一篇详细讨论OVX的状态管理。
**OVXSwitch (extends Switch)**是所有OVX中虚拟交换机的父类,也就是,对于租户控制器可见的交换机。OVXSwitch实现了FeaturesReply以响应租户,并维护虚拟流表,以及一个buffer map以存储bufferID为key,PacketIns为值。另外,OVXSwitch能够连接到多个控制器并处理控制器角色。关于角色管理,我们在下一篇博客翻译。
相关组件:
* `LRULinkedHashMap<Integer, OVXPacketIn> bufferMap`;
* `Integer tenantId` : 该交换机属于的租户网络的ID;
* `OVXFlowTable flowTable` : 存储交换机的流表项的结构;
* `XidTranslator<Channel> channelMux` : Channel 复用和解复用器((de)multiplexer), 对于多个NOS连接;
* `RoleManager roleMan`: 管理租户控制器的角色消息;
* `SwitchState state` : OVXSwitch 实例的FSM。
另外,OVXSwitch直接实现了一些OFFeaturesReply域:
// Note, some attributes of a virtual switch are fixed:
protected static int supportedActions = 0xFFF; // The supported actions.
protected static int bufferDimension = 4096; // The buffer dimension.
protected Short missSendLen = 128; // The miss send len. Default in spec is 128
protected OVXSwitchCapabilities capabilities; // The capabilities.
下述两个OVXSwitch的子类代表交换机虚拟化的两种模式。
* `OVXSingleSwitch`: 映射到单个物理交换机的虚拟交换机;*
* `OVXBigSwitch`:映射到多个物理交换机的虚拟机交换机,并将这组交换机看做单个“Big”虚拟交换机(BVS)的交换矩阵。OVXBigSwitch维护一张穿过该虚拟交换矩阵的所有路径的路由表。*
相关组件:
* `RoutingAlgorithms alg`:计算路径的算法,分为人工指定或者计算的最短路(SPF);
* `HashMap<OVXPort, HashMap<OVXPort, SwitchRoute>> routeMap`: 给定出入端口条件下,BVS的路由映射;
图2.2 给出了上述Switch类在虚拟网中的位置。

图2.2 OVX中不同Switch类
每个PhysicalSwitch (psw1, 2 and 3)直接对应物理网络中的一个交换机(switch1, 2, and 3)。虚拟交换机vsw1是一种OVXSingleSwitch的实例,直接映射在了PhysicalSwitch psw1之上。vsw2是一个OVXBigSwitch实例,映射在psw2和psw3之上,并且将两者之间的链路作为一个SwitchRoute。每个租户网络可以同时包含两种类型的OVXSwitch,只要它们不是位于相同的PhysicalSwitches上,也就是,在物理网络中不重叠。最后,物理交换机实例OpenFlow信道的终点。
- 目录
- 前言
- 第一部分 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
- 使用指南
- 第六部分 实验设置