Open vSwitch介绍


本节主要介绍Open vSwitch(OvS)的基本概念、架构、报文处理流程。

1 vSwitch功能

vSwitch(Virtual Switch)指虚拟交换机或虚拟网络交换机,工作在二层数据网络,通过软件方式实现物理交换机的二层(和部分三层)网络功能。通过运行在虚拟化平台上的虚拟交换机,为本台物理机上的VM(Virtual Machine,虚拟机)提供二层网络接入和部分三层网络功能。VM通过vSwitch来连接网络,vSwitch则通过物理主机上的物理网卡作为上行链路与外界网络进行连接,如下图所示。
在这里插入图片描述
跟物理主机一样,每个VM有自己的虚拟网卡(virtual NIC),每个虚拟网卡有自己的MAC地址和IP地址。ABCDE是vSwitch上的虚拟端口vPort(virtual Port),该虚拟交换机连接虚拟网卡和物理网卡,将虚拟机上的数据报文从物理网卡转发出去,并从物理网卡上接收报文转发给对应的虚拟网卡。根据需要,vSwitch还可以支持安全控制、VLAN、网络监控、端口镜像、QoS、自动化网管等功能。

每个vSwitch与物理交换机一样,包含一定数量的端口,相同特性的虚拟端口vPort集合就是VLAN(或称端口组),不同VLAN内的报文在传输时是相互隔离的,各VLAN内的用户不能和其它VLAN内的用户直接通信。如果不同VLAN要进行通信,则需要通过路由器、三层交换机等三层设备。

2 OvS架构

Open-vSwitch是支持openFlow协议的虚拟交换机,所谓OpenFlow协议,是一套SDN控制协议,不同厂商使用该标准实现的交换机和controller能够相互兼容,从而便于实现SDN。OvS是一个支持多层数据转发的高质量虚拟交换机,主要部署在服务器上,相比传统交换机具有很好的编程扩展性,同时具备传统交换机实现的网络隔离和数据转发功能,运行在每个实现虚拟化的物理机器上,并提供远程管理。

OvS的架构如下图所示,OvS包含三个基本组件:ovs-vswtichd、ovsdb-server、openvswitch.ko,各个组件的作用如下:

  • ovs-vswitchd组件是交换机的主要模块,运行在用户态,其主要负责基本的转发逻辑、地址学习、外部物理端口绑定等。还可以运用OvS自带的ovs-ofctl工具采用OpenFlow协议对交换机进行远程配置和管理。
  • ovsdb-server组件是存储OvS的网桥配置、日志以及状态的轻量级数据库。它与ovs-vswitchd都是以一个单独的进程存在于系统中。ovsdb是一个可提供持久化存储的数据库,可借助ovs-vsctl工具配置OvS交换机,配置信息将保存在ovsdb中,设备重启后,相关OvS配置不会丢失。ovs-vswitchd组件与ovsdb-server组件间的通信采用OVSDB管理协议,通信内容包括加载配置信息,同时将运行过程中变化的OvS的配置信息保存到数据库中。
  • openvswitch.ko组件运行在内核态,属于快速转发平面,主要负责流表匹配、报文修改、隧道封装、转发或者上送,并且维护底层转发表。在OvS中,报文首先经过该组件完成报文解析和封装、转发规则匹配,若找到转发规则不再经过用户空间,直接转发。否则转交用户空间的ovs-vswitchd组件进行处理。ovs-vswitchd组件与openvswitch.ko组件之间采用netlink执行进程间的通信。netlink是一种进程间通信机制,可用于处理用户态和内核态的通信。

