实验5:开源控制器实践——POX
forwarding.hub模块
h1 ping h2
时,h3处同样收到icmp报文
h1 ping h3
时,h2处同样收到icmp报文
由于hub模块采用洪泛转发,所以在ping特定主机时,交换机会向所有端口洪泛转发,故可以在另一台主机处也会收到icmp报文。
forwarding.l2_learning
h1 ping h2
时,h2处收到icmp报文,h3处则没有
h1 ping h3
时,h3处收到icmp报文,h2处则没有
可以看到,交换机对进来的包进行了学习,所以从相应的端口发出,故只有目的主机可以抓取到报文
L2_learning模块程序流程图
进阶要求
创建拓扑,并删除流表,使得所有主机无法ping通
创建文件SendFlowInSingle3.py
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.openflow.of_json import *
def _handle_ConnectionUp(event):
msg = of.ofp_flow_mod()
msg.priority = 1
msg.match.in_port = 1
msg.actions.append(of.ofp_action_output(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 = 2
msg.actions.append(of.ofp_action_output(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 = 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.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
命令行输入./pox.py SendFlowInSingle3
查看流表,并测试pingall
看到流表下发成功,以及所有节点ping通,没有出现丢包
总结
本次作业难度较以往提升,一个是需要学习POX控制器,另外是需要对流表有一定的熟悉。本次实验遇到了两个难题,如下:
- 在使用POX组件进行流表下发时,发现无法下发流表,询问同学之后了解到在生成拓扑时,需要指定openflow协议为1.0,才可以成功下发流表,但是一开始使用miniedit进行拓扑搭建时,又遇到POX端口冲突的情况。
- 在编写代码进行流表下发时,按照老师pdf的通过匹配目的IP,进行流表下发,但是之后遇到问题,拓扑还是无法ping通。怀疑问题在于arp报文没有洪泛转发,但是不了解如何进行流表下发,使得arp报文可以进行洪泛转发。最后直接编写代码,分别将交换机三个端口输入的包向其他两个端口发送出去,使得拓扑可以ping通。
经过本次实验,发现自己对于流表的了解还不够,之后还需再多阅读相关材料,进行学习。