(一)基础要求
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 h2
或h1 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