一、实验目的

  1. 能够理解 POX 控制器的工作原理;
  2. 通过验证POX的forwarding.hub和forwarding.l2_learning模块,初步掌握POX控制器的使用方法;
  3. 能够运用 POX控制器编写自定义网络应用程序,进一步熟悉POX控制器流表下发的方法。

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox 或 VMware;
  2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64;

三、实验要求
(一)基本要求

  1. 搭建下图所示SDN拓扑,协议使用Open Flow 1.0,控制器使用部署于本地的POX(默认监听6633端口)
  • 使用如下命令搭建拓扑
sudo mn --topo=single,3 --mac --controller=remote,ip=127.0.0.1,port=6633 --switch ovsk,protocols=OpenFlow10
  1. 阅读Hub模块代码,使用 tcpdump 验证Hub模块;
    1.打开POX,Hub 模块./pox.py log.level --DEBUG forwarding.hub
    2.在mininet输入代码mininet> xterm h2 h3,开启终端
    3.分别在主机h2,h3输入tcpdump -nn -i h2-eth0tcpdump -nn -i h3-eth0
  • h1 ping h2

  • h2 ping h3

  • 又上述过程可见,主机h1 ping h2 和 h1 ping h3时,无论哪种操作,主机h2 和 h3 均能收到数据包,因此可以验证Hub 模块的功能:Hub 模块进行转发时是采用的洪泛式,无论ping 哪个主机,都会向所有端口进行转发,因而每个主机都能收到数据包

  1. 阅读L2_learning模块代码,画出程序流程图,使用 tcpdump 验证Switch模块。
  • 流程图

  • 使用tcpdump验证Switch模块

  1. 关闭Hub模块后输入./pox.py log.level --DEBUG forwarding.l2_learning打开L2_learning模块
  2. 验证
  • h1 ping h2

  • h1 ping h3

  • 根据上述过程可知,使用swith模块时,当h1 ping 一台主机的时候,只有被ping的主机才会收到数据包,而其他主机不会收到数据包,交换机通过自学习,会将相应的数据包从特定的端口发出

(二)进阶要求

  • 重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
  • 重新搭建拓扑,发现主机ping不通

*编写Python程序自定义一个POX模块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.idle_timeout=0
        msg.match.in_port = 1            # 数据包进入端口1
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))   # 从端口2,3转发
        event.connection.send(msg)
        
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.idle_timeout=0
        msg.match.in_port = 2            # 数据包进入端口2
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))   # 从端口1,3转发
        event.connection.send(msg)
        
        msg = of.ofp_flow_mod()
        msg.priority = 1
        msg.idle_timeout=0
        msg.match.in_port = 3             # 数据包进入端口3
        msg.actions.append(of.ofp_action_output(port = of.OFPP_ALL))  # 从端口1,2转发
        event.connection.send(msg)

def launch ():
	core.registerNew(SendFlowInSingle3)

*进行拓扑验证

四、个人总结

  • 实验难度:较难
  • 遇到的问题及解决办法:
  1. 第一次打开实验文档,翻看pox的文档,居多,而且全都是英文的,人都麻了,通过goole翻译、百度翻译硬着头皮看
  2. 进阶部分建立拓扑的时候,之前的pox进程并没有关闭,当我使用dpctl dump-flows清除拓扑之后,在pingall发现并没有清除拓扑,以为我输入的命令出错了,又重新试了一边,结果还是一样的,但是之后发现pox进程没有关闭,在关闭之后,清除拓扑,pingall发现所有主机ping不同
  3. 尝试在更改打开路径,提示在pox文件下找不到文件

    查找相关资料后发现,pox打开相关模块要在pox的文件下 才会自动搜索路径
  • 个人感想
    通过这次试验了解了pox的使用,以及对于pox中hub的用法进行了实践验证,同时也了解了L2的自学习,通过自学习交换机可以更新地址/端口表,而不需要进行洪泛式数据传播。还有就是发现自己的英语很拉跨,英语翻译软件也有些拉跨,翻译出来的有些东西更本不能看,还是要努力提高英语能力。
posted on 2021-10-13 00:34  北冥有鱼其名为嘉  阅读(144)  评论(0编辑  收藏  举报