您的位置:首页 > 运维架构

opendaylight路由机制学习

2015-06-19 20:59 1186 查看
最近由于毕业论文的事,开始了SDN之旅,SDN,软件定义网络。通过网络控制层与数据层的分离实现了对网络的集中控制。在SDN网络中存在两类对象,SDN控制器和交换机,控制器与交换机之间通过openflow进行通信。SDN网络中,交换机只负责根据控制器指令进行相应操作,所有的实现都在控制器上完成。目前主流的控制器有NOX,FLoodLight,opendaylight等。目前最火的,支持的厂商最多的要数opendaylight吧。
首先要理解opendaylight控制器结构,必须有OSGI的概念,其具体可以参考http://m.blog.csdn.net/blog/ICTCamera/18408457。其通过“容器”来管理各个功能模块,自己写的模块注册到容器中就能运行。




另外opendaylight还有一个重要机制,SAL(服务抽象层)我的理解是将底层接口提供的功能封装成项服务来供上层模块使用。其支持多种南向协议,屏蔽了协议间差异,为上层模块和应用提供一致性的服务。其提供的服务有数据包服务、拓扑服务、流编程服务、资源查询服务、连接服务、统计服务、清单服务等。其在代码中对应的是

,其在南向接口openflow插件里面,用于对底层设备的一些操作。每项服务具体功能可以参考http://wenku.baidu.com/link?url=KjzEl1-ZsRMw4RPVYtkY3-0UYzgSx6ETXhuKztfQvq565v7kNGcgoiQpC4dIjCh-_KNRJjZs8yuamVqi7vYWwPbrYKc0OVxqOEAL1z7–cq

接下来着重介绍一下opendaylight路由转发部分,其主要在samples.simpleforwarding中实现的。首先此模块注册了IListenDataPacket服务,当从SAL收到数据包时,调用

将数据包放到待处理队列,handlePuntedIPPacket()方法将数据包IP目的地址放入pendingPacketDestinations

集合类中。同时PendingPacketsAgerTimerHandler extends TimerTask对象中的run线程中不断对pendingPacketDestinations中取出对象IP。由于主机追踪模块也注册了数据包服务,其也会对数据包的目的主机进行解析,其得到目的主机的位置信息后执行了notifyHTClient(host)方法,接着 首先preparePerHostRules


其对每个交换机进行遍历,计算每个交换机到目的主机所连的交换机(rootnode)之间的路径,其使用的是Dijkstra最短路径算法来得到路由,得到路径将路径的链路利用updatePerHostRuleInSW方法生成流表信息放入rulesDB,接着执行installPerHostRules(host, switches)将流表规则下发至每个交换机;接着执行sendPendingPacket(),这时又回到了handlePuntedIPPacket(),利用dataPacketService.transmitDataPacket()方法将数据包发送出去;

其中针对DijkstraImplementation部分,使用的是最短路径,虽然提供了


但只是在test代码中进行了测试,并没有应用。其原理是将链路赋予权重,然后进行最短路径路由。

总结一下:opendaylight中只要得到主机拓扑信息后,路由就通过Dijkstra算法确定了。其实现采用的是JUNG(Java Universal Network/Graph framework),JUNG在于为开发关于图或网络结构的应用程序提供一个易用、通用的基础架构。使用JUNG功能调用,可以方便的构造图或网络的数据结构,应用经典算法(如聚类、最短路径,最大流量等),编写和测试用户自己的算法,以及可视化的显示数据的网络图。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息