OpenStack 之 OVS介绍

一、概述

Open vSwitch的官方定义:Open vSwitch是一个具有工业级质量的多层虚拟交换机。通过可编程扩展,可以实现大规模网络的自动化(配置、管理、维护)。它支持现有标准管理接口和协议(比如netFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag等,熟悉物理网络维护的管理员可以毫不费力地通过Open vSwitch转向虚拟网络管理)。

 

二、最新版本 Open vSwitch 2.6.1支持的全部特性(截止2017.1)

http://openvswitch.org/features/

  • Visibility into inter-VM communication via NetFlow, sFlow(R), IPFIX, SPAN, RSPAN, and GRE-tunneled mirrors
  • LACP (IEEE 802.1AX-2008)
  • Standard 802.1Q VLAN model with trunking
  • Multicast snooping
  • IETF Auto-Attach SPBM and rudimentary required LLDP support
  • BFD and 802.1ag link monitoring
  • STP (IEEE 802.1D-1998) and RSTP (IEEE 802.1D-2004)
  • Fine-grained QoS control
  • Support for HFSC qdisc
  • Per VM interface traffic policing
  • NIC bonding with source-MAC load balancing, active backup, and L4 hashing
  • OpenFlow protocol support (including many extensions for virtualization)
  • IPv6 support
  • Multiple tunneling protocols (GRE, VXLAN, STT, and Geneve, with IPsec support)
  • Remote configuration protocol with C and Python bindings
  • Kernel and user-space forwarding engine options
  • Multi-table forwarding pipeline with flow-caching engine
  • Forwarding layer abstraction to ease porting to new software and hardware platforms

     

三、模块介绍

 

最新代码包主要包括以下模块和特性:
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中许多网络上的概念与平时接触到的不同,这里介绍一下Open vSwitch中用到的一些名词及概念。

 

 

 

Packet (数据包)

网络转发的最小数据单元,每个包都来自某个端口,最终会被发往一个或多个目标端口,转发数据包的过程就是网络的唯一功能。

Bridge (网桥)

Open vSwitch中的一个网桥就是一台以太网交换机交换机,可以创建一个或者多个 Bridge 设备。

其功能是根据一定流规则,把从端口收到的数据包转发到另一个或多个端口。

Port (端口)

端口是收发数据包的单元,和物理以太网交换机的端口概念类似。Open vSwitch中,每个端口都属于一个特定的网桥。端口收到的数据包会经过流规则的处理,发往其他端口;也会把其他端口来的数据包发送出去。Open vSwitch支持的端口有以下几种:

  • Normal Port: 用户可以把操作系统中的网卡绑定到Open vSwitch上,Open vSwitch会生成一个普通端口处理这块网卡进出的数据包。
  • Internal Port: 当设置端口类型为internal,Open vSwitch会创建一快虚拟网卡,此端口收到的所有数据包都会交给这块网卡,网卡发出的包会通过这个端口交给Open vSwitch。

    当Open vSwitch创建一个新网桥时,默认会创建一个与网桥同名的Internal Port

  • Patch Port: 当机器中有多个Open vSwitch网桥时,可以使用Patch Port把两个网桥连起来。Patch Port总是成对出现,分别连接在两个网桥上,在两个网桥之间交换数据。
  • Tunnel Port: 隧道端口是一种虚拟端口,支持使用gre或vxlan等隧道技术与位于网络上其他位置的远程端口通讯。

          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,执行对应的操作, 例如转发数据到另外的端口。

  • 13
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值