Floodlight的拓扑计算模块是TopologyInstance类,该类主要是生成拓扑信息以及计算两节点间路径,与TopologyManager在系统中是同属一个代码目录。主要分析拓扑计算模块类中的方法compute()
:
compute()
运行的大致流程:
- Step1:调用方法identifyOpenflowDomains()通过深度优先的算法计算出整个网络中的所有集群clusters,每一个集群都是一个强相连的子图;
- Step2:调用方法addLinksToOpenflowDomains()遍历所有的链路links,如果链路两端的交换机属于同一个集群cluster,则将该链路添加到这个集群中;
- Step3:调用calculateShortestPathTreeInClusters()方法计算路径,该方法首先会清空路径缓存变量pathcache,再调用负载均衡路由算法计算每个cluster所有点之间的路径;
- Step4:调用calculateBroadcastNodePortsInClusters()根据路径结果生成每个集群中的广播树结构,主要是为了避免环路产生广播风暴。控制器收到交换机上送的ARP包后,会先根据广播树决定ARP包应该被flood还是转发。
TopologyInstance
类在计算路径时采用Dijkstra算法,基于跳数,即每条链路Cost值为1。除此之外,还定义了buildroute()
方法和getroute()
方法,buildroute()
方法根据compute()
计算的结果创建路径,getroute()
方法则将buildroute()
的路径缓存到pathcache中供转发模块Forwarding
获取。
个人分析,欢迎指正,若转载请注明出处!