在这里插入图片描述
OvS提供一些管理和配置工具,本文主要介绍常用的ovs-vsctl、ovs-ofctl、ovsdb-tool和ovsdb-client,详细说明如下:

  • ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具
    • 查看OvS信息:ovs-vsctl show
    • 添加网桥br0:ovs-vsctl add-br br0
    • 删除网桥br0:ovs-vsctl del-br br0
    • 列出所有网桥:ovs-vsctl list-br
    • 新增internal端口p1并添加到网桥br0:ovs-vsctl add-port br0 p1 – set interface p1 type=internal
    • 添加端口p1到网桥br0:ovs-vsctl add-port br0 p1
    • 删除网桥br0上的端口p1:ovs-vsctl del-port br0 p1
    • 查看网络br0上所有端口:ovs-vsctl list-ports br0
    • 设置端口p1的类型为patch,并与p0连接:ovs-vsctl set interface p1 type=patch options:peer=p0
    • 设置OpenFlow控制器:ovs-vsctl set-controller br0 tcp:192.168.1.10:6633 (控制器地址为192.168.1.10,端口为6633)
    • 移除controller:ovs-vsctl del-controller br0
    • 获取br0网桥的Openflow控制器地址,没有控制器则返回空:ovs-vsctl get-controller br0
    • 设置端口p1的vlan tag为100:ovs-vsctl set Port p1 tag=100
    • 设置端口p0类型为internal:ovs-vsctl set Interface p0 type=internal
  • ovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,可以用它手动配置OvS中的流表项
    • 查看网桥br0中流表项:ovs-ofctl dump-flows br0
    • 查看网桥br0的端口信息:ovs-ofctl show br0
    • 添加流表项:ovs-ofctl add flow br0 in_port=vnet0,actions=normal(从vnet0端口进入的报文进行常规2、3层处理)
    • 添加流表项:ovs-ofctl add-flow br0 in_port=vnet0,actions=output:vnet1 (从vnet0端口进入的报文从vnet1端口出)
    • 添加流表项:ovs-ofctl add-flow br0 dl_dst=52:54:00:23:0a:40,actions=output:vnet1 (目的mac为52:54:00:23:0a:40的报文从vnet1端口出)
    • 添加流表项:ovs-ofctl add-flow br0 ip,nw_dst=10.159.11.21,actions=output:vnet1 (目的ip为10.159.11.21的报文从vnet1端口出)
    • 删除网桥br0上的所有流表项:ovs-ofctl del-flows br0
    • 删除网桥br0上入端口为vnet0的所有流表项:ovs-ofctl del-flows br0 in_port=vnet0
  • ovsdb-tool是一个专门管理OvS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信。
    • 创建并初始化database文件:ovsdb-tool create [db][schema]
    • 查看数据库更改记录:ovsdb-tool show-log -m
  • ovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库。
    • 列出主机上的所有数据库:ovsdb-client list-dbs
    • 列出指定数据库的所有表:ovsdb-client list-tables [DATABASE]
    • 列出指定数据库指定表的所有数据:ovsdb-client dump [DATABASE] [TABLE]
    • 监控指定数据库中的指定表记录改变:ovsdb-client monitor [DATABASE] [TABLE]
    • 获取指定数据库的schema信息:ovsdb-client get-schema [DATABASE]

3 OvS报文处理

3.1 传统OvS方式

在传统OvS中,网卡在加载网络过程中被绑定到OvS端口上,数据包接送和发送函数在datapath中定义,因此报文的接收和发送统一由位于内核空间的datapath进行,内核空间负责报文的解析封装、流表匹配、流表匹配失败上送、报文转发或丢弃等报文处理操作,如下图所示。在OvS中有两个流表,一个为位于内核空间的内核态流表,另一个是位于用户空间的用户态流表。内核态流表主要是存储近期匹配过的流表项,用户态流表主要由控制器或人为通过OvS提供的ovs-ofctl工具下发。用户空间只在内核空间将报文上送用户空间时,对报文进行流表匹配操作,根据匹配结果通知内核datapath报文该如何处理,并下发匹配到的流表项至内核态流表,以备后续类似报文匹配。
在这里插入图片描述

  • 接收报文处理机制
    • 当报文到达网卡设备,网卡将接收到的报文交给该网卡绑定的端口在OvS中定义的数据包接收函数处理。在datapath中首先进行报文头信息的获取,根据报文头信息生成匹配流表项的key值,得到key值后进行内核态流表匹配。
    • 当数据包的key值在内核态流表中匹配到流表项,数据包将不经过用户空间,直接由内核进行action操作并将报文转发或丢弃。若未匹配到内核态流表项,将使用Linux系统的Netlink通信机制实现内核进程和用户进程的通信,把数据包上送到用户空间。
    • 在用户空间进行用户态流表匹配。若命中用户态流表项,将命中到的用户态流表项以内核态流表的规则生成对应的内核态流表项下发至内核态流表,内核根据匹配到的规则将数据包转发出去。若未命中,则将数据包丢弃或者上送至控制器,由控制器决定如何转发该数据包。
  • 发送报文处理机制
    • OvS接收到数据包后对数据包的处理主要分为修改数据包后转发出去,向上层应用发送、丢弃三种情况。当需要将修改的数据包转发出去时,首先也是进行流表匹配,匹配过程与接收报文一致。通过命中的流表项获得要转发出去的端口号,最终将报文从OvS端口号绑定的网卡发送出去。

