实验5:开源控制器实践——POX

(一)基础要求

Hub模块

h1 ping h2

h1 ping h3

l2_learning 模块

h1 ping h2

h1 ping h3

L2_learning模块代码流程图

(二)进阶

1.重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通

搭建拓扑sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10

SendFlowInSingle3代码

from pox.core import core
import pox.openflow.libopenflow_01 as of

class SendFlowInSingle3(object):
    def __init__ (self):
    	core.openflow.addListeners(self)
    def _handle_ConnectionUp(self,event):
        
        #设置数据包从端口1进,从端口2和端口3出
        msg = of.ofp_flow_mod()# 使用ofp_flow_mod()的方法向交换机来下发流表
        msg.priority = 1#设置msg的优先级
        msg.match.in_port = 1#设置在端口1接收数据包
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))#增加转发向所有端口的动作
        event.connection.send(msg)#通过send函数向交换机发送所设定的消息

        #设置数据包从端口2进,从端口1和端口3出
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.match.in_port = 2
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)

        #设置数据包从端口3进,从端口1和端口2出
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.match.in_port = 3
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)


def launch ():
	core.registerNew(SendFlowInSingle3)

SendPoxHardTimeOut代码

from pox.core import core
import pox.openflow.libopenflow_01 as of

class SendPoxHardTimeOut(object):
    def __init__(self):
        core.openflow.addListeners(self)
    def _handle_ConnectionUp(self, event):
	
	
        msg = of.ofp_flow_mod()  
        msg.priority = 3
        msg.match.in_port = 1 
        msg.hard_timeout = 10  #硬超时10秒
        event.connection.send(msg)
        
        msg = of.ofp_flow_mod()  
        msg.priority = 1
        msg.match.in_port = 1 
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL)) 
        event.connection.send(msg)

        
        msg = of.ofp_flow_mod()  
        msg.priority = 3
        msg.match.in_port = 3 
        msg.hard_timeout = 10
        event.connection.send(msg)
        
        msg = of.ofp_flow_mod() 
        msg.priority = 1
        msg.match.in_port = 3  
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))
        event.connection.send(msg)

def launch():
    core.registerNew(SendPoxHardTimeOut)

2.1 基于进阶1的代码,完成ODL实验的硬超时功能。(先运行SendFlowSingle3,先通再断再恢复)

2.2 基于进阶1的代码,完成ODL实验的硬超时功能。(直接运行SendPoxHardTimeOut,先断后通,能验证流表项生效即可)


``

实验现象原理

OpenFlow协议通过超时机制来缓解交换机流表容量有限的问题。该机制让流表项只在一段时间内生效,并自动清理掉旧的、失效的流表项,腾出流表容量,以添加新的流表项。OpenFlow协议的流表项超时机制的核心是有效时间,用户可以为每条流表项指定一个有效时间(不指定则一直存在),在控制器向交换机下发流表项时设定。如果某条流表项存在的时间(硬超时)或未被匹配到的时间(软超时)超过预设定的有效时间,OpenFlow交换机会主动移除该流表项。因此我们查看流表的时候,s1-eth1只有一条,

流表的匹配遵循两条原则:

(1)优先级不同情况下,优先级高的先匹配,优先级低的后匹配,优先级的范围0~66535,数字越大则优先级越高;

(2)优先级相同情况下,当流表项具有相同的优先级,相同的actions,不同的匹配域粒度的情况下,按照流表项添加的先后顺序匹配,最先添加的流表项,数据流优先匹配,即按照添加的先后顺序进行匹配

(我的理解,不一定对捏):下发2了个流表 一个高优先级 无转发动作,设定硬超时机制10s的流表t1 和 一个低优先级 有转发动作的流表t2。开始发送数据,根据匹配机制,优先匹配高优先级的t1,因为t1无转发动作,所以显示找不到主机,10s后因为硬超时机制,t1被删除,后继的数据发送匹配t2,可以正常发送数据包

个人总结

  • forwarding.hub 组件的作用为:在每个交换机上安装泛洪通配符规则,将数据包广播转发,此时交换机等效于集线器。所以 h1 ping h2h1 ping h3时h2 h3都能抓到包
  • forwarding.l2_learning组件的作用:让OpenFlow交换机实现L2自学习,当它进行L2地址学习时,它会与尽可能多的字段做匹配,实现流规则多样化。数据只会发给对应的主机
  • 创建拓扑的时候协议必须使用协议open Flow 1.0,pox只支持1.0版本
  • L2_learning模块的代码流程图通过查看L2_learning.py文件中一大片注释得知算法流程,再根据算法流程在线画流程图,还行,就是导出会带水印
  • ping用于确定本地主机是否能与另一台主机成功交换(发送与接收)数据包, 发送与接收!!!! 要能发也能收ping的时候才能显示信息,单边通的的时候ping还是显示找不到主机( 尝试过只添加h1发送给h3的流表动作不添加h3发给h1的流表动作 ,h1 ping h3显示找不到主机。根据定义结合实践总结的,没找到确定的资料,不一定对捏)
  • 进阶部分pdf给的资料看得云里雾里的,都是英文,翻译了也不知道该干啥,最后问了老师并参考了别人的代码写出来了
  • 这次实验验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法,进一步熟悉POX控制器流表下发的方法
  • 进一步了解了SDN流表匹配机制和OpenFlow协议超时机制以及ping
posted @ 2022-10-07 20:25  计科废物1  阅读(88)  评论(0编辑  收藏  举报
@media only screen and (max-width: 767px){ #sidebar_search_box input[type=text]{width:calc(100% - 24px)} } L2Dwidget.init({ "model": { jsonPath: "https://unpkg.com/live2d-widget-model-hijiki/assets/hijiki.model.json", "scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") }