一、实验目的
1.能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
2.能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。
二、实验环境
1.下载虚拟机软件Oracle VisualBox;
2.在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;
三、实验要求
(一)基本要求
1.搭建下图所示拓扑,完成相关 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 |
- 配置网段
- 配置IP地址
- 保存为py文件
运行sudo wireshark
命令,并选择any
模式进行抓包,开启另一个终端,命令行运行topo.py
文件,运行pingall
。
2.查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图。
- Hello:当连接启动时交换机和控制器会发送Hello交互。
OFPT_HELLO 源端口6633 -> 目的端口46038,从控制器到交换机
交换机46038端口(OpenFlow 1.5)--- 控制器6633端口
- OpenFlow交换机与OpenFlow控制器之间通过TCP三次握手过程建立连接,使用的TCP端口号为6633。
- TCP连接建立后,交换机和控制器就会互相发送hello报文。Hello报文负责在交换机和控制器之间进行版本协商,该报文中OpenFlow数据头的类型值为0。
(2)Features Request:控制器发向交换机的一条OpenFlow 消息,目的是为了获取交换机性能,功能以及一些系统参数。该报文中OpenFlow 数据头的类型值为5。
- 控制器6633端口(OpenFlow 1.0) ---> 交换机46038端口
(3)Features Reply: 由交换机向控制器发送的功能响应(Feature Reply)报文,描述了OpenFlow交换机的详细细节。控制器获得交换机功能信息后,OpenFlow协议相关的特定操作就可以开始了。
- 交换机46038端口(openflow 1.0)--- 控制器6633端口
该报文中OpenFlow 数据头的类型值为6.
(4)Packet_in
- 分析抓取的数据包,可以发现是因为交换机发现此时自己并没有匹配的流表(Reason: No matching flow (table-miss flow entry) (0)),所以要问控制器如何处理
- Packet-in的原因,分两种:
- 0: 无匹配
- 1: 流表中明确提到将数据包发送至控制器
(5)Flow_mod
- 分析抓取的flow_mod数据包,控制器通过6633端口向交换机46038端口、交换机46038端口下发流表项,指导数据的转发处理
(6)Packet_out
- 控制器6633端口(请按照我给你的action进行处理) ---> 交换机41236端口
(7)port_status
(二)进阶要求
1.将抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。
(1)Hello
(2)Features Request
与Hello中的数据格式相同
(3)Set Conig
(4)Port_Status
(5)Features Reply
(6)Packet_in
(7)Flow_mod
(8)Packet_out
三、个人总结
本次实验我们通过抓取数据包、分析数据包学习了OpenFlow协议下控制器和交换机的交互过程。交换机和控制器的交互过程涉及到多个不同用途的数据包,通过wireshark我们捕获所有数据包,后续通过设置过滤规则进行数据包的过滤,查看每一个OpenFlow数据包的源端口、目的端口、类型和相关字段。进阶要求中通过数据包字段和源码的比较让我更进一步了解与掌握了OpenFlow协议。这次实验是验证性实验,实验难度相对会容易些,只需要建立拓扑后在wireshark中操作,就是找包的时候数据比较多,看起来比较累眼睛。通过阅读openflow的源码,能理清楚其中的数据结构,并和实际抓到的包的详细信息对应起来,从而理解openflow协议的数据包交互过程。除此之外,对wireshark中过滤器的使用也有了更深刻的了解,对openflow协议有了更深刻的认识。