OpenFlow协议分析

实验环境:CentOS + OpenDayLight-Carbon + mininet + WireShark
本实验通过wireshark抓包分析openflow1.3协议的各种报文与字段。

抓包

  • 首先安装好实验所需的软件,这里不多赘述,需要的可以点击查看:mininet多方法安装控制器安装

  • 运行控制器(我这里是OpenDayLight),其他的也可以不过需要支持1.3版本的openflow。

  • 打开wireshark进行抓包,网卡直接选择any就行。

  • 使用mininet连接控制器,在mininet里面pingall获得一些报文,然后就可以退出mininet了

  • 现在就能看到wireshark捕获到很多报文,直接停止捕获开始分析。

分析

利用过滤器,输入过滤条件: openflow_v4,v4 表示1.3版本。

然后就能看到传输的openflow协议的报文。
在这里插入图片描述

点击报文即可查看到其中具体的字段,这里以比较有代表性的FLOW_MOD报文为例,其它同理。
各个表项具体的含义见下一部分。

在这里插入图片描述

利用wireshark的流量图功能,选择过滤器过滤之后的结果如下:
可以清晰的看出openflow各个阶段发送到报文(原图较长,只截取了小部分)

概述

OpenFlow 协议支持3种消息类型:Controller-to-Switch(控制器—交换机)、Asynchronous(异步)和Symmetric(对称),每一类消息又有多个子消息类型。

  • 1、 Controller-Switch(控制器—交换机)消息,这类消息由控制器发起。包括Features、Configuration、Modify-State、Read-State、Send-Packet、Barrier等几类消息,用于对OF交换机的管理。
  • 2、 Asynchronous(异步)消息,这类消息用来将网络事件或交换机状态的变化更新到控制器。主要包括4种子类型:Packet-in、Flow-Removed、Port-status和Error消息。
  • 3、 Symmetric(同步)消息与前两类消息有所不同,Symmetric类的消息可由控制器或者OF交换机中的任意一侧发起,这类消息包括以下3种类型:Hello、Echo和Vendor。
    Modify-State消息是OpenFlow消息中最为重要的消息类型,控制器通过Port-mod消息用来管理端口状态,通过Flow-mod消息增删交换机的流表项,考虑到流表在OpenFlow的重要意义,在此针对Flow-mod消息进行详尽分析。
类型作用
HELLO是使用来协商控制器和交换机之间openflow协议的版本号的消息。
FEATURE_REQUEST是控制器用来查询交换机特性消息,如交换机ID,缓冲区数量,端口及端口属性等。
FEATURE_REPLY交换机收到feature_request消息之后会回复feature_reply消息来报告自己的特性。
SET_CONFIG控制器对交换机进行配置的消息。控制器可以配置交换机的 MTU,报文分片处理等能力。
PACKET_IN当交换机遇到不知道如何转发的报文时,使用 Packet_IN 消息将无法处理的报文封装起来发送给控制器,交给控制器去判断处理。并且交换机会将该数据包缓存。
PACKET_OUT控制器可以使用 Packet_Out 消息,告诉交换机某一个数据包如何处理
FLOW_MOD下发流表项。通过 Flow_Mod 消息可以对流表进行添加、删除、变更设置等操作。可以简单理解为一个flow_mod就是就是一个流表项
ECHO_REQUEST & ECHO_REPLY控制器和交换机通过 ECHO_REQUEST 和 ECHO_REPLY 报文保持连接

Flow-mod消息的具体格式,其主要字段含义介绍如下:

字段含义
前4个字段表示OpenFlow消息的通用报头。
wildcard字段表示匹配时12元组的掩码位,被掩盖掉的元组不参加匹配。
从in_port到tp_dst字段表示流表项12元组的信息。
cookie字段在处理数据分组时不会用到,控制器通过该字段来过滤流的统计信息。
command字段表示对流表的操作,包括增加(Add)、删除(Delete)、修改(Modify)等。
idle_time字段表示当这条流表项在这段时间内没有匹配到数据分组,则该流表项失效。
hard_time字段表示自流表项下发后只要过了这段时间即刻失效。
priority字段表示该流表项被处理的优先级,原则上优先级越高,所属的Table号就越小。
buffer_id字段表示对应Packet-in消息的buffer_id。
out_port字段仅在command为Delete或者Delete Strict时有效,表明当某表项不仅匹配了Flow-mod中给出的12元组,且转发动作中指定端口等于该out_port的动作时才予以删除,即对删除操作的一种额外限制。
flags字段该字段为标志位,OpenFlow v1.0中包括3项:OFPFF_SEND_FLOW_REM(流表失效时是否向控制器发送Flow-removed消息),OFPFF_CHECK_OVERLAP(交换机是否检测流表冲突),OFPFF_EMERG(该流表项将被存于Emergency Flow Cache中,仅在交换机处于紧急模式时生效)。
actions字段该字段是个数组,表示要对满足过滤条件的流做的动作列表,actions[0]即代表其中第一个动作。
posted @ 2022-03-05 15:59  Cheney822  阅读(353)  评论(0编辑  收藏  举报