基于跳数\时延\带宽的最短/优路径和负载均衡

2016-07-08 by muzi

对于SDN初学者而言,最短路径转发应用和负载均衡应用是最常见,也是最适合学习的经典应用。根据链路权重参数的不同,主要有基于跳数、时延和带宽的几种最短\最优路径转发应用。根据链路可用带宽实现的最优路径转发本质上也是一种网络流量负载均衡的简单实现。本文将介绍笔者在学习过程中开发的网络感知模块以及基于跳数、时延和带宽三种最优路径转发应用。

基于跳数的最短路径转发

基于跳数的最短路径转发是最简单的最优路径转发应用。我们通过network_awareness应用来实现网络拓扑资源的感知并计算最短路径。首先控制器通过下发LLDP报文来获取网络链路信息,然后再利用网络信息,生成网络拓扑图。网络感知应用使用networkx的有向图数据结构存储拓扑信息,使用networkx提供的shortest_simple_paths函数来计算最短路径。shortest_simple_paths函数支持在图上找出源交换机到目的交换机的K条最短路径,其函数参数信息如下:

shortest_simple_paths(G, source, target, weight=None)

在给定图G,源交换机source,目的交换机target以及链路权重类型weight的情况下,会返回一个路径生成器。通过K次调用生成器可以生成K条最短路径。

获得最短路径之后,shortest_forwarding应用将完成流表下发等工作,实现基于跳数的最短路径转发应用。

基于时延的最优路径转发

基于时延的最优路径转发应用原理和基于跳数的最短路径转发应用类似,只是链路权重类型变成了时延。关于计算链路时延的原理,读者可以阅读Ryu:网络时延探测应用Network_Delay_Detector是一个网络时延探测应用,其在获取到链路时延之后,将时延数据存储到Networkx的图数据结构中 ...

read more

SDN最新研究进展

2016-06-28 by muzi

自SDN出现以来,关于SDN的研究一直没有停止,只是不同的阶段关于SDN的研究的重点不同。比如最开始的时候,探讨最多的是SDN的可行性,以及如何将SDN应用到对应的网络场景中。本文是笔者在最近阅读2015年至今的若干SDN论文后总结的SDN最新研究进展,希望对读者提供一些帮助。

SDN/NFV

SDN和NFV都是当下网络界研究的热点,而如何将两者整合部署,也是研究的热点之一。设计SDN/NFV整合部署框架的研究是这个研究方向的主要研究切入点之一,比如参考文献[1]中就提出了一个SDN/NFV的整体架构。框架中的NFV协调器可以和云管理平台配合使用,SDN控制器也支持与云平台结合。由于此类方案是SDN与其他技术/框架的集合,本身没有太多创新性,论文中也仅仅介绍了其实现方案,所以此处不加赘述。

SDN/NFV结合还可以部署在很多场景,比如WiFi场景。OpenSDWN[2]就是一种软件定义的家庭/企业WiFi架构框架。 将SDN与其他技术结合并应用在特定网络场景是一种主要的研究方向之一。

流表优化

OpenFlow所支持的细粒度流管理是SDN最大的优势之一,但是细粒度的管理是需要付出代价的。为满足细粒度的管理,则需要更粒度的流表项。但是像OpenFlow协议这种细粒度的管理会带来一定的时延,对于时延敏感的短流业务而言,这个时延带来的影响是不可忽视的,这很可能会抵消了SDN带来的好处。所以如何通过流表来匹配流,从而减少流表项下发次数,是降低时延影响的有利手段。

此外,当网络流数目过多时,交换机的流表空间就无法满足需求。当流表满时 ...

read more

Ryu:网络时延探测应用

2016-05-24 by muzi

之前,笔者已经发布了网络感知应用和基于跳数的最短路径转发应用。本文将介绍笔者开发的网络时延探测应用。该应用通过LLDP数据包的时延和Echo数据包的时延计算得出链路的时延数据,从而实现网络链路时延的感知。详细原理和实现步骤将在文章中详细介绍。

测试原理

