RYU解决ARP洪泛并寻找最短路径(时延or跳数)

实验内容

1. 寻找跳数最少的路线

2. 寻找时延最短的路线

实验内容

需要解决的几个问题

1. 如何发现整个网络的拓扑

2. 如何解决ARP洪泛的问题

3. 如何寻找条数最短的路线

4. 如何计算时延和寻找时延最短的路径

实验过程

获得整个网络的拓扑

利用RYU提供的API,我们可以很方便的获得整个网络的拓扑。但是在这个过程中也遇到了一些问题。一个问题是关于获得links的。当使用相应的API获取links的时候。在运行相应的RYU APP的时候应该加上相应的 —observe-links.原因是links的获取靠的是LLDP数据包。应该加上该参数链路中才会有该数据包。另一方面是关于获取hosts的问题。利用相关的API获得的hosts并不是链路中真正的hosts。会夹杂一些交换机在里面。目前还不清楚是什么原因。可能和相关的协议有关。下面是本次实验用到的获取拓扑结构的函数:

 

 

由于本实验需要寻找最短路径,引用了NetWorkx包。所以我们需要将相应的switch和host作为结点和相应的连接加入到NetWorkx提供的数据结构中。至此关于拓扑的问题就解决了。下面需要解决的是ARP包的洪泛的问题。

解决ARP洪泛

首先我们需要知道关于一些ARP包的一些知识。当一个主机需要知道另一个主机的MAC地址的时候,就会向网络中请求ARP请求包,包中的目的地址为:FF:FF:FF:FF:FF:FF。当对应的主机收到ARP请求包之后,则会将自己的放回一个含有自己MAC地址的ARP响应包。在有了这些基础知识之后,就可以开始相应的实验了。

一、第一种思路解决ARP的洪泛

该思路的主要内容为:

我们通过Ryu的API可以发现全局的拓扑信息,将交换机的端⼝信息记录下来,当控制器收到⼀个未学习的Arp Request时,直接发给所有交换机连接主机的那些端⼝,这样我们可以减少数据包在⽹络中的⽆意义的洪泛。

解决步骤:

1. 首先我们需要获得整个网络的拓扑信息,这个前面已经解决了。

2. 获得所有交换机连接主机的端口。刚开始想的是先获取所有的host,然后再获得所有的links。将links上和主机相连的交换机以及交换机的端口记录下来。但是实际实施起来发现。利用API获得host里面混杂了一部分交换机。最后使用的办法是获得交换机的所有端口,然后通过links去掉那些交换机之间相互连接的端口。最后剩下的就是交换机与主机相连的端口。主要代码如下:

 

 

3. 将未学习的ARP包向所有交换机与主机相连的端口转发。这里遇到的主要问题是如何让控制器向所有的交换机转发这个消息。首先我们需要记录每一个需要控制器处理的ARP包的源IP地址和源MAC地址来学习。每当有一个新的ARP包到来时,我们需要先判断一下他要的目的MAC我们是否已经学习的了。没有的话,再按照上述思路进行。

要怎么实现向所有的交换机发送数据包呢。在解决这个问题之前,我们需要对RYU中的DataPath有一定了解。

这是我在网上找到的一段话。可以简单的理解为DataPath就是交换机和控制器之间的一条有名字的公路。这个名字就是dpid。由于这条路的一端是固定的,都是连接控制器,因此我们也常用这个dpid来区分路由器。

在了解了上述信息之后,便有了如下的想法。每当有一个Pack_In数据包被发到控制器,我们就记录他的DataPath和dpid。当需要我们处理的数据包是为学习的ARP包的时候,就可以利用以前记录的DataPath和交换机与主机相连的端口来发送数据包。至此整个问题已经基本解决了。主要代码实现如下:

 

 

二、利用第二种思路解决ARP洪泛

第二种思路相对于第一种思路就比较好实现一些。每当有一个新的ARP包到来的时候,我们都查看一下该对应的交换机曾经是否已经发出过同样的数据包。如果没有的话就记录一下,让后让他转发这个数据包,有的话将将这个数据包丢弃。这样就有效的避免了数据包再链路中不断的被重复转发,占用带宽资源。

至此我们已经利用两种思路解决了ARP包洪泛的问题。

获得最短路线

这里主要依靠的是NetWorkX这个包。当收到一个数据包的时候。我们将数据包的源地址和目的地址作为shortest_path()函数的参数。该函数返回的是一个路径上的结点的列表。然后我们再来判断一下当前转发这个数据包的交换机是否在这个最短路径上。不在的话就可以将该数据包丢弃了,不需要他转发。在的话,就将数据包转发到path中的下一个结点。

 

 

值得注意得是,由于主机和交换机之间也存在通信,当时由于初始得时候get_all_switch()并没有将主机加入到图中,因此当收到一个源地址没在图中得时候,说明该包是一个主机发出得,我们需要将该主机加入到图中,才能保证最终结果得正确性。

计算时延和寻找时延最短路径

时延的计算主要参考老师在实验指导书中提供的方法。

一、计算链路的时延

计算链路的时延需要对原始RYU中的一些文件进行相应的改动,这里主要参考实验指导书,便不再赘述。实验的计算主要依靠的是LLDP数据包。所以我们要在对应的APP中引入相应的python文件。主要代码如下:

 

 

由于使用得是时间戳来计算时延,所以我们需要将各个时间戳乘上1000,所得得差的单位便是毫秒。至于寻找最短路径,和前面的思路基本一致,唯一不同的便是边的权值发生了变化。

实验结果

1.输出拓扑

2. 输出基于跳数的最短路径

3.基于时延的最短路径

由于主机和交换机之间无法利用LLDP数据包计算时延,所以这里将他们之间边的权值设为0。同时可以看出总路径时延约等于RTT的一半左右。

附录

思路一解决基于跳数的最短路径问题

 

 

思路二 解决基于时延的最短路径问题

 

One thought on “RYU解决ARP洪泛并寻找最短路径(时延or跳数)

Leave a Reply

发表评论

电子邮件地址不会被公开。 必填项已用*标注

本站所有文章均为原创,若需转载,请注明出处©twn29004 | 陕ICP备 20000896 网站备案号

总访问量:8881075    今日访问量:71    您是今天第:71 个访问者