3.2 OvS+DPDK处理方式

DPDK平台提供的接口库,可以将底层环境资源做抽象,即在系统中新增了环境抽象层(EAL),将网卡驱动在用户态实现,系统只需在网卡初始化时设置网卡驱动接口即可将网卡收到的报文直接交给用户空间进程进行处理,网卡发送报文时也通过调用用户态定义的发送报文接口将报文直接发送到对应网卡。在OvS的vswitchd进程中新起一个数据收发接管线程(TO-Thread)用于接管系统的OvS中由datapath执行的数据包接收和发送的功能。数据包的流表匹配则直接进行用户态流表匹配,如下图所示。
在这里插入图片描述

  • 接收报文处理机制
    当报文到达网卡,EAL层根据网卡初始化和驱动层初始化中绑定的用户态网卡驱动,将报文发送到用户空间交给TO-Thread线程进行接管,在该线程中将进行报文的解析、与内核协议栈通信和获取报文key值的操作,然后在vswitchd进程中凭借报文key值完成用户态流表匹配。用户态流表匹配的操作与传统的OvS一样,但若命中流表项本系统将直接交由TO-Thread线程进行action处理,最终将报文通过该接管线程转发出去或丢弃。接收报文的过程中不经过OvS内核态的datapath进程的处理和内核态流表的匹配。
  • 发送报文处理机制
    发送报文时,先经过协议栈的封装处理,将封装好的报文匹配用户态流表,获取action操作。若为隧道转发则还需进行隧道头封装,将报文发往对应的VTEP端口。在隧道转发过程中可能涉及OvS中内部端口多次转发,并在相应端口做报文处理,报文最终要发出的端口通过流表匹配获得。TO-Thread线程将报文直接发往OvS出端口绑定的网卡,由网卡发送到网络中。

4 OvS补充说明

4.1 基本概念

  • Bridge
    代表一个以太网交换机(Switch),一个主机中可以创建一个或者多个Bridge。Bridge的功能是根据一定规则,把从端口收到的数据包转发到另一个或多个端口。
  • Port
    端口Port与物理交换机的端口概念类似,Port是OvS Bridge上创建的一个虚拟端口,每个Port都隶属于一个Bridge。Port有Normal、Internal、Patch和Tunnel四种类型,Normal和Internal这两种Port类型区别在于,Internal类型会自动创建接口(Interface),而Normal类型是把主机中已有的网卡接口添加到OvS中。
    • Normal
      可以把操作系统中已有的网卡(物理网卡em1/eth0,或虚拟机的虚拟网卡tapxxx)挂载到OvS上,OvS会生成一个同名Port处理这块网卡进出的数据包,此时端口类型为Normal。有一点要注意的是,挂载到OvS上的网卡设备不支持分配IP地址,因此若之前eth1配置有IP地址,挂载到OvS之后IP地址将不可访问。
    • Internal
      类型是OvS内部创建的虚拟网卡接口,每创建一个Port,OvS会自动创建一个同名接口(Interface)挂载到新创建的Port上。当OvS创建一个新网桥时,默认会创建一个与网桥同名的Internal Port。在OvS中,只有Internal类型的设备才支持配置IP地址信息。
    • Patch
      当主机中有多个OvS网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,从一个Patch Port收到的数据包会被转发到另一个Patch Port,使用Patch连接的两个网桥跟一个网桥没什么区别。
    • Tunnel
      OvS中支持添加隧道(Tunnel)端口,常见隧道技术有两种gre或vxlan。隧道技术是在现有的物理网络之上构建一层虚拟网络,上层应用只与虚拟网络相关,以此实现的虚拟网络比物理网络配置更加灵活,并能够实现跨主机的L2通信以及必要的租户隔离。不同隧道技术其大体思路均是将以太网报文使用隧道协议封装,然后使用底层IP网络转发封装后的数据包,其差异性在于选择和构造隧道的协议不同。Tunnel在OpenStack中用作实现大二层网络以及租户隔离,以应对公有云大规模,多租户的复杂网络环境。
      OpenStack是多节点结构,同一子网的虚拟机可能被调度到不同计算节点上,因此需要有隧道技术来保证这些同子网不同节点上的虚拟机能够二层互通,就像他们连接在同一个交换机上,同时也要保证能与其它子网隔离。OvS在计算和网络节点上建立隧道Port来连接各节点上的网桥br-int,这样所有网络和计算节点上的br-int互联形成了一个大的虚拟的跨所有节点的逻辑网桥(内部靠tunnel id或VNI隔离不同子网),这个逻辑网桥对虚拟机和qrouter是透明的,它们觉得自己连接到了一个大的br-int上。从某个计算节点虚拟机发出的数据包会被封装进隧道,通过底层网络传输到目的主机然后解封装。
  • Interface
    Interface是连接到Port的网络接口设备,是OvS与外部交换数据包的组件,在通常情况下,Port和Interface是一对一的关系,只有在配置Port为 bond模式后,Port和Interface是一对多的关系。这个网络接口设备可能是创建Internal类型Port时OvS自动生成的虚拟网卡,也可能是系统的物理网卡或虚拟网卡(TUN/TAP)挂载在OvS上。 OvS中只有”Internal”类型的网卡接口才支持配置IP地址。
    Interface是一块网络接口设备,负责接收或发送数据包,Port是OvS网桥上建立的一个虚拟端口,Interface挂载在Port上。一个接口就是操作系统的一块网卡。当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port,同时也创建一个与Port同名的Interface。三位一体,所以操作系统里就多了一块网卡,但是状态是down的。
  • Controller
    OvS可以同时接受一个或者多个OpenFlow控制器的管理。主要作用是下发流表(Flow Tables)到OvS,控制OvS数据包转发规则。控制器与OvS通过网络连接,不一定要在同一主机上。

