OVS学习过程2

来源:互联网 发布:太极旗飘扬 知乎 编辑:程序博客网 时间:2024/04/30 15:18

1 初识OVS(open vswitch)

OVS是一个高质量,多层虚拟交换机,目的就是让大规模网络自动化可以通过编程扩散,同时仍然支持标准的管理接口协议:openflow等。
虚拟交换机的意思就是利用软件的方式形成交换部件,所以也叫软件交换机,跟传统的物理交换机相比,虚拟交换机具有河大的优点
1、配置灵活可编程,靠软件实现,一台物理服务器上可以配置数十台或者数百台虚拟交换机,而且端口树木可以灵活选择。
2、成本低廉,通过软件的方式可以轻易打倒10Gpbs的交换速度。
简而言之,使用虚拟交换机做成的网络代理,从而实现控制器端到硬件的通信。
Open vSwitch,根据其名就可以知道这是一个开放的虚拟交换机(open virtual switch);它是实现网络虚拟化SDN的基础,它是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。设计这个Open vSwitch的目的是为了解决物理交换机存在的一些局限性:Open vSwitch较物理交换机而言有着更低的成本和更高的工作效率;一个虚拟交换机可以有几十个端口来连接虚拟机,而Open vSwitch本身占用的资源也非常小;可以根据自己的选择灵活的配置,可以对数据包进行接收分析处理;同时还支持标准的管理接口和协议,如NetFlow、sFlow、SPAN、RSPAN等。

1.1 ovs组件

1. ovsdb-sever:ovs的数据库服务器,用来存储虚拟交换机啊的配置信息。它于manager和ovs-vswitch交换信息使用了ovsdb
2. ovs-vswitch: ovs的核心部件,它和上层controller通信通过openflow协议,它与ovsdb-server通信使用ovsdb相关协议,他的内核模块同伙netlink通信,并且支持多哥独立的datapath。
3. ovs kernel module:OVS的内核模块,处理包交换和隧道,缓存flow,如果在内核的缓存中找到转发规则则转发,否则向用户空间去处理

1.2 Open vSwtich模块介绍

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

1.ovs-vswitchd :主要模块,实现switch的daemon,包括一个支持流交换的Linux内核模块;
2.ovsdb-server :轻量级数据库服务器,提供ovs-vswitchd获取配置信息;
3.ovs-brcompatd :让ovs-vswitch替换Linux bridge,包括获取bridge ioctls的Linux内核模块;
4.ovs-dpctl: 用来配置switch内核模块;
5一些Scripts and specs: 辅助OvS安装在Citrix XenServer上,作为默认switch;
6.ovs-vsctl :查询和更新ovs-vswitchd的配置;
7.ovs-appctl :发送命令消息,运行相关daemon;
8.ovsdbmonitor: GUI工具,可以远程获取OvS数据库和OpenFlow的流表。
9.ovs-openflowd:一个简单的OpenFlow交换机;
10.ovs-controller:一个简单的OpenFlow控制器;
11.ovs-ofctl :查询和控制OpenFlow交换机和控制器;
12.ovs-pki :OpenFlow交换机创建和管理公钥框架;
13.ovs-tcpundump:tcpdump的补丁,解析OpenFlow的消息;

1.3 Open vSwtich 工作流程


一般的数据包在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,完成自己想要的功能。



0 0
原创粉丝点击