Ryu:OpenFlow协议源码分析

2015-07-24 by muzi

Ryu支持OpenFlow所有的版本,是所有SDN控制器中对OpenFlow支持最好的控制器之一。这得益于Ryu的代码设计,Ryu中关于OpenFlow协议的代码量不多。阅读Ryu源码,不仅让我了解到了Ryu的运行细节,也学会了许多的编码知识。这为我当前开发的协议提供了很大的帮助。

本篇将从交换机与控制器建立连接开始,介绍OpenFlow报文的解析的相关代码实现。关于如何注册handler和发送报文,可查看之前的RYU核心源码解读:OFPHandler,Controller,RyuApp和AppManager。该篇侧重点为Ryu整体架构的运作,重点在RyuApp和AppManager;本篇重点在与详细介绍OpenFlow的解析和封装实现。希望对读者提供帮助。

Ofp_handler

负责底层数据通信的模块是ofp_handler模块。ofp_handler启动之后,start函数实例化了一个controller.OpenFlowController实例。OpenFlowController实例化之后,立即调用_call_()函数,call函数启动了server_loop去创建server socket,其handler为domain_connection_factory函数。每当收到一个switch连接,domain_connection_factory就会实例化一个datapath对象。这个对象用于描述交换机的所有行为。其中定义了接收循环和发送循环。

Datapath

datapath.serve函数是socket通信收发逻辑的入口。该函数启动了一个绿色线程去处理发送循环,然后本线程负责接收循环的处理。self._send_loop是发送主循环。其主要逻辑为:不断获取发送队列是否有数据,若有,则发送;底层调用的是socket.send_all()函数 ...

read more

SDN网络感知服务与最短路径应用

2015-07-08 by muzi

本文将介绍RYU中的网络感知服务,与基于网络服务的最短路径应用,主要内容包括网络资源感知模块,网络监控模块和基于网络信息的最短路由模块介绍。在一个真实的网络环境下,需掌握网络的实时动态,包括网络的资源以及网络流量状况,其中网络的信息包括交换机,端口,主机的信息,以及基于流的流量统计信息和基于端口的流量统计信息。在掌握这些关键的网络信息后,控制器就可以根据这些信息作出当下最正确的路由决策,完成网络的通信。

网络资源感知

网络资源感知模块用于感知网络资源的实时变化,包括拓扑信息以及主机信息的变化。任何网络应用,可达性都是最基本的要求。SDN网络的集中控制,使得控制器可以根据全局的信息作出最佳决策而无需在交换节点上采用分布式的路由算法。所以感知网络资源是SDN应用最基础的一项服务。网络资源感知模块源码链接:Network_Awareness.

实现该模块的类为NetworkAwareness类,该类描述如下:

class NetworkAwareness(app_manager.RyuApp):
    OFP_VERSIONS = [ofproto_v1_3.OFP_VERSION]
    SLEEP_PERIOD = 10
    IS_UPDATE = True

    def __init__(self, *args, **kwargs):
        super(NetworkAwareness, self).__init__(*args, **kwargs)
        self.topology_api_app ...
read more

初学者的SDN学习之路

2015-06-22 by muzi

Software Defined Network顾名思义软件定义网络,可以简单地分为网络和软件两个部分:软件和网络。此外,通过使用OpenFlow协议来实现SDN是一种较为普遍的方式, 所以本篇将从软件和网络以及OpenFlow三个方面进行介绍。在研究SDN的研究者之中,有相当大比例的网络工程师,他们了解网络,精通网络,然而却并不了解软件开发。除此之外,还有很大比例的研究者是软件工程师,他们软件开发能力出色,然而并不了解网络运作的机制,在接触SDN之前,他们的范围仅仅只是应用层,底层的东西交给全交给主机的协议栈了。还有一部分同学是像我这样,通信工程出身,学的是物理层的编码解码,误码率,电磁波。不像计算机专业那些学生一样,学习各种语言,操弄各种编译器,混迹于github这种全球最大的男性交友网站。剩下最后一种就是又懂网络,又懂编程。这种人,我一般称之为老师,是用来请教问题的,比如地球-某某老师。一般的,他们不屑于看到这种文章,太low。

本篇主要的目标用户是对网络和软件开发都不太了解,或者网络和编程开发只擅长一种的研究者。由于我也是一个初学者,所以仅当做经验分享吧。如有表达不对的地方,敬请指出,万分感谢。

网络

软件定义网络,如果不了解网络,那如何去定义一个你不了解的东西?如果不知道网络中存在的问题 ...

read more

Graph algorithms: Prim,Kruskal, Dijkstra, Floyd

2015-05-31 by muzi

最近有了一点点空闲时间,想想以后的项目肯定是需要用到图中的路径算法,于是花了一些时间把4大经典算法实现了一遍。算法实现水平不高,时间复杂度都太高了一点。但是逻辑相对比较清晰,测试结果正确。如果读者发现算法中的问题,敬请指出,万分感谢。

Prim

Prim算法是最小生成树算法的一种,其算法逻辑为:

从单一顶点开始,普里姆算法按照以下步骤逐步扩大树中所含顶点的数目,直到遍及连通图的所有顶点。 输入:一个加权连通图,其中顶点集合为V,边集合为E;

初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {}; 重复下列操作,直到Vnew = V:

1:在集合E中选取权值最小的边(u,v),其中u为集合Vnew中的元素,而v则是V中没有加入Vnew的顶点(如果存在有多条 满足前述条件即具有相同权值的边,则可任意选取其中之一); 2:将v加入集合Vnew中,将(u, v)加入集合Enew中;

输出:使用集合Vnew和Enew来描述所得到的最小生成树。

算法实现采用数据结构为邻接矩阵,实现如下:

    def ...
read more

RYU中WSGI学习笔记与RESTAPI开发

2015-05-13 by muzi

另一篇博文中已经介绍如何使用RYU的RESTAPI,本篇将继续介绍相关内容,主要分为WSGI学习总结和以ofctl_rest.py为例的RESTAPI的实现与内部机制。由于第一次学习WSGI,还有许多地方不是特别理解,所学知识均来自Google。文中若有错误之处,敬请指出,谢谢。

WSGI

Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。为了理解WSGI,可以尝试一下的小例子。

from cgi import parse_qs
from cgi import escape
import logging


def hello_world(environ, start_response):
    parameters = parse_qs(environ.get('QUERY_STRING', ''))

    if 'subject' in parameters:
        subject = escape(parameters['subject'][0])
    else ...
read more