Open vSwitch的官方定义:Open vSwitch是一个具有工业级质量的多层虚拟交换机。通过可编程扩展,可以实现大规模网络的自动化(配置、管理、维护)。它支持现有标准管理接口和协议(比如netFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag等,熟悉物理网络维护的管理员可以毫不费力地通过Open vSwitch转向虚拟网络管理)。
http://openvswitch.org/features/
最新代码包主要包括以下模块和特性:
ovs-vswitchd :核心模块,实现交换功能的守护程序(daemon),和Linux内核模块一起,实现基于流的交换;
ovsdb-server :提供轻量级数据库查询服务。其保存了整个OVS的配置信息,包括接口,流表,VLAN等。ovs-vswitchd从其查询配置信息;
ovsdb-tool: 不通过ovs-server就能直接操控数据库
ovsdb-client: 直接通过ovs-server数据库操作
ovs-brcompatd :让 ovs-vswitch 替换 Linux bridge,包括获取 bridge ioctls 的 Linux 内核模块;
ovs-dpctl :dapapath control. 用来配置 switch 内核模块,可以控制转发规则;
ovs-vsctl :获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server数据库;
ovs-appctl :openvswitch apply control, 发送命令来运行相关 daemon(很少使用);
ovsdbmonitor GUI 工具,用于显示 OVS 数据库中的相关数据。
此外, OVS 也提供了支持 OpenFlow 的特性实现,包括
ovs-openflowd: 一个简单的 OpenFlow 交换机;
ovs-controller: 一个简单的 OpenFlow 控制器;
ovs-ofctl :openvswitch openflow control,用来控制OVS作为OpenFlow交换机工作时的流表内容;
ovs-pki : OpenFlow 交换机创建和管理公钥框架;
ovs-tcpundump: 实现类似tcpdump 的抓包分析功能
既然ovs-vswitchd是Open vSwitch的核心模块,咱们就来深入研究下它
vswitchd 模块主要包括 bridge、ofproto 等模块。作为主模块,负责解析和执行其他各个 ovs 命令。vswitchd 的主要功能就是不断检测并调用所有 bridge 上的ofproto,执行其上的处理函数。
ovs-vswitchd.c中有main函数,分析vswitchd可以从这里开始,这里包含以下头文件,其中大部分都是与业务无关的代码,其中与业务有关的也就bridge.h、dpif.h、netdev.h、openflow/openflow.h、ovsdb-idl.h、vconn.h、lib/vswitch-idl.h。
#include "bridge.h" //the bridge module,需要访问ovsdb-server获取配置信息,与ofprotos和ofproto-dpif也有些关系。
#include "command-line.h"
#include "compiler.h"
#include "daemon.h" //守护进程管理模块
#include "dirs.h" //目录管理模块
#include "dpif.h" //dpif, the DataPath InterFace.ovs-vswitchd使用这个接口与内核模块通信,ovs-dpctl也会使用
#include "dummy.h"
#include "memory.h"
#include "netdev.h" //Generic interface to network devices ("netdev"s).用来管理网络设备的模块
#include "openflow/openflow.h" //openflow协议规格定义
#include "ovsdb-idl.h" //Open vSwitch Database Interface Definition Language (OVSDB IDL).应该是访问ovsdb-server进程的接口
#include "poll-loop.h" //High-level wrapper around the "poll" system call.poll系统调用的封装模块
#include "process.h" //Starting and monitoring subprocesses.进程监控模块
#include "signals.h" //signals系统调用的封装模块
#include "simap.h" //数据结构定义和hash map的封装操作接口模块
#include "stream-ssl.h" //SSL安全网络通信封装模块接口
#include "stream.h" //网络通信封装模块接口
#include "svec.h" //SVEC数据结构操作模块,SVEC是什么?
#include "timeval.h" //计时相关系统接口封装模块
#include "unixctl.h" //Unix domain socket control connection.UNIX相关网络通信模块
#include "util.h"
#include "vconn.h" //virtual connections to OpenFlow devices.
#include "vlog.h"
#include "lib/vswitch-idl.h" //自动生成的文件,应该是Open vSwitch Interface Definition Language,可能是openflow协议的具体内容实现
Open vSwitch中许多网络上的概念与平时接触到的不同,这里介绍一下Open vSwitch中用到的一些名词及概念。
Packet (数据包)
网络转发的最小数据单元,每个包都来自某个端口,最终会被发往一个或多个目标端口,转发数据包的过程就是网络的唯一功能。
Bridge (网桥)
Open vSwitch中的一个网桥就是一台以太网交换机交换机,可以创建一个或者多个 Bridge 设备。
其功能是根据一定流规则,把从端口收到的数据包转发到另一个或多个端口。
Port (端口)
端口是收发数据包的单元,和物理以太网交换机的端口概念类似。Open vSwitch中,每个端口都属于一个特定的网桥。端口收到的数据包会经过流规则的处理,发往其他端口;也会把其他端口来的数据包发送出去。Open vSwitch支持的端口有以下几种:
当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port
Interface (iface/接口)
它是连接到 Port 的网络接口设备。Open vSwitch通过Interface与外部交换数据包。在通常情况下,Port 和 Interface 是一对一的关系, 只有在配置 Port 为 bond 模式后,Port 和 Interface 才是一对多的关系。一个接口就是操作系统的一块网卡,这块网卡可能是Open vSwitch生成的虚拟网卡,也可能是物理网卡挂载在Open vSwitch上,也可能是操作系统的虚拟网卡(TUN/TAP)挂载在Open vSwitch上。
Flow (流)
流定义了端口之间数据包的交换规则。每条流分为匹配和动作两部分,匹配部分选择哪些数据包需要可以通过这条流处理,动作决定这些匹配到的数据包如何转发。流描述了一个网桥上,端口到端口的转发规则。比如我可以定义这样一条流:
当数据包来自端口A,则发往端口B
来自端口A 就是匹配部分,发往端口B 就是动作部分。
流的定义可能非常复杂,比如:
当数据包来自端口A,并且其源MAC是aa:aa:aa:aa:aa:aa,并且其拥有vlan tag为a,并且其源IP是a.a.a.a,并且其协议是TCP,其TCP源端口号为a,则修改其源IP为b.b.b.b,发往端口B
Datapath
由于流可能非常复杂,对每个进来的数据包都去尝试匹配所有流,效率会非常低,所以有了datapath。Datapath对流进行缓存,把流的执行结果保存起来,当下次遇到匹配到同一条流的数据包,直接通过datapath处理。考虑到转发效率,datapath完全是在内核态实现的,并且默认的超时时间非常短,好像是3秒。
再重新看一下上面的模块图,datapath是不是可以视作一个交换机,或者说一个桥的实体模块? 因为传统交换机缓存MAC地址并根据MAC地址进行数据包的转发,而Datapath缓存Flow(流)并根据流进行数据包的转发。
Controller
OpenFlow 控制器。OVS 可以同时接受一个或者多个基于 OpenFlow 的控制器的管理。
Flow table
每个 datapath 都和一个"flow table"关联,当 datapath 接收到数据之后, OVS 会在 flow table 中查找可以匹配的 flow,执行对应的操作, 例如转发数据到另外的端口。