4.2 匹配项与规则

低版本的流表由匹配域、计数器和动作组成,本节介绍流表中各项的内容和作用。匹配域用来匹配流量的特征,例如传统交换机能够根据mac地址转发,路由器能够根据ip地址转发。mac,ip都是流量的特征。动作是匹配项匹配到数据之后采取的动作,包括转发和丢弃等常见的动作。

4.2.1 匹配项

低版本的流表可以匹配OSI模型的1层至4层,如下图所示,对匹配到的流表做转发、丢弃或者更复杂的操作。具体的匹配项如下图所示。
在这里插入图片描述

匹配项说明
in_port报文进入的端口编号或名称
table指定要使用的流表的编号,范围是 0-254
在不指定的情况下,默认值为0
通过使用流表编号,可以创建或者修改多个Table中的Flow
dl_src/dl_dst匹配源/目的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匹配以太网协议类型
dl_type=0x0800 代表 IPv4 协议
dl_type=0x086dd 代表 IPv6 协议
dl_type=0x0806 代表 ARP 协议
dl_vlan数据包的 VLAN Tag 值,范围是 0-4095
0xffff 代表不包含 VLAN Tag 的数据包
dl_vlan_pcpVLAN 优先级,改值取值区间为[0-7]
数字越大,表示优先级越高
nw_src/nw_dst当 dl_typ=0x0800 时,匹配源或者目标的 IPv4 地址
nw_proto和 dl_type 字段协同使用
当dl_type=0x0800、nw_proto=0时,匹配IP协议
当dl_type=0x086dd、nw_proto=0时,匹配IPv6 协议
当dl_type=0x0800、nw_proto=1时,匹配ICMP协议
当dl_type=0x0800、nw_proto=6时,匹配TCP协议
当dl_type=0x0800、nw_proto=17时,匹配UDP协议
reg交换机中的寄存器的值
当一个数据包进入交换机时,所有的寄存器都被清零
用户可以通过 Action 的指令修改寄存器中的值
tp_src/tp_dstTCP/UDP/SCTP 源/目的端口

4.2.2 动作

数据包匹配到流表中的流表项后可以执行下表所述的动作

