实验3:OpenFlow协议分析实践
一、实验目的
- 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
- 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。
二、实验环境
- 下载虚拟机软件Oracle VisualBox;
- 在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;
三、实验要求
(一)基本要求
- 搭建下图所示拓扑,完成相关 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 |
配置如图:

- 查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图。
具体抓包结果如下:
-
HELLO
控制器6633端口(我最高能支持OpenFlow 1.0) ---> 交换机40066端口
![]()
交换机40066端口(我最高能支持OpenFlow 1.5)---> 控制器6633端口
![]()
-
FEATURES REQUEST
控制器6633端口(我需要你的特征信息) --> 交换机40066端口
![]()
-
SET CONFIG
控制器6633端口(请按照我给你的flag和max bytes of packet进行配置)--> 交换机4066端口
![]()
-
PORT STATUS
交换机端口40066告知控制器6633相应的端口状态
![]()
-
FEATURES REPLY
交换机40066端口(这是我的特征信息,请查收)--- 控制器6633端口
![]()
-
PACKET_IN
交换机40066端口(有数据包进来,请指示)--- 控制器6633端口
![]()
-
PACKET_OUT
控制器6633端口(请按照我给你的action进行处理) ---> 交换机40066端口
![]()
-
FLOW_MOD
分析抓取的flow_mod数据包,控制器通过6633端口向交换机40066端口、交换机40068端口下发流表项,指导数据的转发处理
![]()

- 回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
交换机与控制器建立通信时使用TCP协议(Transmission Control Protocol)。
(二) 进阶要求
将抓包结果对照OpenFlow源码(openflow安装目录openflow/include/openflow当中的openflow.h头文件中),了解OpenFlow主要消息类型对应的数据结构定义。
-
HELLO
![]()
![]()
-
FEATURES_REQUEST
格式与HELLO相同
![]()
-
SET_CONFIG
![]()

-
FEATURES_REPLY
![]()
![]()
![]()
-
PACKET_IN
![]()
![]()
-
PACKET_OUT
![]()
![]()
-
FLOW_MOD
![]()
![]()
![]()
四、个人总结
-
实验难度:
个人感觉技术方面的难度不大,主要难度在于分析抓包结果以得出交互图的过程。 -
实验困难与解决办法:
由于上一次实验使用过 wireshark,所以此次进行拓扑、抓包的过程比较顺利。具体困难较少且琐碎,详情如下:
抓包结果可以用过滤器将 OpenFlow 协议过滤,但不知为什么我输入词条openflow_v4仍然无法过滤抓包信息。导致看的头晕眼花。而后突然发现输入openflow_v4是无法抓包的,大抵都因为这次抓包中不含使用openflow1.3协议的吧。而后改成使用open flow_v4和openflow_v6过滤抓包信息。这也顺利解决了一开始找不到交换机向控制器发的HELLO报文的困难。 -
个人感想:
可以说这次实验通过工具来认知到具体的交互过程与机制,让我对于 OpenFlow 协议有了更为深刻的认知。自己分析一次交互过程时,记好抓包的各种信息的意思以及交换机、控制器的端口号之后,才能理顺条理以图纸方式表述此过程且非常的印象深刻。也顺带着学习了下 Markdown 编辑器怎么画时序图来表述这次的交互图吧。虽然一开始用不来 wireshark 过滤器,导致看 OpenFlow 消息非常麻烦,不过在众多的抓包结果之中,还能看到许多其他类型的信息交互,算是额外学习了。

























浙公网安备 33010602011771号