一、前言:
随着SDN的发展,现在南向接口OpenFlow协议也用得越来越多,但是在平时研究SDN的时候,由于能简单支持OpenFlow协议的交换机本身就屈指可数,更不要说在实际应用中的各种复杂需求了,因而虚拟交换机得到了很大的发展。我准备从OpenvSwitch(简称为OVS,下面都简化为OVS)来入手来介绍其相关的数据结构和工作机制。我会直接从源码开始,了解网络协议栈的实现,理解OVS的具体实现,当然这需要一系列的博客才能分析完。OVS的最新信息具体见http://openvswitch.org/和https://github.com/horms/openvswitch。
虚拟交换机是实现云计算和网络虚拟化的基础。它是在开源的Apache2.0许可下的产品级质量的多层虚拟交换标准。设计这个Open vSwitch的目的是为了解决物理交换机存在的一些局限性,如:
- Open vSwitch较物理交换机而言有着更低的成本和更高的工作效率;
- 一个虚拟交换机可以有几十个端口来连接虚拟机,而Open vSwitch本身占用的资源也非常小;
- 根据自己的选择灵活的配置,可以对数据包进行接收分析处理;
- 支持标准的管理接口和协议,如NetFlow、sFlow、SPAN、RSPAN等
二、OVS的代码模块
我研究的OpenvSwitch是目前最新版本的,下载网址是http://openvswitch.org/releases/openvswitch-2.3.0.tar.gz。
安装完最新版的2.3.0的OVS源码后,首先来分析里面包括哪些文件信息:
其中:
Install相关文件:对应到各种应用场景下的安装指导;
Introduce说明文件:
- AUTHORS:作者信息;
- CodingStyle:编程风格建议;
- COPYING:许可说明;
- DESIGN:设计原则;
- FAQ:常见问题解答;
- NEWS、NOTICE、README、README-lisp、README-BUGS、WHY-OVS见字面意思就可以了。
其他文件:
- IntegrationGuide:集成到其他Hypervisor;
- PORING:移植说明;
- third-party:支持第三方的插件,包括让tcpdump支持解析of协议的补丁;
- tests:测试代码;
- utilities:小工具,包括用户操作命令,例如ovs-dpctl、ovs-ofctl、ovs-controller、ovs-vsctl等;
- xenserver:xenserver集成信息。
配置文件:
- acinclude.m4:宏定义文件,供aclocal使用;
- configure.ac:autoconf的宏文件;
- boot.sh:执行autoreconf命令;
- 子目录:bulid-aux、m4
- Makefile.am:整体的automake配置文件;
- manpages.mk:自动生成的man的配置文件;
核心代码文件:
- datapath:ovs datapath代码目录;
- vswitchd:ovs-switchd程序代码;
- ovsdb:ovs数据库管理代码;
- include:头文件代码目录;
- lib:库文件目录;
- ofproto:解析openflow协议;
以上基本上所有的文件都以知道大体上属于哪类文件,执行哪些功能。但更细致的需要通过研究代码才能够很好地理解。
三、OVS的工作过程:
虽然OVS是个虚拟交换机,但是它拥有物理交换机的功能,一般在LINUX内核中进行设计,下图能够很好地阐述OVS的工作过程:
在物理交换机里面,数据流如黑色箭头所示,从网卡出发的数据包,经过层层解析,最后到达用户层。而在虚拟交换机里数据流如红色箭头所示,从网卡出发的数据包需要首先建立一个网桥:ovs-vsctl add-br br0,然后将网桥与网卡绑定起来:ovs-vsctl add-port br0 eth0.所以数据包从eth0出来后,通过vPort进入OpenvSwitch中,然后根据key值进行流表匹配,如果匹配成功,则根据流表所对应的action来进行处理;如果匹配不成功,有可能是在内核网络协议栈中进行处理(原因在于创建网桥时就会相应创建一个端口连接内核协议栈)。
更多的分析暂时还不能做出很好地总结,需要在分析代码,再进行总结。