在前面两篇文章:网络虚拟化之FlowVisor:网络虚拟层(上)和网络虚拟化之FlowVisor:网络虚拟层(中)中分别介绍了FLowVisor的特性和实现,三连载的最后一篇介绍虚拟网络的隔离机制。
虚拟化的一个重要元素是切片之间的隔离,因为不同资源的隔离机制是不相同的,接下来将分别描述。
1. 带宽隔离
FLowVisor可以通过标记数据包的VLAN优先级比特位来利用现存的交换机带宽隔离特性。VLAN标签拥有三个比特域,PCP(VLAN Priority Code Point)有一个将数据包映射到八个优先级队列中的其中一个的标准机制,OpenFlow协议里面有对VLAN标签和优先级比特的管理,所以可以给流中的所有数据包一个优先级。
因为,为了增强带宽隔离,FLowVisor重写了所有切片的转发表,加了一个“set VLAN priority”的操作,将优先级置为八个优先级队列中的某一个,一个虚拟网络实例中的所有流根据资源分配策略映射到相应的流组(流组需要网络管理员通过CLI定义)
使用VLAN PCP比特位并不是FLowVisor所固有的,而是为了和商用硬件协调工作所选择的短期变通方案。
2. 拓扑隔离
控制器通过OpenFlow协议发现网络中的结点和链路,在非虚拟网络中,当一个网络设备连接到控制器的TCP监听端口的时候,控制器就可以发现这个设备。FLowVisor作为交换机和控制器中间的一个代理,他只代理用户虚拟网络中的交换机和控制器的连接,同理,用于罗列交换机所有物理端口的OpenFlow消息,也会被FLowVisor拦截,修改为只有虚拟网络中有的端口。
需要注意的是LLDP消息的处理,在提高SDN控制器的拓扑发现性能(通过改进逻辑)这篇文章中我已经解释了SDN网络中拓扑发现原理和LLDP数据包的详解,这个消息他有特定的格式,所以FLowVisor拦截住这个消息,给其打上标签,标签为虚拟网络号,当他们再被交换机收到传送到控制器的时候,可以根据标签发送到相应的虚拟网络。
3. 交换机CPU隔离
商用交换机上的CPU都是典型的低功耗嵌入式处理器,因此很容易过载,在大多数交换机硬件中,一个高负载的CPU会导致严重的网络破坏。比如,一个CPU高负载的情况下,硬件转发数据会继续进行,但是交换机会停止响应控制器的OpenFlow请求,导致LLDP链路发现协议超时,让交换机误以为网络连接非常不稳定,网络变得不可用。
交换机的CPU负载主要被下面四种程序瓜分,这四个负载来源需要不同的隔离机制:
- 产生新流到达的消息:在OpenFlow交换机中,如果一个数据包无法匹配流表,就会向控制器发送PacketIn消息,这个过程消耗了一部分处理资源,如果新流比较多,消息产生很频繁,CPU资源就会耗尽。为了防止饿死,FLowVisor会追踪新流产生的消息到达速率,如果速率超过了阈值,FLowVisor插入一条转发流表规则在一个时间段内丢弃所有的数据包,就这样,FLowVisor利用OpenFlow协议限制了新流的速度。
- 处理控制器的请求:对于每个虚拟网络实例,FLowVisor通过限制OpenFlow消息速率来限制CPU消耗,因为不同类型的消息消耗不同的CPU资源,因此这个工作现在还略显不足。
- “慢路径”转发:除了很快的专用的硬件转发路径,数据包通过“慢路径”转发,这当然会消耗一部分CPU资源,而这个消耗显然是不确定的。FLowVisor通过重写多个转发规则,将他们分开,分别为为一次数据包转发事件来防止控制器一次插入多个“慢路径”转发规则,比如OpenFlow的PacketOut消息,他可以一次下发很多转发规则,但是FLowVisor可以拦截,将其分为多个。这样,“慢路径”数据包会通过上面提到的两条机制:新流产生的消息和控制器的请求来限速。
- 维持内部状态:所有的网络设备会使用CPU去更新他们的内部计算器、处理事件等等,所以必须留有足够的CPU给交换机“记账”。FLowVisor通过限制上面三点的CPU消耗来保障交换机有足够的资源执行内部功能。
和带宽隔离一样,CPU隔离机制不是FLowVisor固有的设计,更像是一个解决现在硬件抽象问题的应急措施,这个方面未来还需要做很多工作。
4. 流空间隔离
每个虚拟网络只能处理他们流空间中的数据流,FLowVisor对OpenFlow消息进行重写,确保每个切片之恩那个控制他自己的流,不能影响别的切片的流。当然,不是所有的规则都能够被重写来满足某个切片的流空间,FLowVisor只能让规则更加详细精确,比如在网络虚拟化之FlowVisor:网络虚拟层(中)这篇文章中用于描述FLowVisor工作原理的例子中,如果Bob的控制器想创建一个规则去影响所有的流,FLowVisor应该重写规则让其只影响TCP数据流。但是FLowVisor不会重写影响22端口的数据流的规则,让其只影响80端口(TCP数据流),在这种情况下,FLowVisor会给控制器发送一个错误消息。
5. 流表项隔离
FLowVisor会统计每个虚拟网络使用的流表项数目,确保其不会超过一个预先给定的值。对于控制器插入到交换机的的每个规则,FLowVisor会给其计数器加一,如果某个流表到期失效,计数器会减一。由于硬件约束,一些交换机会内部扩展规则来满足多个输入端口,FLowVisor需要处理这个情况。OpenFlow协议为FLowVisor协议提供了一个机制来精确的列出交换机中的所有流表项,当控制器超出了流表项预先给定的值,任何新的规则插入都只会收到“table full”的错误提醒消息。
6. OpenFlow控制通道隔离
除了上面提到的所有物理资源外,OpenFlow控制器通道本身也必须虚拟化和隔离。比如,OpenFlow协议中的所有消息包含一个独一无二的传输ID,FLowVisor必须重写这些传输ID以确保不同控制器的消息不会使用同一个ID,类似的,如果一个数据包的处理需要交换机做决定,需要先将数据包存储在交换机队列中,OpenFlow协议使用一个32位的整数去标识这个队列中的不同数据包。FLowVisor需要确保每个交换机只能访问交换机队列中他自己的数据包。
到这里,将FLowVisor的由来,实现原理,隔离机制都分析了一遍,对于未来网络中必不可少的虚拟层有了一些了解和新的想法思路,我相信,书和论文是拓展思路的不二法门,相信FLowVisor只是网络虚拟层的一个先驱,未来将会有更加完善,更加功能强大,更加智能化的系统产生,希望自己能够在这些方面有所贡献。