实验3:OpenFlow协议分析实践

一、实验目的

  1. 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
  2. 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。

二、实验环境

  1. 下载虚拟机软件Oracle VisualBox;
  2. 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;

三、实验要求

(一)基本要求

  1. 搭建下图所示拓扑,完成相关 IP 配置,并实现主机与主机之间的 IP 通信。用抓包软件获取控制器与交换机之间的通信数据包。

    拓扑图:

    导出的文件代码:
#!/usr/bin/env python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='192.168.0.0/24')

    info( '*** Adding controller\n' )
    c0=net.addController(name='c0',
                      controller=Controller,
                      protocol='tcp',
                      port=6633)

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch)

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='192.168.0.101/24', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.0.102/24', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='192.168.0.103/24', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='192.168.0.104/24', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(h1, s1)
    net.addLink(h2, s1)
    net.addLink(s1, s2)
    net.addLink(s2, h3)
    net.addLink(s2, h4)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])

    info( '*** Post configure switches and hosts\n')

    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()
  1. 查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图。
  • HELLO
    控制器openflow版本为1.0,交换机的openFire版本为1.5,过滤出双方所能接受的最小版本,即1.0
    控制器和交换器互发HELLO报文,建立连接
    控制器给交换机:

    交换机给控制器:

  • Features Request

  • Features Reply

  • Set Config

  • Port_Status

  • Packet_in

  • Packet_out

  • Flow_mod

交互图:

  1. 回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
    从抓包的结果可以看出使用的是TCP通信协议

(二)进阶要求

  1. 将抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。
  • Hello

  • Features Request

    格式与上述ofp_header结构体中数据相同

  • Features Reply

  • Set Config

  • Port_Status

  • Packet_in

  • Packet_out

  • Flow_mod

(三)个人总结

  • 实验难度:实验难度比较简单,有了上一次使用抓包工具的经验,所以这次抓包较为顺利,而且也没有出现新的命令需要去了解,这一次的实验基本上没出什么太大问题。

  • 遇到的问题:

    1. 在抓包时内容太多了,找到想要的目标费了很大的劲,不过在仔细阅读了一遍PDF后知道可以进行过滤来进行搜索使得更容易找到想要的目标。
    2. 在抓包时一开始找不到OFTP_FLOW_MOD,可能是抓包的时间过于早了吧,后来重新pingall了一下才有。
  • 个人感想:
    通过这次实验对OpenFlow的机制有了更深的了解,并且对于抓包更加熟练以及能够对抓包内容进行分析。并且通过实验了解到交换机与控制器之间的传输协议是TCP协议。在做进阶要求的时候因为要阅读源码,openflow.h文件有几乎一千行的代码,读起来真的很痛苦,不过也算锻炼了阅读源码的能力吧,比较有收获。

posted @ 2021-09-23 18:04  ZbShi  阅读(80)  评论(0编辑  收藏  举报