热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【重识云原生】第四章云网络4.8.3.2节——OpenvSwitch工作原理详解

2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin


2 OpenvSwitch架构

2.1 OVS整体架构



  • ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-based switching。

  • ovsdb-server:轻量级的数据库服务,主要保存了整个OVS的配置信息,包括接口啊,交换内容,VLAN啊等等。ovs-vswitchd会根据数据库中的配置信息工作。

  • ovs-dpctl:一个工具,用来配置交换机内核模块,可以控制转发规则。

  • ovs-vsctl:主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server中的数据库。

  • ovs-appctl:主要是向OVS守护进程发送命令的,一般用不上。

  • ovsdbmonitor:GUI工具来显示ovsdb-server中数据信息。

  • ovs-controller:一个简单的OpenFlow控制器.

  • ovs-ofctl:用来控制OVS作为OpenFlow交换机工作时候的流表内容。

        先看下OVS整体架构,用户空间主要组件有数据库服务ovsdb-server和守护进程ovs-vswitchd。kernel中是datapath内核模块。最上面的Controller表示OpenFlow控制器,控制器与OVS是通过OpenFlow协议进行连接,控制器不一定位于OVS主机上,下面分别介绍图中各组件。



2.2 OVS组件详述


2.2.1 ovs-vswitchd

        ovs-vswitchd守护进程是OVS的核心部件,它和datapath内核模块一起实现OVS基于流的数据交换。作为核心组件,它使用openflow协议与上层OpenFlow控制器通信,使用OVSDB协议与ovsdb-server通信,使用netlink和datapath内核模块通信。ovs-vswitchd在启动时会读取ovsdb-server中配置信息,然后配置内核中的datapaths和所有OVS switches,当ovsdb中的配置信息改变时(例如使用ovs-vsctl工具),ovs-vswitchd也会自动更新其配置以保持与数据库同步。

         ovs-vswitchd需要加载datapath内核模块才能正常运行。它会自动配置datapath flows,因此我们不必再使用ovs-dpctl去手动操作datapath,但ovs-dpctl仍可用于调试场合。

        在OVS中,ovs-vswitchd从OpenFlow控制器获取流表规则,然后把从datapath中收到的数据包在流表中进行匹配,找到匹配的flows并把所需应用的actions返回给datapath,同时作为处理的一部分,ovs-vswitchd会在datapath中设置一条datapath flows用于后续相同类型的数据包可以直接在内核中执行动作,此datapath flows相当于OpenFlow flows的缓存。对于datapath来说,其并不知道用户空间OpenFlow的存在,datapath内核模块信息如下:


2.2.2 ovsdb-server

        ovsdb-server是OVS轻量级的数据库服务,用于整个OVS的配置信息,包括接口/交换内容/VLAN等,OVS主进程ovs-vswitchd根据数据库中的配置信息工作,下面是ovsdb-server进程详细信息。



  •  /etc/openvswitch/conf.db是数据库文件存放位置,文件形式存储保证了服务器重启不会影响其配置信息,ovsdb-server需要文件才能启动,可以使用ovsdb-tool create命令创建并初始化此数据库文件。

  • --remote=punix:/var/run/openvswitch/db.sock 实现了一个Unix sockets连接,OVS主进程ovs-vswitchd或其它命令工具(ovsdb-client)通过此socket连接管理ovsdb。

  •  /var/log/openvswitch/ovsdb-server.log是日志记录。


2.2.3 OpenFlow

        OpenFlow是开源的用于管理交换机流表的协议,OpenFlow在OVS中的地位可以参考上面架构图,它是Controller和ovs-vswitched间的通信协议。需要注意的是,OpenFlow是一个独立的完整的流表协议,不依赖于OVS,OVS只是支持OpenFlow协议,有了支持,我们可以使用OpenFlow控制器来管理OVS中的流表,OpenFlow不仅仅支持虚拟交换机,某些硬件交换机也支持OpenFlow协议。

        OVS常用作SDN交换机(OpenFlow交换机),其中控制数据转发策略的就是OpenFlow flow。OpenStack Neutron中实现了一个OpenFlow控制器用于向OVS下发OpenFlow flows控制虚拟机间的访问或隔离。本文讨论的默认是作为SDN交换机场景下。

        OpenFlow flow的流表项存放于用户空间主进程ovs-vswitchd中,OVS除了连接OpenFlow控制器获取这种flow,文章后面会提到的命令行工具ovs-ofctl工具也可以手动管理OVS中的OpenFlow flow,可以查看man ovs-ofctl了解。

        在OVS中,OpenFlow flow是最重要的一种flow, 然而还有其它几种flows存在,文章下面OVS概念部分会提到。


