基于北向API开发一个简单的应用,实现网络拓扑中最短路径的查找,并开发应用实现基于SDN网络的链路故障恢复功能。
一、实验内容
内容:基于于北向API开发一个简单的应用,实现网络拓扑中最短路径的查找,并开发应用实现基于SDN网络的链路故障恢复功能。
具体要求:
1、在链路故障后,使用最短路径算法来选取新的传输路径。
2、在网络中所有链路均正常的情况下,h1到h2的传输路径为h1às1às4às5àh2。假设此时s1às2的链路发生故障断开连接,那么此时路径h1às1às4às5àh2便不再可行。为了保证主机h1和h2之间的正常通信需要查找新的路径,在链路故障发生时,实现主机之间通过新的路径传输数据。当s1和s4之间断开连接时,h1和h2会及时发现链路故障,同时及时查找出新的路径h1às1às4às5àh2,通过新路径传输数据。
二、实验流程
三、实验步骤
1.网络拓扑搭建
运行结果:
2.启动RYU
添加有关链路故障恢复功能的函数,包括删除交换机流表项和获取端口信息两个函数:
defdelete_flow(self, src_ip=None, src_port=None, dst_ip=None, dst_port=None, datapath =None):
ofproto = datapath.ofproto
parser = datapath.ofproto_parser
inst =[parser.OFPInstructionActions(ofproto.OFPFC_APPLY_ACTIONS,actions)]
mod = parser.OFPFlowMod(datapath=datapath,out_port=dst_port,
out_group=ofproto.OFPG_ANY,
command=ofproto.OFPFC_DELETE,
match=None,instructions=inst)
datapath.send_msg(mod)
@set_ev_cls(ofp_event.EventOFPPortStatus,[CONFIG_DISPATCHER, MAIN_DISPATCHER, DEAD_DISPATCHER, HANDSHAKE_DISPATCHER])
defget_OFPPortStatus_msg(self, ev):
msg=ev.msg
datapath=ev.msg.datapath
dpid = msg.datapath.id
ofproto=datapath.ofproto
parser=datapath.ofproto_parser
port=msg.desc.port_no
#key1 = (dpid, port)
#dpidPort_to_ip=self.network_monitor.DpidPort_to_ip[key1]
reason=msg.reason
if reason==ofproto.OFPPR_MODIFY:
self.delete_flow(datapath=datapath,dst_port=port)
对于delete_flow函数,功能为删除交换机的流表项。调用RYU自带的parser.OFPFlowMod函数,对比add_flow函数,最主要的差别即为将内部的变量command变成ofproto.OFPFC_DELETE,代表流表删除。
对于get_OFPPortStatus_msg(self,ev)函数,功能为获取端口信息,一旦发生链路故障,获取发生故障的交换机的端口信息,然后调用delete_flow函数,删除这些交换机的流表信息。
运行结果:
3.分别h1 ping h2和h2 ping h1
结果:均可ping通。当h1 ping h2时,路径为s1às4às5,path含义:从switch1的1端口进,从switch1的3端口出,从switch4的1端口进,从switch4的2端口出,从switch5的2端口进,从switch5的3端口出。同理,h2 ping h1的路径为s5às4às1,均为最短路径。
4.重新进行h1 ping h2,并在ping的过程中手动断开switch1和switch4的连接
最初,传输路径为s1às4às5,当s1与s4断开,即网络传输路径发生链路故障,则流量传输路径变成了s1às2às3às5,也可看到客户端h1一直在发送数据,服务端h2也一直在接收数据。