目录
3.基于跳数,时延,带宽的最短/优路径和负载均衡[4]
1.基于OpenFlow协议的链路带宽测量[1]
带宽数据是网络状态中的重要数据。在SDN网络中获取带宽可以通过OpenFlow协议,也可以通过第三方的测量软件获取数据,如sFlow。此处仅介绍如何通过OpenFlow协议来获取可用带宽。
一条链路的带宽由两个端口的能力决定,所以我们可以通过获取端口的流量来得到链路的流量。OpenFlow协议中可以通过统计报文来获取端口、流表、流表项、组表和meter表的统计信息。
以端口的统计信息为例,控制器通过周期下发Port statistics消息可以获得交换机端口的统计信息,其返回的统计消息格式如下:
struct ofp_port_stats {
uint32_t port_no;
uint8_t pad[4];/* Align to 64-bits. */
uint64_t rx_packets;/* Number of received packets. */
uint64_t tx_packets;/* Number of transmitted packets. */
uint64_t rx_bytes;/* Number of received bytes. */
uint64_t tx_bytes;/* Number of transmitted bytes. */
uint64_t rx_dropped;/* Number of packets dropped by RX. */
uint64_t tx_dropped;/* Number of packets dropped by TX. */
uint64_t rx_errors;/* Number of receive errors. This is a super-set
of more specific receive errors and should be
uint64_t tx_errors; /*
uint64_t rx_frame_err;
uint64_t rx_over_err;
uint64_t rx_crc_err;
uint64_t collisions;
uint32_t duration_sec;
uint32_t duration_nsec;
};
从返回的统计消息中可获取到:收发数据包的数量、字节数以及这个统计持续的时间。
统计流量速度=两个不同时间的统计消息的字节数之差/两个消息的统计时间差。
每条链路的已用带宽可根据统计一段时间间隔内端口接收到的数据字节总数和传输的字节总数,则链路的已用带宽公式为:
.
因此,链路的可用带宽可表示为:,其中为链路的总带宽。
同理,可以计算出对应流表项或者组表等的统计流量。
基于以上计算出来的端口剩余带宽等数据,可为部署负载均衡等流量优化工程提高数据支撑。
2.基于Ryu的链路时延测量[1][2][3]
时延的测试在终端会显得很容易,但是在交换机节点上测试时延就比较麻烦。在SDN中,可以通过一下步骤实现交换机之间链路的时延。
(1)控制器向交换机A下发一个Packet_out报文。报文的数据段携带了任意一个约定好的协议报文,其报文的数据段携带了控制器下发报文时的时间戳。Packet_out报文的动作指示交换机将其泛洪或者转发到某端口。
(2)交换机B收到了交换机A发送过来的数据包,无法匹配对应流表项,从而packet_in到控制器。控制器接收到这个数据包之后,和当下时间相减,得到时间差,即
.
(3)同理,控制器向交换机B发送一个类似的报文。然后控制器从交换机A收到Packet_in报文,记录下时间差,则:
.
(4)控制器向交换机A和交换机B分别发送带有时间戳的Echo request。交换机收到之后即刻回复携带echo request时间戳的echo reply消息。所以控制器可以通过Echo reply的时间戳减去Echo reply携带的时间,从而得到,。因此,交换机A到交换机B的RTT为:
.
(5)假设交换机A与交换机B之间的往返时间一样,则交换机A到交换机B的链路时延为:
.
通过以上步骤,可以相对准确地测量链路传输时延,但在计算过程中,数据包在交换机中的处理时延这部分时间无法计算而被忽略掉了。
3、基于跳数,时延,带宽的最短/优路径和负载均衡[4]
原理 | 设置 | |
基于跳数的最短路径转发[5] | 通过network_awareness应用来实现网络拓扑资源的感知并计算最短路径。 1.使用networkx的有向图数据结构存储拓扑信息; 2.使用networkx提供的shortest_simple_paths函数来计算最短路径。其函数参数信息为:shortest_simple_paths(G, source, target, weight=None); 3.获得最短路径之后,shortest_forwarding应用将完成流表下发等工作,实现基于跳数的最短路径转发应用。 | |
基于时延的最优路径转发[6] | 原理和基于跳数的最短路径转发应用类似,只是链路权重类型变成了时延。 1.NetworkDelayDetector是一个网络时延探测应用[6],其在获取到链路时延之后,将时延数据存储到Networkx的图数据结构中,以供其他模块使用。 2.通过设置链路权重参数,Shortest_forwarding应用可以基于时延数据计算最优的转发路径。 | |
基于带宽的最优路径转发/负载均衡 | 先计算基于跳数的K条最短路径,再从中选取可用带宽最大的那条路径为最优解。 1.链路可用带宽的数据由nework_monitor应用提供。周期地获取链路的剩余带宽,并将带宽数据存储到networkx的图结构中,提供给其他模块使用; 2.network_monitor模块还实现了基于链路可用带宽的最优转发路径的计算,为其他模块提供最优路径信息; 3.Shortest_forwarding应用可以基于带宽数据计算最优的转发路径。 | 为解析权重和最短K路径的参数,还需要在Ryu中注册全局的启动参数。 1.需要在Ryu顶级目录下的flags.py文件中添加如下的代码: CONF.register_cli_opts([ # k_shortest_forwarding cfg.IntOpt('k-paths', default=1, help='number for k shortest paths'), cfg.StrOpt('weight', default='hop', help='type of computing shortest path.')]) 2.还需要重新安装Ryu:进入到ryu/的根目录,运行setup.py文件,并添加install参数。 sudo python setup.py install 3.重新安装完成之后,启动shortest_forwarding应用,并添加observe-links,链路权重和最短路径条数等重要参数,示例如下: ryu-manager ryu/app/network_awareness/shortest_forwarding --observe-links --k-paths=2 --weight=bw 4.启动Ryu之后,启动任意的SDN网络,如Mininet模拟的网络,并连接到Ryu控制器。最后可以在Mininet输入框中输入pingall进行测试。 sudo mn --controller=remote --topo=tree,3,3 --mac |
参考文献
1.基于SDN的网络状态测量. Muzixing.
2.Ryu:网络时延探测应用. Muzixing.
3.ryu实例---网络时延探测. ryu实例---网络时延探测_楊木木8023的博客-CSDN博客_ryu测量时延.
4.基于跳数,时延,带宽的最短/优路径和负载均衡. 基于跳数,时延,带宽的最短/优路径和负载均衡_「已注销」的博客-CSDN博客_最短路径负载均衡.
5.ryu实例---基于跳数的最短路径转发. ryu实例---基于跳数的最短路径转发_楊木木8023的博客-CSDN博客_ryu最短路径.
6.ryu实例---基于链路质量(时延)的最短路径转发. ryu实例---基于链路质量(时延)的最短路径转发_楊木木8023的博客-CSDN博客_ryu最短路径.