2.2.4 Controller

        Controller指OpenFlow控制器。OpenFlow控制器可以通过OpenFlow协议连接到任何支持OpenFlow的交换机,比如OVS。控制器通过向交换机下发流表规则来控制数据流向。除了可以通过OpenFlow控制器配置OVS中flows,也可以使用OVS提供的ovs-ofctl命令通过OpenFlow协议去连接OVS,从而配置flows,命令也能够对OVS的运行状况进行动态监控。


2.2.5 Datapath

        在 OpenFlow Switch 规则的语义中,给交换机或者桥,用了一个专业的名词,叫做 Datapath。Open vSwitch 的内核模块 openvswitch.ko 实现了多个 Datapath,每个 Datapath 可以具有多个 Ports。每个 Datapath 通过关联流表(Flow Table)来定义网络包的流向。Datapath 监听网卡接口设备,将监听到的数据包首先在流表中进行匹配,找到匹配的流表项之后把对应的 Actions 返回给 Datapath,作为数据处理行为的描述。Datapath 支持数据在内核空间进行交换。

        关于datapath,The Design and Implementation of Open vSwitch中有描述:

        The datapath module in the kernel receives the packets first, from a physical NIC or a VM’s virtual NIC. Either ovs-vswitchd has instructed the datapath how to handle packets of this type, or it has not. In the former case, the datapath module simply follows the instructions, called actions, given by ovs-vswitchd, which list physical ports or tunnels on which to transmit the packet. Actions may also specify packet modifications, packet sampling, or instructions to drop the packet. In the other case, where the datapath has not been told what to do with the packet, it delivers it to ovs-vswitchd. In userspace, ovs-vswitchd determines how the packet should be handled, then it passes the packet back to the datapath with the desired handling. Usually, ovs-vswitchd also tells the datapath to cache the actions, for handling similar future packets.

        为了说明datapath,来看一张更详细的架构图,图中的大部分组件上面都有提到:


        用户空间ovs-vswitchd和内核模块datapath决定了数据包的转发,首先,datapath内核模块收到进入数据包(物理网卡或虚拟网卡),然后查找其缓存(datapath flows),当有一个匹配的flow时它执行对应的操作,否则datapath会把该数据包送入用户空间由ovs-vswitchd负责在其OpenFlow flows中查询(图1中的First Packet),ovs-vswitchd查询后把匹配的actions返回给datapath并设置一条datapath flows到datapath中,这样后续进入的同类型的数据包(图1中的Subsequent Packets)因为缓存匹配会被datapath直接处理,不用再次进入用户空间。

        datapath专注于数据交换,它不需要知道OpenFlow的存在。与OpenFlow打交道的是ovs-vswitchd,ovs-vswitchd存储所有Flow规则供datapath查询或缓存。

        虽然有ovs-dpctl管理工具的存在,但我们没必要去手动管理datapath,这是用户空间ovs-vswitchd的工作。


