实验5:开源控制器实践——POX
(一)基本要求
验证Hub模块
h1 ping h2
h1 ping h3
验证Switch模块
h1 ping h2
h1 ping h3
L2_learning模块流程图
(二)进阶要求
1.重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
代码
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.lib.util import dpid_to_str, str_to_dpid
from pox.lib.util import str_to_bool
import time
class SendFlowInSingle3(object):
def __init__(self):
core.openflow.addListeners(self)
def _handle_ConnectionUp(self, event):
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=2)) # 从端口2转发出去
msg.actions.append(of.ofp_action_output(port=3)) # 从端口3转发出去
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 2 # 使数据包进入端口2
msg.actions.append(of.ofp_action_output(port=1)) # 从端口1转发出去
msg.actions.append(of.ofp_action_output(port=3)) # 从端口3转发出去
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 3 # 使数据包进入端口3
msg.actions.append(of.ofp_action_output(port=1)) # 从端口1转发出去
msg.actions.append(of.ofp_action_output(port=2)) # 从端口2转发出去
event.connection.send(msg)
def launch():
core.registerNew(SendFlowInSingle3) #注册SendFlowInSingle3组件
运行结果
ovs-ofctl交换机流表项截图
2.基于进阶1的代码,完成ODL实验的硬超时功能。
代码
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() # 使用ofp_flow_mod()方法向交换机下发流表
msg.priority = 1
msg.match.in_port = 1
msg.actions.append(of.ofp_action_output(port=3))
event.connection.send(msg)
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 2
msg.actions.append(of.ofp_action_output(port=3))
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=1))
msg.actions.append(of.ofp_action_output(port=2))
event.connection.send(msg)
def launch():
core.registerNew(SendPoxHardTimeOut)
ovs-ofctl交换机流表项截图
运行结果
(三)个人总结
1.实验难度:本次实验难度要比前几次要大,并且用的也是从没有接触过的pox,不过总体而言,基础题并不难,属于验证型的实验,只要跟着文件中的步骤一步一步做即可,稍微比较难的是进阶题,因为要我们自己编写代码,刚开始的时候确实有点懵,不知道该怎么写,pox文档又是一个纯英文的文档,看起来比较难受,所以花费的时间稍微长一些。
2.实验过程遇到的困难:实验中遇到的困难就是在进阶题的实现上,看pox文档的难度比较大,以及对于一些概念和函数的理解有一定的困难。
解决办法:在开始看pox文档遇到一定的困难和瓶颈后,我换了一个方向,从hub模块和l2_learning模块的代码入手,先理解其中的函数,以及逻辑思路。然后再一步步从pox文档中学习,遇到不理解的就上百度搜寻,或是询问身边的同学。
3.个人感想:本次实验的难度比前几次要明显的大了不少,也用到了pox。在此次实验中,我学到了如何通过pox去下发流表,也学到了hub模块与l2_learning模块的作用,使用Hub时,h1 ping h2时h2和h3都能收到报文,h1 ping h3时亦是如此,说明Hub模块在每个交换机上安装洪泛通配符规则,广播转发数据包。而使用Switch时,h1 ping h2时,只有h2可以收到报文,说明Switch模块让Openflow交换机实现了L2自学习,只有目的主机可以抓取到报文。也对于自定义pox模块有一定的了解了。