OVS(Open vSwitch) 一个开源的分布式虚拟多层交换机,支持 openFlow 等协议,在 SDN 架构中被 SDN 控制器管理,也可以利用 DPDK 加速的 OVS。
OpenvSwitch 简介
OpenvSwitch(简称OVS)是一个虚拟交换软件,主要用于虚拟机VM环境,作为一个虚拟交换机,支持Xen/XenServer, KVM, and VirtualBox多种虚拟化技术。OpenvSwitch还支持多个物理机的分布式环境。
优点与缺点
- 优点:低成本,易集成,易管理,低成本
- 缺点:
- OVS datapath在操作系统内核空间实现转发,由于只占用 CPU 的部分时间片,且内存受操作系统的管理,存在资源抢占的可能
- 操作系统需要经过硬中断,软中断,内核空间和用户空间的切换来完成网络数据的传输,通过内核进行转发使得网络数据在操作系统内的路径也很长
- 缺点的优化方向
- 与 DPDK 集成
- OpenVSwitch Hardware offload
- Linux TC Flower hardware offload
作用
在虚拟化环境中,一个虚拟交换机(vswitch)主要有如下两个作用:
- 传递虚拟机
VM之间的流量
- 实现
VM和外界网络的通信
如下图所示:

说明:
- Data Flow:
数据流
- Physical Switch:
物理交换机
- Vistual Switch:
虚机交换机
- NIC(
Network interface controller/card): 网卡,又称网络接口控制器,网络适配器或局域网接收器,是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。由于其拥有MAC地址,因此属于OSI模型的第2层。它使得用户可以通过电缆或无线相互连接。
- vNIC(
Virtual Network interface controller): 虚拟网卡
- VIF(
Virtual Network interface) 虚拟网络接口,是计算机网络接口的抽象虚拟化表现,它可能直接或间接连接与NIC
功能
OpenvSwitch主要采用用C编写。目前有以下功能:
- Standard 802.1Q VLAN model with trunk and access ports
- NIC bonding with or without LACP on upstream switch
- NetFlow, sFlow(R), and mirroring for increased visibility
- QoS (Quality of Service) configuration, plus policing
- GRE, GRE over IPSEC, VXLAN, and LISP tunneling
- 802.1ag connectivity fault management
- OpenFlow 1.0 plus numerous extensions
- Transactional configuration database with C and Python bindings
- High-performance forwarding using a Linux kernel module
组成
OpenvSwitch的核心组件包括用户态的 ovsdb-server、ovs-vswitchd 和内核态的 Datapath 组成。如下图所示:

运行原理:
内核模块实现了多个数据路径(DataPath)(类似于网桥),每个都可以有多个vports(类似于桥内的端口)
- 每个
数据路径 通过关联 流表(Flow Table)来设置操作,而这些流表中的流都是用户空间在报文头和元数据的基础上映射的关键信息,一般的操作都是将数据包转发到另一个vport
- 当一个数据包到达一个
vport,内核模块所做的处理是提取其流的关键信息并在流表中查找这些关键信息
- 当有一个匹配的流时它执行对应的操作
- 如果没有匹配,它会将数据包送到
用户空间 的处理队列中(作为处理的一部分,用户空间 可能会设置一个流用于以后遇到相同类型的数据包可以在内核中执行操作)
细节如下图所示:

除了核心组件,还包括一些管理工具,详细介绍如下:
ovs-vswitchd:OVS的核心部件,守护进程,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换(flow-based switching)
- 它和上层
controller 通信遵从 OpenFlow 协议
- 它与
ovsdb-server 通信使用 OVSDB 协议
- 它和
内核模块 通过 Netlink 通信
- 它支持多个独立的
datapath(网桥),它通过更改Flow Table实现了绑定和VLAN等功能
ovsdb-server:轻量级的数据库服务器,用于整个OVS的配置信息,包括接口,交换内容,VLAN等等。
ovs-vswitchd 根据ovsdb-server数据库中的配置信息工作
- 它与
manager 和 ovs-vswitchd 交换信息使用了OVSDB(JSON-RPC)的方式
ovs-db是一个JSON文件,默认路径:/etc/openvswitch/conf.db,可以使用如下命令将数据库导出:
ovsdb-client dump
- ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则
- ovs-vsctl:主要是
获取或者更改 ovs-vswitchd的配置信息(如网桥、接口等),此工具操作的时候会更新ovsdb-server中的数据库
- ovs-appctl:主要是向
ovs-vswitchd守护进程发送命令的,查看不同模块状态,一般用不上
- ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息
- ovs-controller:一个简单的
OpenFlow控制器
- ovs-ofctl:用来控制
OVS作为OpenFlow交换机工作时候的流表内容
- ovs-pki:
OpenFlow交换机创建和管理公钥框架
- ovs-tcpundump:
tcpdump的补丁,解析OpenFlow的消息
- brocompat.ko : Linux bridge compatibility(兼容性) module
- openvswitch.ko : Open vSwitch switching datapath
ovsdb-server 与 ovs-vswitchd 也可以通过 UNIX Domain Socket(/var/run/openvswitch/db.sock) 互相通信
数据路径(DataPath)
什么是数据路径
- 在网络中,
交换机和桥是同一个概念,Open vSwitch实现了一个虚拟机以太交换机,换句话说,Open vSwitch也就是实现了一个以太桥。在Open vSwitch中,给一个交换机(或桥),起了一个专业的名词叫做DataPath
网桥也叫做桥接器,连接两个局域网的设备,网桥工作在数据链路层,将两个LAN连接,根据MAC 地址来转发帧
数据路径的分类
OVS 的 datapath_type 有 nedev 和 system:
netdev 表示用户态数据访问,使用 dpdk 时需要此类型数据路径
system 表示内核数据访问
数据路径的工作规则
网桥处理包遵循以下几条规则:
- 在一个接口上接收到的包不会再往那个接口上发送此包
- 每个接收到的包都要学习其源
MAC地址
- 如果数据包是多播或者广播包(通过2层MAC地址确定)则要向接收端口以外的所有端口转发,如果上层协议感兴趣,则还会递交上层处理
- 如果数据包的地址不能再
MAC表中找到,则向接收端口以外的其他端口转发
- 如果
MAC表中能找到,则转发给相应端口,如果发送和接收都是统一端口,则不发送
- 网桥是以
混杂模式工作的
转发通道
快速通道(fast-path):当 datapath 接收到数据包后,直接查询 内核空间 对应的 flow table,并转发该数据包
- 通过
ovs-dpctl dump-flows 命令查看 flow table
慢速通道(slow-path):当内核中的 flow table 中找不到匹配的流表时,内核空间 就会与 用户空间 进行交互,经过 ovs-vswitchd 查询 数据库(ovsdb:/etc/openvswitch/conf.db) 判断数据包应该转发到哪个端口,并将该流表缓存到 内核空间 的 flow table 中,下一次通过 快速通道 转发数据包
- 通过
ovs-ofctl dump-flows 命令查看 flow table
OVS在SDN中的角色
在SDN中,Open vSwitch作为SDN交换机,向上连接控制器,向下连接主机。并且Open vSwitch交换机能与物理交换机通信,相互交流数据。

扩展
白牌交换机(WhiteBox Switch)是指不贴标签的交换机,并且像PC一样,硬件和软件分离
- 硬件:Broadcom(博通)、Cavium(凯为)、盛科等
- 软件:Cumulus、BigSwitch、Pica8、Snaproute、OPX、OpenSwitch等