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

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

第一部分:基本实验

实验步骤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

实验步骤2

  • 步骤内容:阅读Hub模块代码,使用 tcpdump 验证Hub模块;
  • 首先在pox文件目录下开启终端,输入命令:./pox.py log.level --DEBUG forwarding.hub开启hub模块
  • 然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端
  • 在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似
  • 之后就在h1命令行终端中输入相应命令来验证hub模块

执行结果

  • mininet输入命令 h1 ping h2

  • h2 h3抓包结果

  • 由上个抓包结果可知,h2对应10.0.02 h3对于10.0.0.3,因此可以直接在h1命令行终端输入ping 10.0.0.3来代替h1 ping h3

  • h2 h3抓包结果

  • 无论h1 ping h2还是h3,都可以从h2 h3中抓到数据包,因此验证了hub模块的洪泛转发。

实验步骤3

  • 步骤内容:阅读L2_learning模块代码,画出程序流程图,使用 tcpdump 验证Switch模块。
  • 流程图如下
  • 首先在pox文件目录下开启终端,输入命令:./pox.py log.level --DEBUG forwarding.l2_learning开启switch模块
  • 然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端
  • 在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似
  • 之后就在h1命令行终端中输入相应命令来验证switch模块

执行结果

  • h1命令行终端输入ping 10.0.0.2
  • 抓取h2 h3eth0端口的数据包
  • h1命令行终端输入ping 10.0.0.3
  • 抓包结果
  • 当h1 ping h2时候只有h2有接收到数据包,而当h1 ping h3时候也同样只有h3能接收到数据包,因此验证了switch模块的自学习功能
    数据包只会发送给相应的主机

第二部分:进阶实验

实验步骤1

  • 步骤内容:重新搭建(一)的拓扑,此时交换机内无流表规则,拓扑内主机互不相通;
  • 在mininet命令行中输入命令:dpctl del-flows 删除s1的流表
  • 删除流表后,所有主机相互不连通了

实验步骤2

  • 步骤内容:编写Python程序自定义一个POX模块SendFlowInSingle3,并且将拓扑连接至SendFlowInSingle3(默认端口6633),实现向s1发送流表规则使得所有主机两两互通。
  • 编写自定义一个POX模块SendFlowInSingle3,并命名为mok.py,并保存到lab5文件夹内
from pox.core import core
import pox.openflow.libopenflow_01 as of
from pox.openflow.of_json import *
from pox.lib.addresses import IPAddr

log = core.getLogger()

class SendFlowInSingle3(object):
    def __init__(self):
    	core.openflow.addListeners(self)

    def _handle_ConnectionUp(self, 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)
        log.debug("Connection %s" % (event.connection,))

        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)
        log.debug("Connection %s" % (event.connection,))

        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)
        log.debug("Connection %s" % (event.connection,))


def launch():
    core.registerNew(SendFlowInSingle3)
  • 在lab5文件目录下打开终端,输入以下命令

  • 将lab5中中的mok.py文件复制到pox文件夹内

  • 首先在pox文件目录下开启终端,输入命令:./pox.py mok开启mok模块

  • 然后再mininet命令行中输入命令xterm h1 h2 h3开启h1 h2 h3的命令行终端

  • 在h2命令行终端输入命令:tcpdump -nn -i h2-eth0开启h2抓包(抓取eth0端口)、h3类似

  • 之后就在h1命令行终端中输入相应命令来验证mok模块

执行结果

  • 对h2 h3的eth0端口进行抓包

  • 可知h1与h2 h3再次连通
  • 通过pingall可知主机间全部再次连通起来

第三部分:反思与总结

实验难度

  • 较难

实验过程遇到的困难及解决方法

  • 首先是在进行抓包时候,忘记先用tcpdump -nn -i h?-eth0的命令开启抓包,导致未能出现抓包信息,刚开始以为
    是自己前面的命令行输入错误,或者开启hub模块方式不对,结果重试几次还是不行,然后查看了pdf的验证方法,才发现
    自己没有输入该命令,有被自己蠢到。
  • 其次就是画流程图时候,对于代码的理解十分困难,在此摆烂了,参考了前人的流程图,对照着代码理解了一下。
  • 然后就是在清除流表之后,发现pingall了以后主机间还是相互连通,想起了之前的理论知识,流表具有存活性,因此需要
    重启一下虚拟机,才能成功。
  • 还有就是代码编写完后无法将其直接保存到pox的文件夹内,联想到之前想把jdk-8u301-linux-x64.tar.gz的安装包直接
    保存到/usr/local/java目录下也一样不行的问题,仿照上次做法,利用pc命令就成功了。

个人感想

  • 通过本次实验,使我对pox的使用有了初步的认识与掌握,对hub模块的洪泛转发功能已及switch模块的自学习功能有了验证性的
    认识,相信后面对二者的使用会更加灵活。也初步了体验了主机的命令行终端下抓包的效果,很神奇,对复制文件的命令也更加牢固了
    真的很好用。
posted @ 2021-10-09 10:39  运动ing的美食探险家  阅读(213)  评论(0编辑  收藏  举报