openflow1.0协议消息wireshark抓包解析
Posted Itzel_yuki
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openflow1.0协议消息wireshark抓包解析相关的知识,希望对你有一定的参考价值。
Openflow消息类型包括:
enum ofp_type
/* Immutable messages. */
OFPT_HELLO, /* Symmetric message */
OFPT_ERROR, /* Symmetric message */
OFPT_ECHO_REQUEST, /* Symmetric message */
OFPT_ECHO_REPLY, /* Symmetric message */
OFPT_VENDOR, /* Symmetric message */
/* Switch configuration messages. */
OFPT_FEATURES_REQUEST, /* Controller/switch message */
OFPT_FEATURES_REPLY, /* Controller/switch message */
OFPT_GET_CONFIG_REQUEST, /* Controller/switch message */
OFPT_GET_CONFIG_REPLY, /* Controller/switch message */
OFPT_SET_CONFIG, /* Controller/switch message */
/* Asynchronous messages. */
OFPT_PACKET_IN, /* Async message */
OFPT_FLOW_REMOVED, /* Async message */
OFPT_PORT_STATUS, /* Async message */
/* Controller command messages. */
OFPT_PACKET_OUT, /* Controller/switch message */
OFPT_FLOW_MOD, /* Controller/switch message */
OFPT_PORT_MOD, /* Controller/switch message */
/* Statistics messages. */
OFPT_STATS_REQUEST, /* Controller/switch message */
OFPT_STATS_REPLY, /* Controller/switch message */
/* Barrier messages. */
OFPT_BARRIER_REQUEST, /* Controller/switch message */
OFPT_BARRIER_REPLY, /* Controller/switch message */
/* Queue Configuration messages. */
OFPT_QUEUE_GET_CONFIG_REQUEST, /* Controller/switch message */
OFPT_QUEUE_GET_CONFIG_REPLY /* Controller/switch message */
;
1、Hello消息
控制器与交换机建立连接时由其中某一方发起Hello消息,双方协调协议版本号。Hello消息只有of包头,没有主体部分。目的:协议协商。
内容:本方支持的最高版本的协议
成果:使用双方都支持的最低版本协议。
成功:建立连接
失败:OFPT_ERROR (TYPE:OFPT_HELLO_FAILED,CODE =0),终止连接。
(1)sw1向C发送Hello消息
(2)C分别向sw1和sw2回应Hello
上面俩张图显示,交换机支持的openflow版本为1,控制器支持的版本为4(1.3),因此,采用openflow1.0。
2、Feature消息
当sw跟controller完成连接之后,控制器会向交换机下发OFPT_FEATYRES_REQUEST的数据包,目的是请求交换机的信息。发送时间:连接建立完成之后
发送数据:OFPT_FEATURES_REQUEST
对称数据:OFPT_FEATURES_REPLY
目的:获取交换机的信息
OFPT_FEATURES_REQUEST:
TYPE=5
Without data(只有包头,没有数据)
(1)C向sw1、sw2发送feature_request消息
(2)sw1和sw2分别向C应答,发送feature_replay消息
OFPT_FEATURES_REPLY:
TYPE =6
[0:8]为header(version、type、length、xid)
[8:32]长度24byte为sw的features,包含如下:
datapath_id:交换机的标识符,低48位是一个MAC地址,而高16位是自定义的。例如,用高16位代表VLAN ID区别一个物理交换机中的多个虚拟交换机。
n_buffers:一次最多缓存的数据包数量。
n_tables:表示交换机支持的流表数量。而每个流表可以设置不同的通配符和不同数量的流表项。控制器和交换机第一次通信的时候,控制器会从feature_reply消息中找出交换机支持多少流表,如果控制器还想了解大小、类型和流表查询的顺序,就发送一个ofpst_table stats请求,交换机必须按照数据包遍历流表的顺序把这些流表回复给控制器,并且精确匹配流表排在通配流表前。
capabilities:所支持的功能。交换机的一些详细信息的bitmap
Action:交换机支持的action类型的bitmap
[32:]长度与端口数成正比,Of_port_desc list,交换机物理端口信息,,存放port的信息。每一个port信息长度为48byte。
3、Configuration消息
控制器可以发送OFPT_SET_CONFIG / OFPT_GET_CONFIG_REQUEST消息设置/查询交换机配置参数,交换机只需响应OFPT_GET_CONFIG_REQUEST消息即可。(1)控制器分别向sw1、sw2发送config消息
C向sw1发送了set_config+barrier_request+get_config_reauets消息(2)sw1应答,发送barrier_reply消息
barrier_request/reply:保证在它之前的命令都已经被执行。(3)sw1应答,发送get_config_reply消息
Of交换机中需要控制器配置的属性有两个flags和miss_send_len。Flags用来指示交换机如何处理IP分片数据包,上图显示的是OEFC_FRAG_NORMAL,即为当作普通交换机处理;miss_send_len用来只是当一个交换机无法处理数据,将数据上报给控制器时发送的最大字节数。与转发action中的output中定义的max_len字段一致。
4、Stats消息
数据包是为了某些目的而设计的,如OFPT_STATS_REQUEST && REPLY可以获得统计信息,我们可以利用统计信息做的事情就太多了。如:负载平衡, 流量监控等基于流量的操作。OFPT_STATS_REQUEST类型有很多,回复的类型也很多。
Type:
0:请求交换机版本信息,制造商家等信息。
1:单流请求信息
2:多流请求信息
3:流表请求信息
4:端口信息请求
5:队列请求信息
6:vendor请求信息,有时候没有定义。
(1)controller分别向sw1、sw2发送stats_request消息(stats_type=0)
(2)sw1应答,发送stats_reply消息
(3)aggregate_stats_request(stats_type=2)
(4)aggregate_stats_reply
每一种请求信息都会对应一种回复信息。我们只介绍最重要的flow_stats_reply。结构:header(type=17)/reply_header()/flow_stats/wildcards/match/ flow_stats_data
作用:携带流的统计信息,如通过的数据包个数,字节数。
ofp_flow_stats(body[4:8])里面会有的table_id字段表明该流存放在哪一个流表里。
flow_stats_data里面有packet_count和byte_count是最有价值的字段,流量统计就是由这两个字段提供的信息。
如想统计某条流的速率:前后两个reply的字节数相减除以duration_time只差就可以求得速率,由速率我们可以做很多基于流量的app,如流量监控,负载均衡等等。
5、echo消息
分类:对称信息 OFPT_ECHO_REQUEST, OFPT_ECHO_REPLY作用:查询连接状态,确保通信通畅。
当没有其他的数据包进行交换时,controller会定期循环给sw发送OFPT_ECHO_REQUEST。
(1)echo_request
(2)echo_reply
6、Packet_out、Packet_in和flow_mod
注:其中的in和out针对控制器来说的(1)Sw1向c发送packet_in消息
Packet-in事件在以下两种情况下会被触发:1.当交换机收到一个数据包后,并未与流表中匹配成功,那么交换机就会将数据封装在Packer-in消息中,发送给控制器处理。此时数据包会被缓存在交换机中等待处理。
2.交换机流表所指示的action列表中包含转发给控制器的动作(Output=Controller),此时数据不会被缓存在控制器中。
其中:
buffer_id是packet-in消息所携带的数据包在交换机中的缓存ID
Total_len为data段的长度
In_port数据包进入交换机的入端口号
Reason为packet-in事件的产生原因
同时,从reason的消息格式也可以看出触发packet-in的两种情况:OFPR_NO_MATCH和OFPR_ACTION。
(2)C向sw1发送flow_mod(add_flow)消息
Flow-Mod消息用开添加、删除、修改openflow交换机的消息;Flow-Mod消息共有5种类型:ADD、DEKETE、DELETE-STRICT、MODIFY、MODIFY_STRICT。ADD类型消息用来添加一条新的流表项(flow entry)
DELETE类型消息用来删除所有符合一定条件的流表项
DELETE‐STRICT类型消息用来删除某一条指定的流表项
MODIFY类型消息用来修改所有符合一定条件的流表项
MODIFY‐STRICT类型息用来修改某一条指定的流表项
*注意,Flow-Mod消息对应修改的是流表中的流表项(flow entry)而不是整个流表(flow table)。Of1.0协议中并不支持多级流表操作。
上图中:
Match为流表的match域,也就是上文所说的匹配过程中的of_match。
Cookie为控制器定义流表项标识符
Command是flow-mod的类型,可以是ADD、DELETE、DELETE-STRICT、MODIFY、MODIFY-STRCT;
Ldle_timeout是流表项的空闲超时时间;
Hard_timeout是流表项的最大生存时间;
Priority为流表项的优先级,交换优先匹配高优先级的流表项;
Buffer_id为交换机中的缓冲区ID,flow-mod消息可以指定一个缓冲区的ID,该缓冲区的数据包会按照此flow-mod消息的action列处理。如果是手动下发的流,buffer_id应填-1,即0xffff,告诉交换机这个数据包并没有缓存在队列中。
Out_port为删除流表的flow_mod消息提供的额外的匹配参数。
Flags为flow-mod命令的一些标志位,可以用来指示流表删除后是否发送flow-removed消息,添加流表时是否检查流表重复项,添加的流表项是否为应急流表项。
当OFPFF_SEND_FLOW_REM 被设置的时候,表项超时删除会触发一条表项删除的信息。
当OFPFF_CHECK_OVERLAP 被设置的时候,交换机必须检查同优先级的表项之间是否有匹配范围的冲 突。
当OFPFF_EMERG_被设置的时候,交换机将表项当作紧急表项,只有当与控制器连接断的时候才启用。
Actions为action的列表。
(3)C向sw1发送packet_out消息,命令sw1将包发送出去。
除了flow-mod消息可以作为packet-in消息的响应,packet-out也可以作为packet-in消息的响应。在网络中还存在多种数据包,有些类型的数据包出现的数量非常少(如:ARP,ICMP),对于这种出现频率较低的数据包,并没有必要都向交换机添加一条流表项来匹配处理。此时,控制器可以使用packet-out消息,告诉交换机某一个数据包该如何处理。Packet-out的消息格式:
上图中:
buffer_id为交换机中缓存数据的buffer_id(同flow-mod);特别注意的是当buffer_id为”-1”的时候,指定的缓冲区为packet-out消息的data段。
In_port为packet-out消息提供额外的匹配信息,当packet-out的buffer_id=-1,并且action流表中指定了output=TABLE的动作,in_port将作为data段数据包的额外匹配信息进行流表查询。
action_len指定了action列表的长度,用来区分actions和data段Data为一个缓冲区,可以存储一个以太网帧。
Packet-out消息的应用场景:
指定某一个数据包的处理方法
让交换机产生一个数据包并按照action流表处理。
典型应用:链路发现
控制器向一个交换机发送packet-out消息,buffer_id=-1,data段为某种特殊数据包,actions为从交换机的某个端口进行转发,如果发出这个数据包的端口另一端也连接一个openflow交换机,对端的交换机会产生一个packet-in消息将这个特殊的数据包包上交给控制器,从而控制器他侧到一条链路的存在(控制器实现链路发现,就是依靠packet-out消息)。
当控制器断电或者交换机与控制器之间的连接断开,则交换机会寻找备用控制器,当无法找到备用控制器时便会进入紧急模式(交换机初始化时也是在这个模式下),在紧急模式下,交换机默认将所有接受到的数据包丢弃。
参考:http://blog.csdn.net/sherkyoung/article/details/39159601
以上是关于openflow1.0协议消息wireshark抓包解析的主要内容,如果未能解决你的问题,请参考以下文章
WireShark如何抓包,各种协议(HTTPARPICMP)的过滤或分析,用WireShark实现TCP三次握手和四次挥手