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

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

forwarding.hub模块

h1 ping h2时,h3处同样收到icmp报文

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

h1 ping h3时,h2处同样收到icmp报文

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

由于hub模块采用洪泛转发,所以在ping特定主机时,交换机会向所有端口洪泛转发,故可以在另一台主机处也会收到icmp报文。

forwarding.l2_learning

h1 ping h2时,h2处收到icmp报文,h3处则没有

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

h1 ping h3时,h3处收到icmp报文,h2处则没有

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

可以看到,交换机对进来的包进行了学习,所以从相应的端口发出,故只有目的主机可以抓取到报文

L2_learning模块程序流程图

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

进阶要求

创建拓扑,并删除流表,使得所有主机无法ping通

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

创建文件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

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

看到流表下发成功,以及所有节点ping通,没有出现丢包

总结

本次作业难度较以往提升,一个是需要学习POX控制器,另外是需要对流表有一定的熟悉。本次实验遇到了两个难题,如下:

  • 在使用POX组件进行流表下发时,发现无法下发流表,询问同学之后了解到在生成拓扑时,需要指定openflow协议为1.0,才可以成功下发流表,但是一开始使用miniedit进行拓扑搭建时,又遇到POX端口冲突的情况。
  • 在编写代码进行流表下发时,按照老师pdf的通过匹配目的IP,进行流表下发,但是之后遇到问题,拓扑还是无法ping通。怀疑问题在于arp报文没有洪泛转发,但是不了解如何进行流表下发,使得arp报文可以进行洪泛转发。最后直接编写代码,分别将交换机三个端口输入的包向其他两个端口发送出去,使得拓扑可以ping通。

经过本次实验,发现自己对于流表的了解还不够,之后还需再多阅读相关材料,进行学习。

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


下一篇:实验3:OpenFlow协议分析实践