2.3 Open vSwitch 的工作原理

        Bridge 处理数据帧遵循以下几条规则:



  • 在一个 Port 上接收到的帧不会再往此 Port 发送此帧。

  • 接收到的帧都要学习其 Source MAC 地址。

  • 如果数据帧是多播或者广播包(通过 2 层 MAC 地址确定)则要向接收 Port 以外的所有 Port 转发,如果上层协议感兴趣,则还会递交上层处理。

  • 如果数据帧的地址不能在 CAM(MAC-Port Mapping)表中找到,则向接收 Port 以外的所有 Port 转发。

  • 如果 CAM 表中能找到,则转发给相应 Port,如果发送和接收都是同一个 Port,则不发送。

  • 网桥是以混杂模式工作的,所有 MAC 地址的数据帧都能够通过。

        用户空间 ovs-vswitchd 和内核模块 Datapath 决定了数据包的转发,如2.2.5节图示:




  1. 内核态的 Datapath 监听接口设备流入的数据包。

  2. 如果 Datapath 在内核态流表缓存没有找到相应的匹配流表项则将数据包传入(upcall)到用户态的 ovs-vswitchd 守护进程处理。

  3. (可选)用户态的 ovs-vswitchd 拥有完整的流表项,通过 OpenFlow 协议与 OpenFlow 控制器或者 ovs-ofctl 命令行工具进行通信,主要是接收 OpenFlow 控制器南向接口的流表项下发。或者根据流表项设置,ovs-vswitchd 可能会将网络包以 Packet-In 消息发送给 OpenFlow 控制器处理。

  4. ovs-vswitchd 接收到来自 OpenFlow 控制器或 ovs-ofctl 命令行工具的消息后会对内核态的 Flow Table 进行更新。或者根据局部性原理,用户态的 ovs-vswitchd 会将刚刚执行过的 Datapath 没有缓存的流表项注入到 Flow Table 中。

  5. ovs-vswitchd 匹配完流表项之后将数据包重新注入(reinject)到 Datapath。

  6. Datapath 再次访问 Flow Table 获取流表项进行匹配。

  7. 最后,网络包被 Datapath 根据流表项 Actions 转发或丢弃。

        上述,Datapath 和 ovs-vswitchd 相互配合中包含了两种网络包的处理方式:



  • Fast Path:Datapatch 加载到内核后,会在网卡上注册一个钩子函数,每当有网络包到达网卡时,这个函数就会被调用,将网络包开始层层拆包(MAC 层,IP 层,TCP 层等),然后与流表项匹配,如果找到匹配的流表项则根据既定策略来处理网络包(e.g. 修改 MAC,修改 IP,修改 TCP 端口,从哪个网卡发出去等等),再将网络包从网卡发出。这个处理过程全在内核完成,所以非常快,称之为 Fast Path。

  • Slow Path:内核态并没有被分配太多内存,所以内核态能够保存的流表项很少,往往有新的流表项到来后,老的流表项就被丢弃。如果在内核态找不到流表项,则需要到用户态去查询,网络包会通过 netlink(一种内核态与用户态交互的机制)发送给 ovs-vswitchd,ovs-vswitchd 有一个监听线程,当发现有从内核态发过来的网络包,就进入自己的处理流程,然后再次将网络包重新注入到 Datapath。显然,在用户态处理是相对较慢的,故称值为 Slow Path。在用户态的 ovs-vswtichd 不需要吝啬内存,它包含了所有流表项,这些流表项可能是 OpenFlow 控制器通过 OpenFlow 协议下发的,也可能是 OvS 命令行工具 ovs-ofctl 设定的。ovs-vswtichd 会根据网络包的信息层层匹配,直到找到一款流表项进行处理。如果实在找不到,则一般会采用默认流表项,比如丢弃这个包。

        当最终匹配到了一个流表项之后,则会根据 “局部性原理(局部数据在一段时间都会被频繁访问,是缓存设计的基础原理)” 再通过 netlink 协议,将这条策略下发到内核态,当这条策略下发给内核时,如果内核的内存空间不足,则会开始淘汰部分老策略。这样保证下一个相同类型的网络包能够直接从内核匹配到,以此加快执行效率。由于近因效应,接下来的网络包应该大概率能够匹配这条策略的。例如:传输一个文件,同类型的网络包会源源不断的到来。



2.4 ovs-*工具的使用及区别


2.4.1 ovs-vsctl

        ovs-vsctl是一个管理或配置ovs-vswitchd的高级命令行工具,高级是说其操作对用户友好,封装了对数据库的操作细节。它是管理OVS最常用的命令,除了配置flows之外,其它大部分操作比如Bridge/Port/Interface/Controller/Database/Vlan等都可以完成。


 2.4.2 ovsdb-tool

        ovsdb-tool是一个专门管理OVS数据库文件的工具,不常用,它不直接与ovsdb-server进程通信。


 2.4.3 ovsdb-client

        ovsdb-client是ovsdb-server进程的命令行工具,主要是从正在运行的ovsdb-server中查询信息,操作的是数据库相关。


 2.4.4 ovs-ofctl

        ovs-ofctl是专门管理配置OpenFlow交换机的命令行工具,我们可以用它手动配置OVS中的OpenFlow flows,注意其不能操作datapath flows和”hidden” flows。

         ovs-vsctl是一个综合的配置管理工具,ovsdb-client倾向于从数据库中查询某些信息,而ovsdb-tool是维护数据库文件工具。


