RYU控制器实现最短路径

作者简介:王东旭 国防科技大学硕士生 研究方向为SDN+云计算

RYU控制器是日本NTT公司负责研发的一款开源的SDN/OpenFlow控制器,这个控制器是取名于日本的‘flow’的意思,所以叫RYU,RYU控制器完全有python语言编写,和POX类似。RYU控制器现在支持到OpenFlow版本的1.0,1.2,1.3,1.4版本,同时支持与OpenStack结合使用,应用 于云计算领域。RYU采用Apache Licence开源协议标准。

github源码地址,自带的应用都放置在ryu/app文件夹下。
通过如下命令运行应用:

“最短路径”应用的实现

参考了http://csie.nqu.edu.tw/smallko/sdn/ryu_sp13.htm和李呈大神的一些资料。
源码放在https://github.com/wangdongxuking61/ryu/edit/master/shortest_path_app文件夹下,shortest_path_app/下的重要文件如下:

  • create_topo.py:使用mininet的python API实现的自定义拓扑python代码;
  • sp.py:使用ryu的python API实现的“最短路径”应用;
  • MiniNAM.py+conf.config:MiniNAM就是在mininet的基础上,增加了运行时的界面,用法和mininet没区别。

使用步骤:

  1. 打开terminal,运行ryu控制器进程,启动“最短路径”的应用

    其中的--observe-links必须要加,否则看不到链路信息
  2. 再打开一个terminal,运行MiniNamet以启动使用mininet,创建自定义的网络。使用--controller=remote参数连接上一步启动的ryu的控制器进程

  1. 在mininet中,host互相ping或iperf发流,测试“最短路径应用”。在mininet窗口下让h1 ping h2,发送4个包:

    可以看到包走的路径是h1->s1->s4->s5->s3->h2,为什么不走跳数更少的s1->s2->s3呢?

    因为在sp.py的_packet_in_handler(self, ev)函数中,大约170行左右,我写死了交换机间的边权。在162行,其它节点间的边权为0。

    带权图如下:
    image.png
    像我这样强制指定链路的边权是不合理的,可以通过某些手段测得链路的实际物理值:带宽、时延等。

    本ryu应用计算的是单源最短路,使用的是networkx提供的nx.shortest_path函数(sp.py的183行),读者可以换成其它的算法,例如多路径算法floyd,实现multipath。如果知道链路的带宽,还可以运行带宽相关的算法,比如实现负载均衡类型的应用。

    备注1:这个拓扑图有环,arp我也没做什么处理。没出现风暴是因为网络小,在风暴来临之前就获知了h2的mac地址。。。后来我用wireshark抓包看了下,是出现了好多次无用arp,像我说的那样,网络小,在风暴来临前已经获知mac地址了。如果拓扑图大的话一定要使用生成树协议……

    备注2:其实整体过程并不是很难理解,在h1使用arp协议获知h2的mac地址之后,h1发出icmp ping包,s1不知道怎么处理,让控制器c0做决定,然后c0掐指一算,最短路径是1-4-5-3,让s1发给s4,s4也不知道怎么处理,还发给c0,c0还要算一次最短路,让s4发给s5,如此下去,因此要调用多次最短路径。不过也就最开始这样,等以后多发几次包,交换机流表项都配置好后,以后就不用问控制器了,交换机就知道该送到哪个交换机了。不过如果链路的权重变化了,那就要通知控制器,重新计算最短路,这样就麻烦了。。。之前的流表项要删,控制器配置新的流表项。具体怎么实现“权重改变,通知控制器”我也在想该怎么实现……


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/20370.html
分享到:
相关文章
条评论

登录后才可以评论

wangdongxuking61 发表于17-12-22
9