Open vSwitch介绍

2023-05-16

Open vSwitch介绍

  • 1 vSwitch功能
  • 2 OvS架构
  • 3 OvS报文处理
    • 3.1 传统OvS方式
    • 3.2 OvS+DPDK处理方式
  • 4 OvS补充说明
    • 4.1 基本概念
    • 4.2 匹配项与规则
      • 4.2.1 匹配项
      • 4.2.2 动作

本节主要介绍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优先级
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Open vSwitch介绍 的相关文章

随机推荐

  • java小知识:http请求传输文件流

    前文 xff1a 项目里要给第三方传输图片 xff0c 对方接口要求传文件流 xff0c 而不是常用的base64编码 xff0c 在此记录一下 xff5e 直接贴代码吧 xff1a import com alibaba fastjson
  • SSH无法启动错误解决:Failed to start OpenSSH server daemon.

    一 错误信息如下 xff1a sshd service OpenSSH server daemon Loaded loaded usr lib systemd system sshd service enabled vendor prese
  • linux小知识:修改/etc/profile全局变量文件出错,导致服务命令全部失效解决方案

    现象 xff1a 由于修改profile文件时改错了 xff0c 导致所有的命令都失效了 赶紧解决赶紧解决 1 在当前窗口执行以下命令 export PATH 61 usr local sbin usr local bin sbin bin
  • docker容器如何迁移

    docker容器如何迁移 xff1f 前言 xff1a 迁移容器涉及到备份和恢复 xff0c 可以将任何一个docker容器从一台机器迁移到另一台机器 在迁移过程中 xff0c 首先将把容器备份为Docker镜像快照 然后 xff0c 该D
  • 缓存IO和直接IO的区别

    1 缓存IO 缓存I O又被称作标准I O xff0c 大多数文件系统的默认I O操作都是缓存I O 在Linux的缓存I O机制中 xff0c 数据先从磁盘复制到内核空间的缓冲区 xff0c 然后从内核空间缓冲区复制到应用程序的地址空间
  • 修改svn的配置文件并对密码加密

    svn管理 公司项目进出新人 xff0c 需要对代码管理工具进行增删 由于对linux不是很了解 对svn的配置有没有进行过交接 所有的操作都是自己在centos服务器上进行尝试 对于普通的svn的账号密码管理有了基本了解 但是在服务器上看
  • deepin安装微信qq

    在网页上下载最新微信或者qq env WINEPREFIX 61 deepinwine Deepin WeChat deepin wine WeChatSetup exe 该命令运行在WeChatSetup exe所在文件夹 xff0c 最
  • 在Java中,执行SQL查询到数据后,存储在哪里了?

    前言 xff1a 我们项目运行过程中 xff0c 肯定会有查询数据库这步操作 xff0c 无论你是MySQL还是Oracle 那么这种情况就必须搞清楚 xff0c 从数据库里查询得到的数据默认存储到哪了 xff0c 为什么一次查询过多的数据
  • Java小知识:摆脱BeanUtil.copyProperties!! 最优的替代方案 -Bean Converter插件使用方式来了~

    前言 xff1a 开发中为什么不推荐使用BeanUtil copyProperties xff1f 使用BeanUtil copyProperties会有哪些严重后果 xff1f 这些就不在这里眼神了哈 xff0c 大家可以自行查阅一下即可
  • Vue小知识: $ is not defined错误解决

    错误原因 xff1a 该错误是未安装JQuery依赖包导致 解决方案 xff1a 安装依赖包 1 执行安装jquery依赖包命令 cnpm install jquery save 2 webpack配置 xff08 1 xff09 在项目根
  • JVM小知识:linux 命令查看jvm堆内存信息

    1 查看当前java进程的pid pgrep lf java 2 查看java堆的详细信息 jmap heap PID 3 查看java堆中对象的相关信息 xff0c 包含数量以及占用的空间大小 jmap histo PID 4 查看监控
  • IDEA小知识:查看内存使用情况的步骤

    1 展示idea自带的内存指标 xff0c 如图 1 图 2 点击File gt 选择Setting gt 进入APPearance gt 勾选Show memory indicator 图 xff08 1 xff09 图 xff08 2
  • 【无标题】

    CMake Error at xxaipkg CMakeLists txt 50 add message files Unknown CMake command add message files Configuring incomplet
  • npm安装淘宝镜像报错

    npm install g cnpm registry 61 https registry npm taobao org 执行命令报错 无法安装cnpm 解决方案 xff1a 用管理员方式打开命令行 xff0c 就可以安装成功了
  • Leetcode——贪心算法(c++和java实现)

    本来有一段时间没有刷题了 xff0c 但是突然发现了这本书LeetCode 101 A LeetCode Grinding Guide C 43 43 Version xff0c 感觉真不错 xff0c 思路简单清晰 xff0c 没有过多的
  • 树莓派3B+安装c++版本opencv3.4.1,配置开发环境以及注意事项

    树莓派3B 43 安装c 43 43 版本opencv3 4 1 xff0c 配置开发环境以及注意事项 树莓派3B 43 ubuntu mate系统的安装 树莓派 xff0c Raspberry Pi xff0c 是一个只有信用卡大小的微型
  • 由frankmocap得到的.pkl文件转为.bvh或者.fbx

    需求 由Frankmocap所得到的 pkl文件转为blender里的 bvh或者Maya里的 fbx Frankmocap github项目地址 2D转3D转 bvh可以看VideoTo3dPoseAndBvh xff0c bvh转3D相
  • centos 安装docker

    查看系统内核版本 docker需要内核版本在3 8以上 centos7 版本是3 10 安装支持aufs CentOS7 默认不支持aufs文件系统 需要自己安装支持aufs的内核 进入repo目录 cd etc yum repo d 下载
  • echarts框架下大数据量展示的解决方案

    echarts 43 大数据量 这是个无解的问题 xff01 大数据量 xff0c 什么样的数据才算大呢 xff1f 在echart 4 5 0版本中 xff0c 画折线图 xff0c 数据线一共1001000条 xff0c 每条数据500
  • Open vSwitch介绍

    Open vSwitch介绍 1 vSwitch功能2 OvS架构3 OvS报文处理3 1 传统OvS方式3 2 OvS 43 DPDK处理方式 4 OvS补充说明4 1 基本概念4 2 匹配项与规则4 2 1 匹配项4 2 2 动作 本节