实验3:OpenFlow协议分析实践

一、实验目的:

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

二、实验环境

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

三、实验要求

(一)基本要求

  1. 搭建下图所示拓扑,完成相关 IP 配置,并实现主机与主机之间的 IP 通信。用抓包软件获取控制器与交换机之间的通信数据包。
主机 IP地址
h1 192.168.0.101/24
h2 192.168.0.102/24
h3 192.168.0.103/24
h4 192.168.0.104/24

拓扑文件:

#!/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.1/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', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.0.102', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='192.168.0.103', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='192.168.0.104', defaultRoute=None)

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

    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
    控制器和交换器互发HELLO报文,过滤出双方所能接受的最小版本,建立连接

  • Features Request
    控制器请求交换机的特征信息

  • Set Config
    控制器告诉交换机:请按照我给你的flag和max bytes of packet进行配置

  • Port_Status
    当交换机端口发生变化时,告知控制器相应的端口状态。

  • Features Reply
    交换机把特征信息告诉控制器。

  • Packet_in
    有数据进入交换机,交换机请求控制器指示。

  • Flow_mod:
    控制器通过6633端口向交换机端口下发流表项,指导数据的转发处理。

  • Packet_out
    控制器告诉交换机:请按照我给你的action进行处理。

  • 交互图:

  1. 回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
    是TCP。抓包中可见。

四、实验总结

本次实验让我更加熟悉了wireshark的抓包操作与分析,学会过滤抓包内容,了解了OpenFlow协议交互的过程,交换机与控制器间的传输协议是TCP。一开始不太清楚“发送IP数据”要怎么做,运行完拓扑程序才打开wireshark,只能捕获到“OFPT_ECHO_REQUEST”和“OFPT_ECHO_REPLY”,还尝试了h1 ping h2,捕获内容多了“OFPT_PACKAGE_IN”、“OFPT_PACKAGE_OUT”和“OFPT_FLOW_MOD”。后来先开启wireshark再运行拓扑程序,其它交互都能捕获到但又差了个“OFPT_FLOW_MOD”,最后才知道要在拓扑程序中输入“pingall”,于是又重新开了一遍。相对于前面两个实验还是比较顺利的,对OPenFlow更加了解了。

posted @ 2021-09-23 21:16  呜哩哇啦*  阅读(20)  评论(0编辑  收藏  举报