【OpenVswitch源码分析之二】架构

来源:互联网 发布:谷歌娘语音软件 编辑:程序博客网 时间:2024/06/07 19:43

OpenVswitch架构概览

OpenVswitch Architecture
Open vSwitch的架构和模块与传统的物理交换机是一一对应的,包括控制面和数据平台,只是传统的物理交换机通常使用NP芯片来进行转发,而Openvswitch使用Linux内核模块做数据平面。OpenVswitch包括三个核心模块:ovs-vswitchd,ovsdb-server以及内核模块openvswitch datapath。每个模块有不同的功能

ovs-vswitchd功能模块介绍

ovs-vswitchd是一个守护进程,在用户启动该组件不久其就会脱离控制终端,作为OVS的管理和控制进程对外提供服务,一方面它通过unix Socket和OVSDB通信,加载OVSDB内的配置信息,也能把设备信息更新到服务器中,这部分属于设备的配置管理能力。另一方面其内置了多个协议的支持,包括MAC Learning, LLDP, STP等,同时其支持和拉远的控制器建立Openflow连接,通过Openflow协议下发控制流表给内核模块。内核模块和OVS-Vswitchd通过Netlink进行通信,Netlink相较于其他的IPC通信方式,其支持双工,而且是异步通信,支持组播,另外可以自定义协议族。总而言之,Netlink是一个高效的内核态和用户态通信方式,同时其可扩展性也很好。

Ovsdb-server功能模块介绍

ovsdb-server是一个轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口,交换内容,VLAN等等。其数据库结构如图所示:
OVSDB Database Schema
从OVSDB的数据库结构可以看出网桥是支持SFlow,QoS, Mirror等可视化和调优功能,OVSDB对外提供Json RPC接口,提供CURD接口供客户端对数据库进行操作。

openvswitch datapath

openvswitchd.ko是内核中负责vswitch的快转面,根据openflow流表转发,并接收ovs-vswitchd的配置,内核模块在初始化以及做Port binding时,会注册钩子函数,把端口的报文处理接管到内核模块。当Datapath出现table miss情况时会把报文送入队列供用户控件的vswitchd模块读取,在用户空间有slow path的exact table的精确匹配与wildcard table的模糊匹配。而当Datapath配置了sflow时,也会将报文上送到控制面进行处理。

OpenVswitch 模块概述

           |   +-------------------+           |   |    ovs-vswitchd   |<-->ovsdb-server           |   +-------------------+           |   |      ofproto      |<-->OpenFlow controllers           |   +--------+-+--------+  _           |   | netdev | |ofproto-|   | userspace |   +--------+ |  dpif  |   |           |   | netdev | +--------+   |           |   |provider| |  dpif  |   |           |   +---||---+ +--------+   |           |       ||     |  dpif  |   | implementation of           |       ||     |provider|   | ofproto provider           |_      ||     +---||---+   |                   ||         ||       |            _  +---||-----+---||---+   |           |   |          |datapath|   |    kernel |   |          +--------+  _|           |   |                   |           |_  +--------||---------+                        ||                     physical                       NIC

从上图可以看出vswitchd本身是分层的结构,最上面的daemon层主要用于和ovsdb通信,做配置的下发和更新等,中间是ofproto层,ofproto是交换机的控制平面实现,通过该模块可以和外界的SDN控制器建立Openflow通道,而在ofproto下层有两个插件,分别是ofproto provider和netdev,ofproto provider对接datapath,负责流表以及datapath的配置下发,以及报文上送等。在ovs的定义里,netdev代表了具体平台的设备实现,e.g. linux内核的net_device或者移植到交换机平台下的port等,struct netdev_class定义了netdev-provider的具体实现需要的接口,具体的平台实现需要支持这些统一的接口,从而完成netdev设备的创建,销毁,打开,关闭等一系列操作。

原创粉丝点击