实验3:OpenFlow协议分析实践
实验3:OpenFlow协议分析实践
一、实验目的
- 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
- 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。
二、实验环境
Ubuntu 20.04 Desktop amd64
三、实验要求
(一)基本要求
- 搭建下图所示拓扑,完成相关 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协议中交换机与控制器的消息交互过程,画出相关交互图或流程图。
1 #!/usr/bin/env python 2 3 from mininet.net import Mininet 4 from mininet.node import Controller, RemoteController, OVSController 5 from mininet.node import CPULimitedHost, Host, Node 6 from mininet.node import OVSKernelSwitch, UserSwitch 7 from mininet.node import IVSSwitch 8 from mininet.cli import CLI 9 from mininet.log import setLogLevel, info 10 from mininet.link import TCLink, Intf 11 from subprocess import call 12 13 def myNetwork(): 14 15 net = Mininet( topo=None, 16 build=False, 17 ipBase='10.0.0.0/8') 18 19 info( '*** Adding controller\n' ) 20 c0=net.addController(name='c0', 21 controller=Controller, 22 protocol='tcp', 23 port=6633) 24 25 info( '*** Add switches\n') 26 s2 = net.addSwitch('s2', cls=OVSKernelSwitch) 27 s1 = net.addSwitch('s1', cls=OVSKernelSwitch) 28 29 info( '*** Add hosts\n') 30 h1 = net.addHost('h1', cls=Host, ip='192.168.0.101', defaultRoute=None) 31 h2 = net.addHost('h2', cls=Host, ip='192.168.0.102', defaultRoute=None) 32 h4 = net.addHost('h4', cls=Host, ip='192.168.0.104', defaultRoute=None) 33 h3 = net.addHost('h3', cls=Host, ip='192.168.0.103', defaultRoute=None) 34 35 info( '*** Add links\n') 36 net.addLink(h1, s1) 37 net.addLink(h2, s1) 38 net.addLink(s2, h3) 39 net.addLink(s2, h4) 40 41 info( '*** Starting network\n') 42 net.build() 43 info( '*** Starting controllers\n') 44 for controller in net.controllers: 45 controller.start() 46 47 info( '*** Starting switches\n') 48 net.get('s2').start([c0]) 49 net.get('s1').start([c0]) 50 51 info( '*** Post configure switches and hosts\n') 52 53 CLI(net) 54 net.stop() 55 56 if __name__ == '__main__': 57 setLogLevel( 'info' ) 58 myNetwork()
(1)hello
用来协商控制器和交换机之间使用哪个openflow协议的版本
控制器6633端口(我最高能支持OpenFlow 1.0) ---> 交换机53084端
交换机53084端口(我最高能支持OpenFlow 1.4) ---> 控制器6633端口
(2)Features Request / Set Conig
控制器6633端口(我需要你的特征信息) ---> 交换机53084端口
控制器6633端口 ---> 交换机53084端口
(3)Port_Status
当交换机端口发生变化时,告知控制器相应的端口状态。
(4)Features Reply
交换机53084端口(这是我的特征信息,请查收) ---> 控制器6633端口
(5)Packet_in
交换机53084端口(有数据包进来,请指示)--- 控制器6633端
(6)Flow_mod
分析抓取的flow_mod数据包,控制器通过6633端口向交换机42746端口、交换机42748端口 下发流表项,指导数据的转发处理
(7)Packet_out
控制器6633端口(请按照我给你的action进行处理) ---> 交换机53084端口
- 回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?
交换机与控制器建立通信时是使用TCP协议
(9)OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图
(二)进阶要求
将抓包基础要求第2步的抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。
(1)hello
双方通过握手消息Hello建立安全连接。
(2)Features Request
在建立传输安全会话时,控制器主动向交换机发送Feature_Request消息,请求交换机的特性信息,交换机通过Feature_Reply消息回复所支持的功能特性
(3)Set Config
控制器了解交换机的特性后,对flag和max bytes of packet进行配置。
(4)Port_Status
(5)Features Reply
(6)Packet_in
在交换机不知道怎么转发报文时,会使用parket_in将无法处理的报文封装混发送给控制器,让控制器处理。
交换机发送Packet_in消息给控制器有以下两种情况:
1.数据包在交换机中匹配不到流表,则向controller发送Packet_in消息
2.数据包在流表中有匹配的条目,但是其中所指示的 action 列表中包含转发给控制器的动作(Output = CONTROLLER)
一般将数据包缓存在交换机中,把有效的数据包信息(默认的128字节)和缓存id发送给控制器,不过,如果交换机不支持缓存或者内存用光了,那么就把整个数据包放在数据部分发给控制器,并且缓存id设置为-1。

(7)Flow_mod
Flow-Mod:控制器收到 Packet‐in 消息后,可以发送 Flow‐Mod 消息向交换机下发一个流表项。
Flow_mod这个消息是OpenFlow中最重要的消息,用来添加、删除、修改OpenFlow交换机的流表信息。当交换机收到一个无法处理的数据包,封装到Packet_in消息转发给控制器后,控制器可以发送一个Flow_mod消息下发一个流表到交换机,并且指定该数据包按照此流表项的action处理。
Flow_mod消息包含四个部分:OpenFlow报文头、Flow_mod固定字段、Match字段和Instruction字段。分别用来标识该消息的类型、流表项的内容等。
(8)Packet_out
当控制器希望交换机发送某个数据包,就使用Packet_out消息。例子:arp在广播的时候,在交换机中不能直接将arp广播,而是,将其封装在Packet_out里面,交换机泛洪的是Packet_out。与Flow-Mod不同的是,控制器不会下发流表,而是直接告诉交换机该如何做。
(三)个人总结
通过本次的实验,让我能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包和能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。在实验中,在新建py文件前,需要使用“sudo wireshark”开启wireshark抓包工具后再去新建py,运行时使用sudo python 212106691.py无法执行,需要先使用sudo mn -c命令将之前的拓扑清除干净,还有无法获取OFPT_FLOW_MOD包的原因是要先在mininet中使用pingall命令使交换机发送数据包,再去找包。所述所有数据结构均可在openflow安装目录openflow/include/openflow当中的openflow.h头文件中查询到。 经过本次的练习,让我对抓包有了进一步的理解。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!