首页 > 其他分享 >实验5:开源控制器实践——POX

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

时间:2022-10-07 20:36:00浏览次数:70  
标签:控制器 表项 POX 流表 ping ofp 开源 msg port

(一)基础要求

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,负责抓包的时候会抓不上,或者抓上了ip是ip6的格式
  • 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

标签:控制器,表项,POX,流表,ping,ofp,开源,msg,port
From: https://www.cnblogs.com/wjc6765/p/16750480.html

相关文章

  • 开源电子书 nginx开发手册文档 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1_LZNQWmpQno988_QDY06Og点击这里获取提取码 ......
  • 实验5:开源控制器实践——POX
    基础要求tcpdump验证Hub模块h1pingh2的tcpdump抓包结果截图h1pingh3的tcpdump抓包结果截图tcpdump验证Switch模块h1pingh2的tcpdump抓包结果截图h1ping......
  • 字节开源go框架
    httphertz:​​https://github.com/cloudwego/hertz​​​thriftkitex:​​https://github.com/cloudwego/kitex​​​gopkg:​​https://github.com/bytedance/gopkg​​......
  • 实验5:开源控制器实践——POX
    一、实验目的1.能够理解POX控制器的工作原理;2.通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;3.能够运用POX控制器编写自定义......
  • .NET 开源项目推荐之 直播控制台解决方案 Macro Deck
    流媒体是一个吸引数亿万玩家的严肃行业。最受欢迎的游戏锦标赛的转播获得了数百万的观看次数,从商业角度来看,这也使游戏行业变得有趣。在直播圈有个很受欢迎的直播控制台程......
  • 实验5:开源控制器实践——POX
    实验5:开源控制器实践——POX一、实验目的能够理解POX控制器的工作原理;通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;能够......
  • Hutool - 开源的Java工具集
    官网 参考文档......
  • 实验4:开源控制器实践——OpenDayLight
    实验4:开源控制器实践——OpenDaylight基本要求Mininet拓扑生成并连接控制器的结果用OpenDayLight观察效果Postman中发生硬延时个人总结本次实验刚开始一直打......
  • 接私活必备的几个开源项目!收藏
    WTM项目名称:WTM项目所用技术栈:wtm mvvm mvc aspnetcore dotnetcore react vue layui layui-admin element-ui ncc等项目简介:WalkingTec.Mvvm框架(简称WTM)是基于.ne......
  • 实验4:开源控制器实践——OpenDaylight
    实验4:开源控制器实践——OpenDaylight一、实验目的能够独立完成OpenDaylight控制器的安装配置;能够使用Postman工具调用OpenDaylightAPI接口下发流表。二、实验环境......