实验5:开源控制器实践POX
一、基础实验
建立拓扑:
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
运行Hub模板:
./pox.py log.level --DEBUG forwarding.hub
开启主机终端:
mininet> xterm h2 h3
在h2 /h3 主机终端输入:
tcpdump -nn -i h2/h3-eth0
1、h1 ping h2,h2和h3的tcpdump抓包结果截图:
2、h1 ping h3,h2和h3的tcpdump抓包结果截图:
3、L2_learning模块代码流程图:
4、使用 tcpdump 验证Switch模块
运行L2_learning模块:./pox.py log.level --DEBUG forwarding.l2_learning
h1 ping h2(h3没有收到数据包):
h1 ping h3(h2没有收到数据包):
二、进阶要求
重新建立拓扑,用dpctl del-flows命令删除流表,如下图。
将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。 ( ./pox.py log.level --DEBUG 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):
msg = of.ofp_flow_mod() # 使用ofp_flow_mod()方法向交换机下发流表
msg.priority = 1
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() # 使用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() # 使用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)
三、心得体会
本次实验难度挺大的
一开始我不清楚怎么打开POX,在询问了同学之后才逐渐明白操作的过程。而后也和室友一样遇到了删除流表不起作用的问题,重启之后也能顺利的解决。
在进阶部分,没注意老师的文档在./pox.py log.level --DEBUG调用文件的时候加上了.py,自己摸索了挺久的,后面还是问了问同学才解决问题。
最后的时候,我的进阶1的代码一直出现问题,问了老师,老师看了很久,才发现我的这台虚拟机和别人有些不同,POX的6633端口在关闭后仍然会继续运行,要kill进程才能有效进行下去。
总而言之,这次试验我基本是边问边做的,还是有很多的不足之处,有待进步。