OpenVswitch(OVS)源代码分析之简介

云计算是现在IT行业比较流行的,但真正什么是云计算业界也没有个什么统一的定义(很多公司都是根据自己的利益狭隘的定义云计算),更别说什么标准规范了。所以现在就有很多人说云计算只不过是个幌子,是个嘘头,没点实用的,嘴上说说而已,虽然我也不太清楚什么叫做云计算,云计算的定义究竟是什么,但我根据我公司现在做的云计算产品来说,对于云计算服务还是懂些的。我觉得那并不是什么幌子、嘘头,但如果说这云计算技术还不太成熟,我倒还勉强认可的。若把云计算比作一个人的话,我个人觉得现在它正是二十岁的样子,到三十多岁就算是比较成熟了,所以大概就能想象的到云计算现在的境况了。下面就来简介下实现云计算的一些技术,我对云计算并没有什么研究,也没能达到从全局的角度来分析云计算技术,更别说从一些更高的位置来分析问题,我所能介绍的仅仅是我一个小程序员在工作中所遇到的一些和云计算有关的技术,日积月累,希望终有一天能成为云计算“砖家”。

云计算是个全世界的话题,所以也有全世界的能人异士来为实现这个云计算而奋斗。我现阶段遇到的有关云计算的技术就是openVswitch和docker技术。那就先从openVswitch开始介绍起,我会用一系列blog来分析openVswitch的相关数据结构和工作流程,以及各个重要模块的分析。所有的介绍都是基于源码的分析,希望对初学着有点用。

openVswitch,根据其名就可以知道这是一个开放的虚拟交换机(open virtual switch);它是实现网络虚拟化SDN的基础,它是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。设计这个openVswitch的目的是为了解决物理交换机存在的一些局限性:openVswitch较物理交换机而言有着更低的成本和更高的工作效率;一个虚拟交换机可以有几十个端口来连接虚拟机,而openVswitch本身占用的资源也非常小;可以根据自己的选择灵活的配置,可以对数据包进行接收分析处理;同时还支持标准的管理接口和协议,如NetFlow,
sFlow, SPAN, RSPAN等。

Open vSwtich模块介绍

当前最新代码包主要包括以下模块和特性:

ovs-vswitchd 主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;

ovsdb-server 轻量级数据库服务器,提供ovs-vswitchd获取配置信息;

ovs-brcompatd 让ovs-vswitch替换Linux bridge,包括获取bridge ioctls的Linux内核模块;

ovs-dpctl 用来配置switch内核模块;

一些Scripts and specs 辅助OVS安装在Citrix XenServer上,作为默认switch;

ovs-vsctl 查询和更新ovs-vswitchd的配置;

ovs-appctl 发送命令消息,运行相关daemon;

ovsdbmonitor GUI工具,可以远程获取OVS数据库和OpenFlow的流表。

ovs-openflowd:一个简单的OpenFlow交换机;

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

ovs-ofctl 查询和控制OpenFlow交换机和控制器;

ovs-pki :OpenFlow交换机创建和管理公钥框架;

ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;

上面是网上提到的一些openVswitch的主要模块。其实openVswitch中最主要的还是datapath目录下的一些文件。有端口模块vport等,还有关键的逻辑处理模块datapath等,以及flow等流表模块,最后的还有action动作响应模块,通道模块等等。

下面来介绍下其工作流程:

一般的数据包在linux网络协议栈中的流向为黑色箭头流向:从网卡上接受到数据包后层层往上分析,最后离开内核态,把数据传送到用户态。当然也有些数据包只是在内核网络协议栈中操作,然后再从某个网卡发出去。

但当其中有openVswitch时,数据包的流向就不一样了。首先是创建一个网桥:ovs-vsctl add-br br0;然后是绑定某个网卡:绑定网卡:ovs-vsctl add-port br0 eth0;这里默认为绑定了eth0网卡。数据包的流向是从网卡eth0上然后到openVswitch的端口vport上进入openVswitch中,然后根据key值进行流表的匹配。如果匹配成功,则根据流表中对应的action找到其对应的操作方法,完成相应的动作(这个动作有可能是把一个请求变成应答,也有可能是直接丢弃,也可以自己设计自己的action);如果匹配不成功,则执行默认的动作,有可能是放回内核网络协议栈中去处理(在创建网桥时就会相应的创建一个端口连接内核协议栈的)。

其大概工作流程就是这样了,在工作中一般在这几个地方来修改内核代码以达到自己的目的:第一个是在datapath.c中的ovs_dp_process_received_packet(struct vport *p, struct sk_buff *skb)函数内添加相应的代码来达到自己的目的,因为对于每个数据包来说这个函数都是必经之地;第二个就是自己去设计自己的流表了;第三个和第二个是相关联的,就是根据流表来设计自己的action,完成自己想要的功能。

