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等