【SDNLAB独家译稿】(接本系列上一篇《OpenVirteX体系结构之组件(一)》,本文翻译第二章2.6-2.11小节,其他部分的翻译会陆续发布。)
2.6 链路和路由[package net.onrc.openvirtex.elements.link/net.onrc.openvirtex.routing]
OVX通过链路来表示交换机和端口之间的内部连接。链路被两个终端定义,即源交换机/端口对和目的交换机/端口对:
1 2 3 4 5 6 7 8 9 10 |
protected T1 srcPort // source Port protected T1 distort // destination Port // endpoint Switches are fetched from the parentSwitch attributes of the Ports public T2 getSrcSwitch() { return (T2) this.srcPort.getParentSwitch(); } public T2 getDstSwitch() { return (T2) this.dstPort.getParentSwitch(); } |
链路是定向的,所以一个pair用于表示一个双向链路,LinkPair以Port为key值。有三个类继承Link类。
PhysicalLink(继承Link<PhysicalPort,PhysicalSwitch>)通过物理端口实现两个物理交换机的互连,并且在网络中进行1:1的链路映射。OVX在运行期间通过拓扑发现来查找物理链路。
组件:
- Integer linkId:链路的全局唯一ID
- AtomicInteger linkIds:全局ID计数器,用于linkld 产生
- LinkState state:物理链路的有限状态机
OVXLink(继承Link<OVXPort,OVXSwitch>)在同一租户网络中完成两台OVXSwitch上的两个OVXPort的互连。一个OVXLink可能映射到一条或多条相邻的物理链路。OVXLink由租户配置。
组件:
- Integer linkId:租户网络中唯一链路ID
- Integer tenantId:租户网络的唯一ID
- Mappable map:指向全局映射
- LinkState state:OVXLink关联的有限状态机
- RoutingAlgorithms alg:OVXLink映射到一系列PhysicalLink上的方法。当前的两个选项为静态(手动)或最短路径(spf)
SwitchRoute(继承Link<OVXPort,PhysicalSwitch>)在同一个OVXBigSwitch上互连两个OVXPort,定义一个流量路径穿过OVXBigSwitch的crossbar。SwitchRoute可能映射到一个或多个物理链路,并且由两种类型的终端定义。
- BVS ingress/egress port:OVXPort作为交换机端口被租户识别
- SwitchRoute endpoints:BVS内部的PhysicalPort
组件:
- Integer routeId: SwitchRoute ID,用于OVXBigSwith的唯一识别
- OVXSwitch sw:SwitchRoute所属的交换机
- RouteState state:SwitchRoute的有限状态机
- PhysicalPort inPort:SwitchRoute的入端
- PhysicalPort outPort:SwitchRoute的出端
SwitchRoutes可以由租户指定,或者通过OVXBigSwitch实例的RoutingAlgorithm生成。图2.3和2.4总结了三种链路类型之间的结构与关系。
图2.3:上部)三台物理交换机(ps1,ps2,ps3)通过物理端口(白色圆圈)建立两条物理链路。中部)两台OVXSwitch通过OVXPort(黑色圆圈)建立一条OVXLink。vs1和vs2分别映射到ps1和ps3上。OVXLink映射到两条物理链路,但在租户看来似乎只有一条,ps2不可见。底部)SwitchRoute在同一个BVS内连接两个OVXPort。SwitchRoute有一个外部终端(OVXPort)和内部终端(PhysicalPort)。
图2.4:网络对各种链路的映射。上图为两个租户,其底部为OVX物理网络视图。注意,只有一个PhysicalNetwork,不过为了清晰起见,我们展示了两个实例。左侧)租户1有两条OVXLink,即vlink1和vlink2。vlink1对应路径ps1-ps3-ps2即物理链路l2和l3,然而vlink2是1:1映射到l5上。右侧)租户2包含OVXLinks(红色)和在OVXBigSwitch vs2中端口之间加入的SwitchRoute,后者映射到l3(蓝色)。
2.6.1 虚拟链路恢复
虚拟链接(OVXLinks和SwitchRoutes)与一个或多个PhysicalLinks列表相关联。我们称这些列表为路径。虚拟链路的优先级为其主要路径的优先级值。主要路径可以是为虚拟链路设置的唯一路径,或者是最高优先级的路径。当多条路径连接到一条虚拟链路,未使用的路径可以借助如下几个结构用于组件的恢复:
- private byte priority : 虚拟链路的当前优先级
- private final TreeMap<Byte, List> backupRoutes : 包含可选路径的容器,优先级为key
- private final TreeMap<Byte, List> unusableRoutes : 包含失败路径的容器,优先级为key
关于恢复的细节将在3.8节详细讨论。
2.7 地址(Address)[package net.onrc.openvirtex.elements.address]
网络主机的IP地址是格式化的整型,OVX在虚拟化过程中识别两种类型的IP地址:
- OVXIPAddress是网络主机的IP地址,通过外部方式分配给主机。在租户网络中OVXIPAddress是唯一的。
- PhysicalIPAddress通过OVX分配并且在全网中唯一。OVXIPAddress在网络中心被映射到PhysicalIPAddress以便识别不同租户的流量。这个过程在3.5节地址虚拟化中介绍。
2.8 主机(Hosts)[package net.onrc.openviretex.elements.host]
主机代表穿过租户网络的流量终端。主机通过连接点、地址和唯一ID来定义:
1 2 3 4 5 |
private final Integer hostId; // OVX-asigned UUID private final MACAddress mac; // MAC address of host in the network private final OVXPort port; // Attachment point private OVXIPAddress ipAddress; // Network address private HostState state // Host FSM |
OVX主机是虚拟概念,没有单独的物理和虚拟表示形式。一个主机的物理表示是通过查找其附着点和网络地址的物理同等设备产生的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public HashMap<String, Object> convertToPhysical() { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("hostId", this.hostId); map.put("dpid", this.port.getPhysicalPort().getParentSwitch().getSwitchName()); // Find Physical attachment point that corresponds to Host's virtual one map.put("port", port.getPhysicalPortNumber()); map.put("mac", this.mac.toString()); // Find Host's PhysicalIP, if it has one if (this.ipAddress.getIp() != 0) try { map.put("ipAddress", OVXMap.getInstance().getPhysicalIP(this.ipAddress, this.port.getTenantId()).toSimpleString()); ... |
注意:OVXPort的isEdge属性为true表示这是主机连接点。
2.9 网络[package net.onrc.openvirtex.elements.network]
Network类存储了描述整个网络中交换机、链路、端口和主机关系的映射:
1 2 3 4 5 |
protected final Set<T1> switchSet; // set of all switches found in this network protected final Set<T3> linkSet; // set of all links within this network protected final Map<Long, T1> dpidMap; // mapping between switches and their DPIDs protected final Map<T2, T2> neighborPortMap; // mapping between ports that are endpoints of the same link protected final Map<T1, HashSet<T1>> neighborMap; // mapping between a switch and its adjacencies |
网络不记录SwitchRoute或者哪个端口属于哪个交换机,因为它们存在于Switch类中。 目前有派生自网络类的两种网络表示:
PhysicalNetwork是代表OVX网络视图的单例类,理论上,PhysicalNetwork是基础设施及其状态的准确完整拷贝。PhysicalNetwork在每台交换机上保持基于LLDP的拓扑发现,并且HasedWheelTimer驱动拓扑发现和统计收集过程,网络拓扑发现的详细过程请见3.4节。
组件:
- PhysicalNetwork instance : PhysicalNetwork的单例
- ArrayList uplinkList :
- ConcurrentHashMap<Long,SwitchDiscoveryManager>discoveryManager :交换机(DPID)和拓扑/端口状态发现管理之间的映射
- HashedWheelTimer timer : 部署周期任务定时器
- NetworkState state : 物理网络的有限状态机
OVXNetwork是呈现给租户的网络表示,OVX为每个租户维护一个OVXNetwork实例,该实例通过一个唯一的租户ID标识,并映射到PhysicalNetwork。虚拟网络的拓扑通过OVX的API来配置。OVXNetwork实例为其组件维护一个唯一标识,以及主机之间流量的标识。
组件:
- Integer tenantId : 租户网络的唯一ID
- HashSet controllerUrls : 租户控制器
- IPAddress network : 租户使用的网络地址块
- short mask : 租户使用的网络掩码
- HashMap<IPAddress, MACAddress> gwsMap :
- BitSetIndex dpidCounter, linkCounter, ipCounter, hostCounter : DPID,链路 ID,IP地址和主机ID的生成器
- Map<OVXPort, Host> hostMap :虚拟网络中主机与它们连接点之间的映射。
- OVXFlowManager flowManager : 追踪以太网源地址到目的地址之间的流
- NetworkState state : OVXNetwork的有限状态机
2.10 全局共享映射:[package net.onrc.openvirtex.elements],ovxPortMap
物理网络和租户网络之间的映射存储在全局可访问的、单例OVXMap结构中,映射接口定义了可用的方法来操作这些映射关系。 OVXMap包含一系列以网络组件或其标识符为key值的Java映射集合。
除OVXMap之外,PhysicalPort的ovxPortMap直接在PhysicalPort实例中存储OVXPorts到PhysicalPort的映射。
2.11 消息(Messages)[package net.onrc.openvirtex.messages]
OVX将OpenFlow消息作为特定的消息类实例来处理,每个OpenFlow消息[org.openflow.protocol]都对应一个OVX等价类,也就是说,类名以‘OVX’开头,代替‘OF’,这些消息类实现以下任一种接口:
- Virtualizable(public void virtualize(Pyhsical Switch sw)):处理物理交换机sw的datapath收到的租户层面消息。这涉及到决定哪些租户应该接收消息,每个租户应该如何重写消息以与租户的OVXNetwork拓扑进行通信。
- Devirtualizable(public void devirtualize(OVXSwitch sw)):处理被租户控制器重写至OVXSwitch的网络层面消息。这涉及到决定消息被应用到哪个datapath,并重写消息内容以适应网络的内容。
1.2节中的图1.2对此接口进行了详细阐述,3.3节描述了触发这些方法的核心事件轮询机制,3.5节描述了(de)virtualization 过程。
更多精彩请访问下一篇《OpenVirteX体系结构之操作与子系统(一)》!
译自:北邮FNL实验室张歌,http://ovx.onlab.us/documentation/architecture/