通信网实验_DFS算法_Dijkstra算法_Mininet_Ryu

这两个project的实现需要广播,也就是需要以https://www.bilibili.com/read/cv9546894为基础。

为什么这两实验需要广播?因为要做链路层发现,洪泛的时候要用到MST。

https://zhidao.baidu.com/question/367633876776495564.html

之所以把DFS算法和Dijkstra算法放在一起讲,是因为这两个project实现起来都很简单 和找最x路有关,虽然很少用DFS算法来找最短路,但是project的内容就是这么强行让人搞。

事先声明,这里都用7结点网络为例,而且不会放代码。(因为上面那个链接已经把绝大部分的关键的代码贴出来了,之后这些实验只是对那些代码进行一定的修改,在贴代码那真的没意思了)

例子

先来看看DFS算法实验内容:

1、在Ryu上实现深度优先遍历算法,并找出任意两个主机间的最短路和最长路(这里只讲实现寻找到最长路。因为对于最短路,只要把找最长路步骤中的不等号方向改改就行了,原理一致);

2、用最长路来配置通信业务;

3、把配置通的业务在可视化平台上进行展示。

实现建议:

1、尽量使用非递归版本的DFS算法,因为它所需要的资源会比递归版本的DFS算法少(虽说我在实现的时候用的是递归,哈哈哈,( ̄ε(# ̄)打脸 )

2、如果你遇到的是仁慈的助教和老师,他们应该会让你在一个小拓扑(比如这个7结点的)里面跑算法(因为比如在24结点里面跑DFS,运行时间会比较长,跑出来的路有上万条),此时你可以在考虑在Kruskal算法结束后立马对网络中所有的任意两个点使用DFS(小网络算得很快)并把结果保存起来,在ping的时候直接调用结果即可,比那两个年轻人啪的一下站起来还快;但是如果助教和老师不允许改网络规模,那就不能像刚刚那样投机取巧了,只能乖乖地在PacketIn事件中,根据解包出来的src和dst,仅仅对这两个点调用DFS算法。不过这种情况下一般(就是当你不是使用性能极好的电脑的时候)第一次ping必丢包,因为等结果出来前,数据包早就die了(https://baike.baidu.com/item/TTL/130248),但如果计算结果正确,第二次ping就OK了。

3、直接使用Kruskal算法算出来的MST当作通信链路即可,反正助教不看代码。 不是,年轻人不讲武德。不要耍这些聪明,小聪明蛤。即使不看代码也能识破这一招。这只需在之前那条创建仿真网络的指令后面加上 --link=tc即可。

这样创建出来的网络中的链路不再是理想链路,而且ping的时候会显示这个包在链路中跑了多久。

举个栗子:

先看看用Kruskal算出来的MST来ping h1 和h7:
这条路单向总时延为16ms。16*2 = 32ms

看第二次ping的时延信息,略大于32ms

使用DFS算法算出h1到h7最长路,并以此最为通信链路:
这条路的单向总时延是49ms。49*2 = 98ms。(还有,是paths不是pathes)
看第二次ping的时延信息,略大于101ms

所以到底是否正确配置链路,一看就知道了。总而言之,不要耍小聪明。

4、独立再写一个可以进行可视化的脚本。因为networkx的窗口弹出来之后呀,Ryu和Mininet之间的连接貌似会断开,导致流表下发失败,但是图还是可以看的。(其实如果你相信自己的手速的话可以不需要独立写一个可以可视化的脚本——在networkx的窗口弹出来的瞬间,将其关闭,即可)

Dijkstra算法实验内容

1、使用Dijkstra算法计算任意两点之间的最短路(这里意味着,使用Dijkstra算法求解单源单宿最短路哦。算法的结束判定条件需要进行一定的修改(当然,不改也可));

2、使用最短路配置任意两点间1的通信业务;

3、将所有业务在可视化平台上展示。

实现建议

1、使用循环桶。简单好写,时间复杂度和空间复杂度都很低;

2、如果是使用循环桶的亲,这边建议开创一个变量记录桶中总共的元素个数。若个数为零,可以直接停止Dijkstra算法了。虽然在这个实验中,这一步略显多余,但自我感觉这样会比较好。。。(防止进入死循环,抛弃这一步的话,在最大流的实验中很可能就会进入这种死循环);

3、因为Dijkstra算法复杂度很低,所以助教和老师必然会让该算法在一个较大的网络上跑,所以不能在Kruskal算法结束后便开始该算法(其实也可以,如果助教比较耐心,而且验收的时候不怕尴尬的话),而是应该在知道了包的源和汇才进入算法;

4、举个栗子:如果这个包的源是h22,汇是h33,那么调用Dijkstra算法后可以算出h22 ~> h33的最短路。先把这条路保存下来,以便之后再次使用。把路反过来,就能找到h33 ~> h22的最短路了。这个做法可以减小运算时间,降低丢包率;

5、这里同样可以使用 --link=tc来推测链路是否配置出错哦。

一些我遇到的坑

1)在python中对列表用append之后,append进列表的是变量的地址,当变量的值改变后,对应的,列表中的值也会变。当想某个值并入列表后不被修改,应该使用S.append(copy.deepcopy(A)) (注:需要导入copy包。S表示某个被操作的列表,A为你想并入S的变量,deepcopy在某些情况可以改用copy,即S.append(copy.copy(A)),至于这个“某些情况”是个啥,感兴趣的xdm可以自己百度一下。这个语句是python2的语法,python3的话,好像是S.append(copy(A)))。

2)PacketIn事件处理的一些细节。在datapath.ports中有一个端口为4294967294。这个端口似乎是用不上的。递包时需注意。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值