参考链接

Openvswitch总体架构与代码结构_慕课手记

OpenvSwitch 架构解析与功能实践_qq_0105的博客-CSDN博客

Openvswitch手册(1): 架构,SSL, Manager, Bridge - popsuper1982 - 博客园

Openvswitch手册(2): OpenFlow Controller - popsuper1982 - 博客园

OpenvSwitch完全使用手册_Better_Mee的博客-CSDN博客_openvswitch完全使用手册

云计算底层技术-使用openvswitch | opengers


 《重识云原生系列》专题索引: 



  1. 第一章——不谋全局不足以谋一域

  2. 第二章计算第1节——计算虚拟化技术总述

  3. 第三章云存储第1节——分布式云存储总述

  4. 第四章云网络第一节——云网络技术发展简述

  5. 第四章云网络4.2节——相关基础知识准备

  6. 第四章云网络4.3节——重要网络协议

  7. 第四章云网络4.3.1节——路由技术简述

  8. 第四章云网络4.3.2节——VLAN技术

  9. 第四章云网络4.3.3节——RIP协议

  10. 第四章云网络4.3.4节——OSPF协议

  11. 第四章云网络4.3.5节——EIGRP协议

  12. 第四章云网络4.3.6节——IS-IS协议

  13. 第四章云网络4.3.7节——BGP协议

  14. 第四章云网络4.3.7.2节——BGP协议概述

  15. 第四章云网络4.3.7.3节——BGP协议实现原理

  16. 第四章云网络4.3.7.4节——高级特性

  17. 第四章云网络4.3.7.5节——实操

  18. 第四章云网络4.3.7.6节——MP-BGP协议

  19. 第四章云网络4.3.8节——策略路由

  20. 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术

  21. 第四章云网络4.3.10节——VXLAN技术

  22. 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计

  23. 第四章云网络4.3.10.3节——VXLAN隧道机制

  24. 第四章云网络4.3.10.4节——VXLAN报文转发过程

  25. 第四章云网络4.3.10.5节——VXlan组网架构

  26. 第四章云网络4.3.10.6节——VXLAN应用部署方案

  27. 第四章云网络4.4节——Spine-Leaf网络架构

  28. 第四章云网络4.5节——大二层网络

  29. 第四章云网络4.6节——Underlay 和 Overlay概念

  30. 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述

  31. 第四章云网络4.7.2节——virtio网络半虚拟化简介

  32. 第四章云网络4.7.3节——Vhost-net方案

  33. 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案

  34. 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现

  35. 第四章云网络4.7.6节——virtio-blk存储虚拟化方案

  36. 第四章云网络4.7.8节——SR-IOV方案

  37. 第四章云网络4.7.9节——NFV

  38. 第四章云网络4.8.1节——SDN总述

  39. 第四章云网络4.8.2.1节——OpenFlow概述

  40. 第四章云网络4.8.2.2节——OpenFlow协议详解

  41. 第四章云网络4.8.2.3节——OpenFlow运行机制

  42. 第四章云网络4.8.3.1节——Open vSwitch简介

  43. 第四章云网络4.8.3.2节——Open vSwitch工作原理详解

  44. 第四章云网络4.8.4节——OpenStack与SDN的集成

  45. 第四章云网络4.8.5节——OpenDayLight

  46. 第四章云网络4.8.6节——Dragonflow

本文由mdnice多平台发布



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Oracle数据库中创建序列时如何选择cache或nocache参数。cache参数可以提高序列的存取速度,但可能会导致序列丢失;nocache参数可以避免序列丢失,但在高并发访问时可能导致性能问题。文章详细解释了两者的区别和使用场景。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
富农032884
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有