网络时延探测应用利用了Ryu自带的Switches模块的数据,获取到了LLDP数据发送时的时间戳,然后和收到的时间戳进行相减,得到了LLDP数据包从控制器下发到交换机A,然后从交换机A到交换机B,再上报给控制器的时延T1,示例见图1的蓝色箭头。同理反向的时延T2由绿色的箭头组成。此外,控制器到交换机的往返时延由一个蓝色箭头和一个绿色箭头组成,此部分时延由echo报文测试,分别为Ta,Tb。最后链路的前向后向平均时延T=(T1+T2-Ta-Tb)/2。

link delay
图1. 测量链路时延原理图

获取LLDP时延

获取T1和T2的逻辑一样,均需要使用到Switches模块的数据。计算LLDP时延的处理逻辑如下代码所示。首先从Packet_in中解析LLDP数据包,获得源DPID,源端口。然后根据发送端口的数据获取到portdata中的发送时间戳数据,并用当下的系统时间减去发送时间戳,得到时延,最后将其保存到graph数据中。

    @set_ev_cls(ofp_event.EventOFPPacketIn, MAIN_DISPATCHER)
    def packet_in_handler(self, ev):
        msg = ev.msg
        try:
            src_dpid ...
read more

Ryu:如何在LLDP中添加自定义LLDPDU

2016-05-20 by muzi

在许多实验场景中,都需要使用链路发现协议(LLDP)来发现链路,从而构建网络拓扑。然而LLDP协议不仅仅可以用来发现拓扑,也可以用于时延检测等业务。LLDP通过添加对应的TLV格式的LLDPDU(LLDP数据单元)来携带对应的信息,从而为上层业务提供信息支撑。为实现LLDP数据单元的拓展,本文将以Ryu控制器为例,介绍如何添加自定义的LLDPDU,从而满足多种业务的需求。

添加自定义LLDPDU其实只需修改ryu/lib/packet/lldp.py即可,但是由于该文件仅定义了LLDP的相关类,如何使用还需要其他文件去调用,所以还需要其他的修改步骤。具体步骤将在文章后续介绍。

修改lldp.py文件

ryu/lib/packet/lldp.py文件是Ryu控制器中关于LLDP协议数据类的描述,其中定义了如LLDPBasicTLV类等重要的报文类。 以添加发送时间戳的TLV为例,我们需要完成TLV类型号的声明,以及TLV类的定义。

在文件开头处有关于LLDP TLV类型的声明,所以首先我们需要添加一个新的类型:LLDP_TLV_SEND_TIME,其类型号为11。

    # LLDP TLV type
    LLDP_TLV_END = 0                        # End of LLDPDU
    LLDP_TLV_CHASSIS_ID = 1 ...
read more

我是一个SDN交换机

2016-05-03 by muzi

我叫阿飞,是大柳树村的快递小哥。阿飞是我的外号,因为我送货很快。

我做着普通的工作,拿着普通的工资,买不起房子,一直单身。但我知道,只要努力,就能出人头地。在因特奈特国,识字的人并不是很多,幸亏我还读过小学,才能成为一名光荣的快递员。很多时候,大家更喜欢叫我交换机,因为我每天都像机器一样机械地交换着包裹,日复一日,年复一年。不过很多快递员也和我一样机械地交换包裹,但我知道:我和普通快递员不一样。

老一辈的快递员学的东西很多,包括传统的OSPF和IS-IS等语言。但是随着经济的发展,新业务不断诞生,对物流系统的挑战也越来越大,前辈们也开始应接不暇。为了应付这种挑战,物流系统的深度改革终于展开了。新生代的我们只需要学会OpenFlow语言基本就可以找到工作。学习压力是减轻不少,但是我们却需要快递主管来指挥物流的转发,才能更好的工作。

还记得我当快递员的第一天,那是6月19号,星期五,阳光明媚,室外温度28摄氏度。上班路上,空气中竟有种淡淡的清香,像极了我在华为学院读书时女同桌阿楚的发香。她学习不太好,只学会了二层转发的知识,毕业之后就杳无音信了。要是能再见一面就好了,就算见不到,写写信也挺好的。

第一次推开办公室的木门 ...

read more