实验3:OpenFlow协议分析实践

(一)、实验要求

  • 搭建下图所示拓扑,完成相关 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(s1, h2)
    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()

(二)、控制器交换机信息交互流程图如下


图片替换文本

(三)、信息交换过程截图与分析

  • HELLO报文
    (1.)控制器openflow版本为1.0,交换机的openFire版本为1.5,过滤出双方所能接受的最小版本,即1.0
    (2.)控制器和交换器互发HELLO报文,建立连接


//控制器向交换价发送HELLO


//交换机向控制器发送HELLO报文


  • SET_CONFIG
    控制器向交换机发送发送SET_CONFIG消息以发送设置信息


    //控制器向交换机发送发送SET_CONFIG消息以发送设置信息


  • FEATURES_REQUEST


    //控制器向交换机发送FEATURES_REQUEST请求获取交换机的信息

  • FEATURES_REPLY


    //交换机收到控制器发来的FEATURES_REQUEST发送FEATURES_REPLY,将自己的信息发送至控制器

  • PORT_STATUS


//当交换机端口改变时,交换机发送port_status报文告知控制器其更新后的端口状态。


  • PACKET_IN
    对应着两种情况:(1)交换机查找流表,发现没有匹配条目时(2)有匹配条目但是对应的action时output=controller


    // 交换机给控制器发送packet_in报文,分析原因是交换机发现自己没有匹配的流表(reason:no matching flow)


  • PACKET_OUT
    PACKET_OUT是从控制器发向交换机引导其完成对应action的包


    //控制器要求交换机输出到65531端口


  • FLOW_MOD
    控制器通过向交换机发送FLOW_MOD,来对交换机下发流表项,维护流表的更新,指导数据的转发处理。

(四)、回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?

答:从抓包内容中可以看出采用的协议是TCP协议

(五)、进阶要求

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

  • HELLO
    图片替换文本
图片替换文本
  • ofp_packet_in
    图片替换文本
    图片替换文本



  • ofp_packet_out
    图片替换文本
    图片替换文本



  • ofp_flow_mod
    图片替换文本
    图片替换文本


  • FEATURES_REQUEST

    //通过抓包截图,可以看出其源码和HELLO一致。

  • ofp_switch_feature -reply
    图片替换文本
    图片替换文本
    图片替换文本



  • oft_port_status
    图片替换文本
    图片替换文本


  • set_config
    图片替换文本
    图片替换文本


(六)、个人总结

  • 遇到的难题
    本次实验较为简单和顺利,主要问题是不理解openfire协议,经过老师讲解和上网查询相关资料后才明白该协议,从而明白了本次实验的缘由。其次是源码的查找和阅读花费了大头时间,不过看到wireshark抓包显示的内容与源码匹配上了,心里还是大喜明白实验有所收获

  • 实验总结
    本次实验主要集中要抓包,抓包内容分析,源码查找和分析。在分析抓到的包内容时,我想起了很多计算机网络的知识,特别是tcp/ip协议中的三次握手协议,不乏与openfire协议相似。openfire协议与对方建立联系首先发送“hello”报文,相当于询问对方“你在吗”,对方收到“hello”回复一个ack确认以及一个“hello”报文,相当于回复了我收到你的询问,并且发出“我在”的信息。然后建立了联系以后就可以request请求和reply回应,以及status,config告知和修改等等。同时加深了linux终端的使用,如vim编辑器下面查找匹配的源码可以用:/(string)灵活查找,用n来切换匹配到的字符串。

posted @ 2021-09-23 12:17  朝如青丝暮成雪6  阅读(107)  评论(0编辑  收藏  举报