动作说明
normal使数据包经过设备的常规L2/L3处理
output:port将数据包输出到OpenFlow端口号port。
drop丢弃数据包,因此不会进行进一步的处理或转发。
local在与本地网桥名称相同的网络设备对应的“本地端口”上输出数据包
in_port在接收数据包的端口上输出数据包
mod_dl_src:mac将源以太网地址设置为mac
mod_dl_dst:mac将目标以太网地址设置为mac
mod_nw_src:ip将IPv4源地址设置为ip
mod_nw_dst:ip将IPv4目标地址设置为ip
mod_tp_src:port将TCP或UDP或SCTP源端口设置为port
mod_tp_dst:port将TCP或UDP或SCTP目标端口设置为port
mod_vlan_vid:vlan_vid修改报文的VLAN ID
mod_vlan_pcp:vlan_pcp修改报文的VLAN优先级
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Open vSwitch(OVS)是一个开源的多层虚拟交换机,用于提供虚拟机和容器之间的网络连接。OVS可以在操作系统内核态或用户态运行,并支持多种协议,如VLAN、GRE、VXLAN、STT等。OVS还支持OpenFlow协议,使其可以与SDN控制器集成,实现网络流量控制和管理。 OVS作为一个虚拟交换机,可以在数据中心中提供灵活的网络连接,实现网络的隔离、负载均衡、流量监控等功能。在云计算环境中,OVS还可以与虚拟化平台(如KVM、Xen等)和容器管理平台(如Docker、Kubernetes等)集成,提供完整的网络虚拟化解决方案。 OVS的架构比较灵活,可以根据不同的需求进行定制和扩展。OVS的核心组件包括OVS内核模块、ovs-vswitchd守护进程、ovsdb-server数据库服务和ovs-vsctl命令行工具。OVS内核模块负责在内核中实现虚拟交换机的功能;ovs-vswitchd守护进程负责管理虚拟交换机和物理网络之间的连接;ovsdb-server数据库服务负责管理OVS的配置信息;ovs-vsctl命令行工具则提供了一个简单的接口,用于管理OVS的配置信息和状态。 总之,Open vSwitch是一个功能强大的开源虚拟交换机,用于实现虚拟化环境中的网络连接和管理。 ### 回答2: Open vSwitch(OVS)是一个开源软件交换机,用于构建和管理虚拟化的网络。它具有高性能、可扩展性和灵活性,成为了云计算和数据中心网络中的重要组件。 OVS支持标准的网络协议,如Ethernet、VLAN、TCP/IP和UDP,并且能够与其他网络设备无缝集成,如物理交换机和虚拟交换机。它可以用于构建虚拟网络,将虚拟机和物理服务器连接在一起,实现虚拟机之间和虚拟机与物理网络之间的通信。 OVS具有可编程性,可以通过使用OpenFlow协议来配置和控制流量转发规则。这使得OVS网络中实现流量控制、负载均衡、流量监控和安全策略等功能变得可能。 OVS是可扩展的,可以与其他网络技术和工具集成,如QEMU/KVM虚拟化平台、Docker容器平台、OpenStack云计算平台等。它可以与这些组件配合使用,实现灵活的网络虚拟化和管理。 除了基本的网络功能,OVS还提供了其他高级功能,如VXLAN隧道协议支持、多路径转发、流量统计和监测等。这些功能提升了网络的可用性、性能和安全性。 总之,Open vSwitch是一个功能强大且灵活的开源软件交换机,适用于构建和管理虚拟化网络。它在云计算和数据中心网络中被广泛使用,并且可与其他网络技术和工具集成,提供了丰富的网络功能和性能优化选项。 ### 回答3: Open vSwitch(简称OVS)是一个开源的虚拟交换机软件,用于构建和管理虚拟化和云计算环境中的软件定义网络(SDN)。它提供了一种高级的网络虚拟化解决方案,可以在物理网络和虚拟网络之间建立连接和通信。 OVS支持多种虚拟交换机技术,包括Ethernet交换、VLAN隔离、流量镜像和流量过滤等。它可以被用作虚拟交换机来连接虚拟机,也可以替代物理交换机进行网络路由和转发,从而创建一个高度灵活和可扩展的网络环境。 OVS的核心特点是其可编程性和可扩展性。它支持OpenFlow协议,该协议允许控制器对网络流量进行动态编程。通过将数据平面和控制平面分离,OVS可以实现网络流的灵活管理和控制。此外,它还支持多种控制器和管理接口,如OpenDaylight和ODPi,以适应不同的应用场景和需求。 OVS的开放源代码和活跃的社区使其成为广泛采用的SDN解决方案。它被广泛用于云服务提供商、数据中心以及虚拟化环境中,用于管理和优化网络流量,提供网络隔离和安全性,实现弹性和自动化的网络管理。 总之,Open vSwitch是一个强大而灵活的软件定义网络交换机软件,通过分离数据平面和控制平面以及支持多种虚拟交换机技术,它为构建和管理虚拟化和云计算环境中的网络提供了高度可编程和可扩展的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值