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]即代表其中第一个动作。 |