若有不正确之处,望指正!谢谢!!

时间: 2024-11-07 15:44:21

OpenVswitch(OVS)源代码分析之简介的相关文章

openVswitch(OVS)源代码分析之工作流程(收发数据包)

前面已经把分析openVswitch源代码的基础(openVswitch(OVS)源代码分析之数据结构)写得非常清楚了,虽然访问的人比较少,也因此让我看到了一个现象:第一篇,openVswitch(OVS)源代码分析之简介其实就是介绍了下有关于云计算现状和openVswitch的各个组成模块,还有笼统的介绍了下其工作流程,个人感觉对于学习openVswitch源代码来说没有多大含金量.云计算现状是根据公司发展得到的个人体会,对学习openVswitch源代码其实没什么帮助:openVswitch

openVswitch(OVS)源代码分析之工作流程(数据包处理)

上篇分析到数据包的收发,这篇开始着手分析数据包的处理问题.在openVswitch中数据包的处理是其核心技术,该技术分为三部分来实现:第一.根据skb数据包提取相关信息封装成key值:第二.根据提取到key值和skb数据包进行流表的匹配:第三.根据匹配到的流表做相应的action操作(若没匹配到则调用函数往用户空间传递数据包):其具体的代码实现在 datapath/datapath.c 中的,函数为: void ovs_dp_process_received_packet(struct vpor

SDL2源代码分析7:显示(SDL_RenderPresent())

上一篇文章分析了SDL纹理赋值给渲染目标的函数SDL_RenderCopy().这篇文章分析SDL显示视频最后的一个函数:SDL_RenderPresent(). SDL播放视频的代码流程如下所示.初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据:  SDL_U

SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

上一篇文章分析了SDL更新纹理像素数据的函数SDL_UpdateTexture().这篇文章继续分析SDL的源代码.本文分析SDL纹理复制到渲染目标的函数SDL_RenderCopy(). SDL播放视频的代码流程如下所示.初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循

SDL2源代码分析4:纹理(SDL_Texture)

SDL播放视频的代码流程如下所示.初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据:  SDL_UpdateTexture(): 设置纹理的数据. SDL_RenderCopy(): 纹理复制给渲染器. SDL_RenderPresent(): 显示. 上篇文章

SDL2源代码分析2:窗口(SDL_Window)

上一篇文章分析了SDL的初始化函数SDL_Init().这篇文章继续分析SDL的源代码.本文分析SDL的窗口(Window). SDL播放视频的代码流程如下所示. 初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据:  SDL_UpdateTexture(): 设

SDL2源代码分析5:更新纹理(SDL_UpdateTexture())

上一篇文章分析了SDL的创建纹理函数SDL_CreateTexture().这篇文章继续分析SDL的源代码.本文分析SDL更新纹理数据函数SDL_UpdateTexture(). SDL播放视频的代码流程如下所示.初始化:  SDL_Init(): 初始化SDL. SDL_CreateWindow(): 创建窗口(Window). SDL_CreateRenderer(): 基于窗口创建渲染器(Render). SDL_CreateTexture(): 创建纹理(Texture). 循环渲染数据

转:SDL2源代码分析

1:初始化(SDL_Init()) SDL简介 有关SDL的简介在<最简单的视音频播放示例7:SDL2播放RGB/YUV>以及<最简单的视音频播放示例9:SDL2播放PCM>中已经叙述过了,不再重复.这两篇文章中也提到了一张SDL的原理图,如下所示: 从这个图中可以看出,SDL根据系统的不同调用不同的API完成相应的功能.至于它是如何实现的,将会在后文中详细叙述.下面不再罗嗦,直接进入正题. 使用SDL播放一个视频代码流程大体如下 初始化: SDL_Init(): 初始化SDL. 

转:ffdshow 源代码分析

ffdshow神奇的功能:视频播放时显示运动矢量和QP FFDShow可以称得上是全能的解码.编码器.最初FFDShow只是mpeg视频解码器,不过现在他能做到的远不止于此.它能够解码的视频格式已经远远超出了mpeg4的范围,包括indeo video,WMV,mpeg2等等.同时,它也提供了丰富的加工处理选项,可以锐化画面,调节画面的亮度等等.不止是视频,FFDShow现在同样可以解码音频,AC3.MP3等音频格式都可支持.并且可以外挂winamp 的DSP插件,来改善听觉效果.可以说现在的F