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

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

forwarding.hub模块

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

image-20211006180714469

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

image-20211006180748171

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

forwarding.l2_learning

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

image-20211006180859172

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

image-20211006180947859

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

L2_learning模块程序流程图

image-20211008110643643

进阶要求

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

image-20211007132910591

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

image-20211008101855762

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

总结

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

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

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

posted @ 2021-10-08 11:23  骇人的籽  阅读(195)  评论(0编辑  收藏  举报