目标:
利用mininet搭建网络拓扑,利用ryu控制器实现查找两点间跳数最少,在此条件下剩余带宽最大的路径,并将此路径通过流表规则下发到网络中的交换机上。
需求:
1. 流量监控
网络流量的监控在本例中主要是对链路带宽的监控,我们使用控制器向交换机发送消息PortStatsRequest,交换机通过PortStatsReply消息进行回答。PortStatsReply消息中有交换机端口接收和转发的字节数。参考ryu控制器源码中“simple_monitor_13.py”这个流量监控器,不难实现对当前使用带宽的监控。
我们考虑每秒对交换机发送PortStatsRequest消息,在控制器收到PortStatsReply消息时,我们用端口当前的接收和转发字节数减去上一秒接收和转发字节数,就是这一秒经过该端口的字节数tmp_bytes=rx_bytes_now - rx_bytes_pre + tx_bytes_now - tx_bytes_pre。那么链路实时的带宽也就是tmp_bytes*8/(1024*1024) Mbps。
链路的最大带宽max_bw则需要预先存储在控制器中。
这样我们就可以实时获取网络中任意链路的剩余带宽:remain_bw=max_bw-now_bw。
2. 流量模拟
利用iperf工具可以模拟网络中的流量传输,以实现“剩余带宽”这一目标。
3.all_shortest_paths
该函数出自networkx包,暂未了解其底层逻辑。其作用是返回拓扑中的所有最短路径集Paths(因为我们先以跳数为指标,即每一跳的权重为1 ,在网络拓扑中,极易出现多条跳数一致的路径)。
4. get_best_path
对3中的Paths进行遍历,获取每条路径中的每段链路的剩余带宽,以最小的剩余带宽作为该路径的带宽;最终选择路径带宽最大的一条作为best_path。
演示
1.拓扑图
借用一下未来网络学院的拓扑图,并稍作修改,以满足后续实验需求。
2.实验操作
1. xterm h2打开h2主机,iperf -u -s -i -1将h2设置为服务器。
2. xterm h1打开h1主机,iperf -u -c 10.0.0.2 -b 4M -t 60使得h1、h2之间建立一条4M带宽的路径,根据我们的get_best_path算法,这条路径是h1-1-5-8-9-h2。此时(即iperf指令运行的60s内),链路的剩余带宽已经改变。
3. 打开主机h3,iperf -u -c 10.0.0.2 -b 3M -t 60使得h1、h3之间建立一条3M带宽的路径,根据我们的get_best_path算法及当前网络的带宽情况,这条路径是h3-1-3-6-9-h2。
可以看到输出的best路径确实是我们上述提到的两条,其输出顺序及数目如此庞大可能与控制器处理时延及流表下发时延有关。
此外,步骤2、3指令间隔请稍长一些,以保证h1、h2之间确实有4M的带宽在传输。如果不好把控时间,可以先使用h1 ping h2让控制器下发好流表。
优化
本文的算法在每次数据包达到新交换机时都要下发一次流表到当前交换机,以路径h3-1-3-6-9-h2为例,控制器接收了四次packetin消息,并且下发了四次流表。但事实上我们在1号交换机向控制器发送packetin消息时就计算好了接下来的所有链路,我们可以考虑在此时向3、6、9号交换机下发流表,加快处理速度。
如有错漏,欢迎指正。