一、 ovs各大组件示意图
ovs-vswitchd:ovs守护进程,实现基于流的交换,实现内核datapath upcall 处理以及ofproto 查表,同时是dpdk datapath处理程序。与ovsdb-server通信使用OVSDB协议,与内核模块使用netlink机制通信,与controller通信使用OpenFlow协议。
ovsdb-server:OVS轻量级的数据库服务器的服务程序,用于保存整个OVS的配置信息。数据库服务程序, 使用目前普遍认可的ovsdb 协议。
ovs-vsctl:网桥、接口等的创建、删除、设置、查询等。
ovs-dpctl:配置vswitch内核模块
ovs-appctl:发送命令消息到ovs-vswithchd, 查看不同模块状态
ovs-ofctl:下发流表信息。该命令可以配置其他openflow 交换机(采用openflow 协议)
datapath: Datapath把流的match和action结果缓存,避免后续同样的流继续upcall到用户空间进行流表匹配。
ovs-db:开放虚拟交换机数据库是一种轻量级的数据库,它是一个JSON文件,默认路径:/etc/openvswitch/conf.db
二、 ovs报文转发过程
三、 ovs常用命令
查看open vswitch的网络状态 ovs-vsctl show
添加网桥 ovs-vsctl add-br br0
删除网桥 ovs-vsctl del-br br0
ovs-vsctl --timeout=2 --if-exists del-br br0
查询网桥是否存在 ovs-vsctl br-exists br0
列出所有网桥
显示存在Vlan的网桥
显示网桥的父桥 ovs-vsctl list-br
ovs-vsctl br-to-vlan br0
ovs-vsctl br-to-parent br0
查看 Open vSwitch 中的端口信息 ovs-ofctl show ovs-switch
查看交换机中的所有 Table ovs-ofctl dump-tables ovs-switch
ovs-ofctl dump-tables-desc ovs-switch
查看交换机中的所有流表项
查看br0上各个交换机端口的状态 ovs-ofctl dump-flows ovs-switch
ovs-ofctl dump-ports br0
ovs-ofctl dump-ports-desc br0
查看内核中的数据通路
查看内核中的流表 ovs-dpctl show
ovs-dpctl dump flows
四、ovs和linux bridge
linux bridge运行在linux内核中,数据报文不会离开内核,通过mac地址匹配,实现简单的转发功能。
ovs需要匹配流表规则,兼具内核态和用户态。一般情况下,一个数据流的第一个报文会发向ovs-vswitchd,后续报文会直接利用内核中的流表缓存进行处理。
五、dpdk
dpdk
是一组快速处理数据包的开发平台及接口。有intel主导开发,主要基于Linux系统,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。
dpdk作用
在数据平面应用中为快速处理数据包提供一个简单而完善的架构。在理解此工具集之后,开发人员可以以此为基础进行新的原型设计处理大并发网络数据请求。
当前数据包的处理流程是这样:
数据包到达网卡,网卡发送中断通知CPU,CPU将数据包拷贝到内核空间中,应用程序从内核空间中拷贝数据到用户态空间,数据处理。
在这个过程中数据包处理耗时的操作有:
网卡每次收到数据都发送中断,打断cpu的工作。切换和恢复过程都耗时
网络数据包经过TCP/IP协议栈,达到真正的应用处理程序时走过很多的流程
应用程序拿到网络数据时需要经过内核空间到用户态空间的一次copy,增加耗时
dpdk解决办法
DPDK技术是重载网卡驱动,直接将数据传递给用户态的应用程序,避免了中间环节的经过TCP/IP协议栈,内核空间到用户空间的copy。
同时针对第一点网卡频繁的中断,应用程序可以使用轮询的方式获取网卡上的数据,避免中断造成的场景切换和恢复浪费的时间。
dpdk优缺点
DPDK绕过了内核空间,ovs-DPDK的datapath存在于用户空间,能大幅提升网络性能,并且已经在一些对网络性能有要求的场合使用,例如NFV。
对于SDN controller来说,因为连接的是ovs-vSwitchd和ovsdb-server,所以感觉不到差异。
虽然DPDK在一定程度上解决了性能的问题,并且DPDK社区在不断的进行优化,但是DPDK也有其自身的问题:
首先,DPDK没有集成在操作系统中,使用DPDK就需要额外的安装软件,这增加了维护成本。
其次,绕过了Linux内核空间,也就是绕过了网络协议栈,这使得基于DPDK的应用更难调试和优化,因为大量的基于Linux kernel网络调试监控工具在DPDK下不可用了。
第三个问题,DPDK独占了部分CPU和内存,这实际上分走了本该用来运行应用程序的资源,最直观的感受是,使用了DPDK之后,主机可以部署的虚机数变少了。
六、流表
一个最简单的流表由3部分组成,分别是:匹配项 ,动作 ,计数器。
流表(低版本)可以匹配OSI模型的1层至4层,如下图所示,对匹配到的流表做转发、丢弃或者更复杂的操作。具体的匹配项如下图所示:
流表字段含义
priority:表示优先级,取值越大,优先级越高,匹配table n时,从优先级高的开始匹配。
in_port:数据包进入端口,用于输出端口时,只允许入端口发送的数据包通过。
dl_vlan:数据包的vlan。
dl_vlan_pcp=priority:VLAN 优先级,改值取值区间为[0-7]。数字越大,表示优先级越高。
dl_src=<MAC>,dl_dst=<MAC>:匹配源或者目标的 MAC
地址01:00:00:00:00:00/01:00:00:00:00:00 代表广播
地址00:00:00:00:00:00/01:00:00:00:00:00 代表单播
dl_type=ethertype:匹配以太网协议类型,其中:dl_type=0x0800 代表 IPv4 协议,dl_type=0x086dd 代表 IPv6 协议,dl_type=0x0806 代表 ARP 协议
nw_src=ip[/netmask],nw_dst=ip[/netmask]:当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址,可以使 IP 地址或者域名
nw_proto=proto:和 dl_type 字段协同使用。当 dl_type=0x0800 时,匹配 IP 协议编号,当 dl_type=0x086dd 代表 IPv6 协议编号
table=number:指定要使用的流表的编号,范围是 0-254。在不指定的情况下,默认值为 0 通过使用流表编号,可以创建或者修改多个 Table 中的 Flow
reg<idx>=value[/mask]:交换机中的寄存器的值。当一个数据包进入交换机时,所有的寄存器都被清零,用户可以通过 Action 的指令修改寄存器中的值
tp_src=number:TCP/UDP/SCTP 源端口
tp_dst=number:TCP/UDP/SCTP 目的端口
output:如果没有指定组行动,报文就会按照 output 行动中指定的端口转发。Output 行动最后执行。如果组行动和输出行动均存在,那么组行动优先级高。如果两者均不存在,那么报文被丢弃。
mod_vlan_vid:修改数据包的 VLAN tag
strip_vlan:剥离数据包的 VLAN tag
mod_dl_src/ mod_dl_dest:修改源MAC或目的MAC 地址
mod_nw_src/mod_nw_dst:修改源IPv4 地址或者目的IPv4 地址
resubmit(,n):转至table n重新进行匹配
load:value−>dst[start..end]:写数据到指定的字段
normal:代表传统的非 OpenFlow 流水线。仅可用于为一个输出端口,使用普通的流水线处理数据包。如果交换机不能转发数据包从 OpenFlow 流水线到普通流水线,它必须表明它不支持这一行动。
actions:行动集,对数据包的处理行动