openvswitch

1.openvswitch与openflow 协议

1.1openflow协议

       SDN,即Software Defined Networking:软件定义网络。其本质就是使控制平面与转发平面分离开,使控制平面能运行在独立于网络设备的高性能计算机上.

      SDN是一种思想,并非一种具体的技术。而OpenFlow协议,便是一种实现这种思想的具体实现,是连接控制平面和转发平面之间通信的桥梁。

openflow协议的基本内容:

一、两个实体是Switch跟Controller。Controller在网络中相当于上帝,可以知道网络中所有的消息,可以给交换机下发指令。Switch就是一个实现Controller指令的实体,根据流表转发。

二、table,flow,match,action:openflow交换机可以有多个table,每个table包含多条flow,flow由match+action组成,match为匹配字段,数据包L2到L4的信息;action为匹配match后所要执行的操作,如指定端口出去,对报文进行编辑等。

match字段
flow

例子:ovs-ofctl add-flow  br0 “in_port=1,nw_src=192.168.1.1,actions=mod_nw_src:192.181.137.1,output:2” 

三、openflow消息:分为三大类,controller-to-switch,Asynchronous,Sysmetic

 Controller-to-Switch

控制器所发起的消息:

1)      Feature:查询交换机能力;

2)      Configuration:设置或者查询配置参数;

3)      Modify-State:增删改流表或者组表条目,设置交换机端口属性

4)      Packet-Out: 这个消息用于控制器指定从交换机的特定端口发送数据包,或者用于转发通过Packet-in消息接收到的数据包。Packet-out消息中包含一个完整的数据包或者指针,以及action.

5)      Barrier:用于控制器保证消息的依赖关系

Asynchronous

交换机发起的消息

1)      Packet-In:对于出现flowentry mismatch的数据包,交换机向控制器发送packet-in事件。数据包本身要么被完全包含在packet-in消息中,要么被buffer在交换机中,反正都是等着控制器的Packet-out事件来处理就对了。

2)      Flow-Removed: 交换机通知控制器已经没有了某个流表条目

3)      Port-Status:当端口配置或者状态变化时通知控制器

Sysmetic

两方都可以发起的消息,不用协商,分为以下三类:

1)      Hello:交换机和控制器建立起连接后的维护消息

2)      Echo:echo request和echo reply配对


openflow协议报文格式

openflow协议报文格式

struct ofp_header {

uint8_t version; 

uint8_t type;

ovs_be16 length;

ovs_be32 xid;   /* Transaction id associated with this packet. Replies use the same id as was in the request to facilitate pairing. */

};

packet out报文内容
switch featrues
packet out 消息报文

openvswitch-2.3.2/lib/ofp-util.h定义了所有所有消息的内容结构

1.2openvswitch简介

       openvswitch(ovs)是openflow协议的具体实现,可以实现基于linux内核的软件交换机,是一个开源软件。一个虚拟交换机可以有几十个端口来连接虚拟机虚拟网卡,虚拟机发出的数据包通过ovs交换机利用流表进行转发,通过连接物理网卡将数据往外发。


应用


ovs系统框架

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

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

ovs-vsctl 查询和更新ovs-vswitchd的配置,对ovsdb进行操作;

ovs-appctl:主要是向OVS守护进程发送命令的;

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

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

openvswitch.ko为Linux内核模块,支持数据流在内核的交换

1.3ovs源码安装

1.下载解压

2../configure --with-linux=/lib/modules/$(uname -r)/build 编译ovs linux内核模块

3.make&make install

4.make modules_install     所做的动作 1.将编译好的模块放入/lib/module/`uname -r`下 2.用depmod更新modules.dep文件

5.modprobe openvswitch/gre/vxlan 加载ovs内核模块 lsmod | grep openvswitch查看

6.配置ovsdb  ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema(默认db模板)

7.启动ovsdb

ovsdb-server /root/software/openvswitch2.8.1/etc/openvswitch/conf.db --remote=punix:/root/software/openvswitch2.8.1/var/run/openvswitch/db.sock \ --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile=/var/run/ovsdb.pid --detach \

8.启动ovs-vswitch进程

ovs-vswitchd unix:/root/software/openvswitch2.8.1/var/run/openvswitch/db.sock --pidfile=/var/run/ovs.pid --detach --log-file=/var/log/ovs.log


2 ovs源码分析

ovs代码结构:

从图中可以看出 OVS 的分层结构,最上层 vswitchd 主要与 ovsdb 通信,做配置下发和更新等,中间层是 ofproto ,用于和 OpenFlow 控制器通信,并基于下层的 ofproto provider 提供的接口,完成具体的设备操作和流表操作等工作。

dpif 层实现对流表的操作。

netdev 层实现了对网络设备(如 Ethernet)的抽象


ovs主干

一个connmgr对应多个ofconn(如一个网桥连接多个控制器,则需要建立相应多个ofconn实例;和ofctl等工具连接时也要建立ofconn实例);一个ofconn对应一个rconn;一个rconn对应多个vconn(因为和控制器建立连接外,可能还会实现snoop功能,即监测并复制交互的of消息,则一个rconn会对应一个vconn和一个vconn结构体类型的数组monitor。

ovs主干

由于openvswitch用户态代码相对复杂,首先从内核模块入手分析。

datapath为 ovs内核模块,负责执行数据处理,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作。一个datapath可以对应多个vport,一个vport类似物理交换机的端口概念。一个datapth关联一个flow table,一个flow table包含多个条目,每个条目包括两个内容:一个match/key和一个action。

内核数据流向

一般的数据包在linux网络协议栈中的流向为蓝色箭头流向:从网卡上接受到数据包后层层往上分析,最后离开内核态,把数据传送到用户态。当然也有些数据包只是在内核网络协议栈中操作,然后再从某个网卡发出去。当有 OVS时,数据流向如红色所示:从网卡 eth0收到报文后进入ovs的端口,根据 key值进行流表匹配,如果匹配成功执行流表对应的 action;如果失败通过upcall送入用户态处理。

通过vport注册的回调函数netdev_frame_hook()->netdev_frame_hook()-> netdev_port_receive()->ovs_vport_receive()处理接收报文,ovs_flow_key_extract()函数生成flow的key内容用以接下来进行流表匹配,最后调用ovs_dp_process_packet()函数进入真正的ovs数据包处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350