Open vSwitch简称OVS,OVS是一个支持多层数据转发的高质量虚拟交换机,主要部署在服务器上,相比传统交换机具有很好的编程扩展性,同时具备传统交换机实现的网络隔离和数据转发功能,运行在每个实现虚拟化的物理机器上,并提供远程管理。OVS提供了两种在虚拟化环境中远程管理的协议:一个是OpenFlow,通过流表来管理交换机的行为,一个是OVSDB管理协议,用来暴露交换机的端口状态。其中OpenFlow协议可用于定于SDN网络,实现网络转发平面和控制平面分离。
,将网卡驱动在用户态实现,系统只需在网卡初始化时设置网卡驱动接口即可将网卡收到的报文直接交给用户空间进程进行处理,网卡发送报文时也通过调用用户态定义的发送报文接口将报文直接发送到对应网卡。在OVS的vswitchd进程中新起一个数据收发接管线程(TO-Thread)用于接管系统的OVS中由datapath执行的数据包接收和发送的功能。数据包的流表匹配则直接进行用户态流表匹配。
OVS+DPDK接收报文处理机制: 当报文到达网卡,EAL层根据网卡初始化和驱动层初始化中绑定的用户态网卡驱动,将报文发送到用户空间交给TO-Thread线程进行接管,在该线程中将进行报文的解析、与内核协议栈通信和获取报文key值的操作,然后在vswitchd进程中凭借报文key值完成用户态流表匹配。用户态流表匹配的操作与传统的OVS一样,但若命中流表项本系统将直接交由TO-Thread线程进行action处理,最终将报文通过该接管线程转发出去或丢弃。接收报文的过程中不经过OVS中内核态的datapath进程的处理和内核态流表的匹配。
OVS+DPDK发送报文处理机制: 发送报文时,先经过协议栈的封装处理,将封装好的报文匹配用户态流表,获取action操作。若为隧道转发则还需进行隧道头封装,将报文发往对应的VTEP端口。在隧道转发过程中可能涉及OVS中内部端口多次转发,并在相应端口做报文处理,报文最终要发出的端口通过流表匹配获得。TO-Thread线程将报文直接发往OVS出端口绑定的网卡,由网卡发送到网络中。
Open vSwitch 在不同的平台支持不同的数据路径。不同的数据路径支持不同的功能集合。
目前支持4种数据路径:
Linux upstream:通过上游Linux 内核自带的内核模块实现的datapath。由于openvswitch功能已经引入内核,可以根据不同发行版Linux 的内核版本查看支持的功能。
Linux OVS tree:通过OVS源代码生成的内核模块实现的。
Userspace: 也称为DPDK,dpif-netdev 或者dummy datapath。这是NetBSD,FreeBSD 和Mac OSX 仅支持的数据路径。
Hyper-V: Windows 平台的数据路径。
OpenFlow的核心思想是将传统网络设备的转发动作进行分解,原来一步完成的动作现由OpenFlow虚拟交换机和控制器协作完成,从而将网络设备转发过程中的数据平面和控制平面分离以实现网络处理层次的扁平化。在这种分离架构中,研究人员可以通过高层的控制平面灵活、高效地定制个性化的转发策略或测试新的网络协议等,从而在现有网络结构的基础上实现和部署新型网络架构。
在OpenFlow虚拟网络中,通常包括两类最重要的组件:OpenFlow虚拟交换机和控制器。虚拟交换机通过其维护的流表(Flow Table)决定数据包如何转发,流表定义了许多包括一系列匹配字段(如数据包入口、IP地址、协议类型、链路层地址、端口号等)、计数器机动作(如转发、丢弃、修改包头域等)的流表项(Flow entry),在转发时虚拟交换机将抽取数据包信息并与流表项中的字段进行匹配,一旦匹配成功就执行相应的动作。虚拟交换机只负责根据流表指示转发数据却不关心流表如何制定,实际上流表由控制器制定并下发给虚拟交换机,并且控制器可以随时经网络以OpenFlow定义的形式维护虚拟交换机中的流表,OpenFlow就是通过这种方式实现数据平面与控制平面分离的。
流表在OVS中充当传统物理交换机的MAC表和路由表的角色,数据包在交换机内部端口间的转发规则由流表中的流表项决定。OVS中的流表由多个流表项组成,流表项结构如图:
OpenFlow 1.0 匹配域
其中匹配域是流表匹配的关键字段,主要包括入端口号和报文各层头字段信息。匹配域和优先级唯一指定一条流表项,由于匹配字段包含了链路层、网络层和传输层的大部分标识,会存在一个数据包可与多个流表项中的匹配字段相匹配,优先级则在存在冲突时用于标识流表项的执行顺序。计数器用于统计数据量的相关信息,例如匹配成功的报文数和丢弃的报文数等。指令集表示当数据包匹配到该流表项时,需要执行的动作。超时时间用于设定流表项的超时时间,当流表项到达超时时间将被系统删除。
在OpenFlow 1.0版本中流表的匹配域有十二元组,使得匹配域的宽度已经达到了252位,比Ipv4 RIB TCAM的匹配字段长度增加了3倍左右。在OpenFlow 1.1版本里流表的匹配域已经达到了356位,而且不同匹配域的组合使得OpenFlow流表的流表项爆炸式的增长,这将使得TCAM的存储成本大大的增加,怎么解决流表的开销是OpenFlow面临的一个比较重要的问题。
为了减少流表的开销,从OpenFlow 1.1版本开始设计了多级流表,每个OpenFlow交换机中由一个或多个流表组成。流表的匹配过程因为多级流表被分解了多个步骤,以流水线的方式进行匹配处理,由于将数据包的匹配过程分解到了不同的流表中,每个表匹配不同的匹配域,从而避免了单流表过度膨胀的问题。
多级流表查询采用流水线型多级流表匹配的模式进行,流水线包含多级流表,每个流表由多个流表项组成,流水线处理只能从表号低向表号高的进行,避免环路。流表工作流程:
数据包到达OVS,根据入端口数据包头字段信息按照流表编号顺序由低到高与流表中流表项进行匹配,找出匹配流表项中优先级最高的一项,执行流表项中的指令。若流表项中的指令是指向其他流表,则继续匹配下一个流表中的流表项。否则终止流水线处理,数据包根据动作集进行处理或转发。若数据包未能匹配到流表中的流表项,则系统将该情况认为是table-miss,table-miss表项依据流表配置指出如何处理无匹配项的数据包,例如传递到其他流表、丢弃或上送控制器。
通过这样一个多级流表匹配的过程,形成流水线处理,流表的处理效率可以被提升,同时由于分成了多个流表,使得每个流表的流表项的数目减少,且每个流表的匹配域宽带减少,进而减少了流表的开销。但是由于是一级一级的流水线匹配,这就增加了Openflow交换机的流表匹配的延时,而且也增加了维护这个多级流表查找的复杂度。
当前主流的网络隔离技术是VLAN虚拟局域网隔离技术,VLAN技术主要用于将二层网络划分成不同的广播域。在IEEE 802.1Q协议中定义的VLAN Tag域只有12个比特,使得网络中最多只能划分4096个虚拟局域网,已不能满足大规模租户隔离需求。由此新起了VXLAN网络技术,它通过将L2层的以太网帧封装在L4层的UDP报文中,并使用物理网络设备IP和设备MAC地址作为外层头封装,然后再将封装好的报文发送到网络中,网络只需感知封装后的二层参数,即不需要了解物理设备中虚拟机的IP和MAC地址,这很大程度降低了大二层网络对MAC地址规格的需求,解决了虚拟机数量受网络规格的限制问题。VXLAN协议中引入了VXLAN标识VNI,由24比特组成,相比VLAN标识的范围多了2^12倍,可划分的网络区域量更加庞大,也降低了网络隔离能力的限制。
VXLAN报文实际上是进行了二次封装的UDP报文,在原始以太帧上增添了VXLAN报文头后,再进行UDP报文封装。
VXLAN封装包括VXLAN header、Outer UDP header、Outer IP header、Outer Ethernet header四个部分的封装。
VXLAN header包括Flags、24bits保留字段、VNI字段、8bit保留字段。Flags是占8bits的标识位,取值固定为00001000。VNI字段是用于标识VXLAN段。两个Reserved字段是保留字段,规定设置为0。
Outer UDP header由4个字段组成,源端口由发送设备的VTEP提供,目的端口为用户自定义的VXLAN端口号,一般默认使用4789号端口。Checksum校验字段固定为全0。
Outer IP header中的Protocol协议字段用于标识上层所使用的协议类型。VXLAN外层封装中第四层的协议类型是UDP,因此该字段固定值为0x11。源IP字段由发送端的VTEP提供,是发送端的隧道IP。目的IP字段填接收端的隧道IP。
Outer Ethernet header为二层以太头,其中源MAC地址字段值为发送端虚拟机所属的VTEP的MAC地址,目的MAC地址字段值为接收端虚拟机所属VTEP上路由表中直连的下一跳MAC地址。VLANType字段为可选字段,当封装后的报文携带VLAN Tag时,该字段取值为0x8100,同时VLAN ID字段标识报文所带的VLAN值。Ethernet Type字段用于标识以太报文类型,值设置为0x0800,表示数据包为IPv4报文。
VXLAN报文先由发送端将原始报文封装成包含了VXLAN报文头的UDP报文,经过隧道传输到接收端VXLAN口,接收端再进行解封装获取原始报文,报文传输过程结束。
VXLAN组网中需要进行VXLAN隧道创建,然后通过下发流表让报文经过指定端口转发,在不同端口对报文进行相应处理。VXLAN隧道中关键是VTEP(VXLAN隧道终端)的实现,本文设计的虚拟交换机在VXLAN组网中充当VTEP角色,虚拟机发送的报文都将经过OVS设备转发,OVS设备负责对报文进行识别,以及VXLAN隧道头封装和解封装。以OVS作为VTEP角色的隧道实现如下:
在两台服务器上的OVS中各创建一个网桥,并给网桥配置隧道IP。在网桥中创建虚拟机虚端口、VXLAN口和DPDK口。其中虚拟机虚端口绑定虚拟机创建过程中生成的虚端口,DPDK口绑定支持DPDK组件的网卡设备。网桥中的internal口试网桥创建时生成的网桥内部口,VXLAN转发机制中不使用该端口进行转发。网桥中端口作用如下:
vnet:接收虚拟机发来的原始报文,或者将OVS接收到的报文转发给虚拟机。
vxlan:实现报文VXLAN封装和解封装。
dpdk:从网卡设备接收报文或将报文发往网卡设备。
除了网桥和端口创建外,虚拟交换机系统中用一张vtep-ip映射表记录MAC地址、隧道VNI和隧道IP的对应关系。vtep-ip表中的表项通过对报文解析学习获得。vtep-ip映射表表项结构如下图:
当虚拟机发送原始报文到OVS的vnet端口时,根据流表匹配将报文发送到VXLAN端口,在VXLAN端口下,查看vtep-ip映射表,判断报文源MAC地址和目的MAC地址对应的VNI值是否相同,若不相同则表示发送端虚拟机和接收端虚拟机不在一个隧道里,VXLAN二层转发结束。若VNI值相同,则根据表项的VTEP IP值将报文进行VXLAN封装,然后发往隧道。
OVS虚拟交换机创建的网桥中所添加的各端口对报文有相应的处理,报文发送和接收过程中需要按照特定规则在网桥各端口间进行转发。报文在端口间的报文流向如下:
当虚拟机发送原始报文到OVS的vnet端口时,根据流表匹配将报文发送到VXLAN端口,在VXLAN端口下,查看vtep-ip映射表,判断报文源MAC地址和目的MAC地址对应的VNI值是否相同,若不相同则表示发送端虚拟机和接收端虚拟机不在一个隧道里,VXLAN二层转发结束。若VNI值相同,则根据表项的VTEP IP值将报文进行VXLAN封装,然后发往隧道。
接收隧道报文: 报文首先到达dpdk绑定的网卡设备,由dpdk网卡驱动将网卡中的报文接收,报文到达网桥中的dpdk口,然后通过流表匹配,将报文转发到vxlan口,在vxlan口完成隧道头解析,根据解析的报文隧道ID(VNI字段值)进行流表项匹配,若能命中隧道ID为接收端VNI的流表项,则将报文外层头剥掉,获得原始二层以太帧并转发给vnet口。在vxlan口处理隧道报文过程中,将根据报文内层源MAC、VNI、外层源IP字段,获得对端虚拟机所属的VNI域和隧道IP,完成vtep-ip映射表学习过程。
发送隧道报文: 虚拟机向隧道中发送报文,原始报文首先到达vnet口,通过流表匹配,将报文转发到vxlan口。报文到达VXLAN口,首先通过查询vtep-ip映射表,判断目的虚拟机所属的VNI域是否与发送端的VNI域相同,若相同则将报文进行隧道封装(否则终止VXLAN二层转发),将封装好的报文进行流表匹配,根据匹配结果转报文至DPDK口,由DPDK口把报文交给所绑定的网卡,最后由网卡发送到隧道中去。
原文链接:OVS技术介绍(四十一)_bob62856的博客-CSDN博客_ovs