SDN应用路由算法实现工具之Networkx

2015-09-28 by muzi

SDN(Software Defined Networking)是一种新型的网络架构,通过集中式的控制平面管理数据层面的转发等操作。网络的联通性是最基础的需求,为保证网络联通性,控制器需要应用相应的图论算法,计算出转发路径,完成数据转发。在开发SDN应用时,为完成基础的路径计算,时常需要开发者独立编写网络算法,不仅麻烦,性能和代码可复用性还受开发者个人编程水平影响。所以本篇文章将介绍网络算法工具networkx,用于完成路径算法开发工作。

networkx是用于创建、操作和研究复杂网络动态、结构和功能的Python语言包。networkx支持创建简单无向图,有向图和多重图(multigraph);内置了许多标准的图论算法,节点可为任意数据,如图像文件;支持任意的边值维度,功能丰富,简单易用。

由于Networkx代码经过多次测试,性能方面也做了很多的工作,使用Networkx内置的多种图论算法能给开发SDN应用带来很多的便利,可以节省开发时间,降低代码故障率。networkx的安装和使用,读者可从官网文档中快速得到,不加赘述。接下来的内容将简要介绍Networkx的经典图论算法内容, 包括最短路径, KSP(K Shortest Paths)算法和Traversal ...

read more

Ryu:模块间通信机制分析

2015-09-08 by muzi

Ryu是一款非常轻便的SDN控制器,在科研方面得到了广泛的应用。相比其他控制器,受益于Python语言,在Ryu上开发SDN应用的效率要远高于其他控制器。为了解决复杂的业务,有时需要在Ryu上开发多模块来协同工作,从而共同完成复杂的业务。本文将介绍Ryu模块之间通信的包括Context等方式的多种通信方式。

_CONTEXTS

在RyuApp类中有一个属性是_CONTEXTS。_CONTEXTS中的内容将作为当前模块的服务在模块初始化时得到加载。示例如下:

    _CONTEXTS = {
        "Network_Aware": network_aware.Network_Aware,
        "Network_Monitor": network_monitor.Network_Monitor,
    }

    def __init__(self, *args, **kwargs):
        super(Shortest_forwarding, self).__init__(*args, **kwargs)
        self.name = 'shortest_forwarding'
        self.network_aware = kwargs["Network_Aware"]
        self.network_monitor = kwargs["Network_Monitor"]

在模块启动时,首先会将_CONTEXTS中的模块先启动,在模块的初始化函数中可以通过self.network_aware = kwargs["Network_Aware"]的形式获得该服务模块的实例,从而获取到该模块的数据 ...

read more

SDN控制平面发展历史及趋势

2015-08-30 by muzi

SDN的特点之一就是控制平面与数据平面分离,其主张通过集中式的控制器平台实现网络的控制。在SDN架构中,控制平面是逻辑集中的,通过某种协议将控制信息下发至底层的数据平面去执行。所以,控制平台被称为SDN的大脑,指挥整个数据网络的运行。

得益于集中控制的优势,控制平面的存在能使得网络的部署和配置更加智能和简化。支持编程的SDN控制平面使得网络更加智能,更加灵活和易于拓展。控制器通过SDN的南向协议的API可以对数据层面的网元设备下发指令,完成控制平面与数据平面的控制传输。2008年,SDN和OpenFlow一起诞生于斯坦福大学。目前,在SDN领域中,OpenFlow协议是最流行的南向协议之一。

SDN出现初期,控制平面的表现形式更多的是以单实例的控制器出现,实现SDN的协议也是以OpenFlow为主。所以在SDN发展初期,SDN控制器更多指的是OpenFlow控制器。SDN出现之后,ONF[1]成立。ONF(Open Network Foundation),中文名为“开放网络基金会” ,是致力于推进SDN标准化的一个用户驱动的组织。在ONF的白皮书中,提出了SDN的架构标准,SDN架构1.0版本和1.1版本分别如图3.11和 图3.12[2]所示。

sdn architecture
图3.11 SDN网络架构1.0版本

sdnarchiteture1.1
图3 ...

read more

Mininet搭建多控制器拓扑

2015-08-05 by muzi

Mininet是一款非常轻巧但是功能很强大的网络模拟器。网络研究者可以使用Mininet创建支持OpenFlow的SDN拓扑。随着SDN研究的发展,多控制器协作成为未来的研究方向,所以使用Mininet构建多控制器网络拓扑也成为一种需求。本篇将讲述如何使用Mininet搭建多控制器网络拓扑。

Multi-Controller

多控制器有两种理解,一种理解是面向交换机的多控制器。即一个交换机会连接多个控制器,控制器之间的关系可以是equal,也可以是master/slave模式。关于多控制器的介绍,有兴趣的读者可以参考OpenFlow1.3协议的multi-controller部分内容。另一种理解是面向控制器的多控制器。即,多个控制器分别管理各自的数据平面网络,且数据平面之间有链路互联。这种模式下,控制器之间没有关系,控制器所控制的数据平面也没有关系。关于多控制器方面的研究,笔者会在后续的博客中大篇幅介绍。

本篇将针对这两种理解,介绍如何搭建多控制器的Mininet拓扑。

面向交换机的多控制器网络拓扑

对于一个交换机而言,可以连接多个控制器,其实现方式非常简单, 在Mininet的源码中已经实现。从Mininet的node.py文件中,我们可以找到有用的代码:

    def start( self, controllers ):
            """Start OpenFlow reference user datapath.
               Log to /tmp/sN- ...
read more

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