实验3:OpenFlow协议分析实践

实验3:OpenFlow协议分析实践

一、实验目的

  1. 能够运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
  2. 能够借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制。

二、实验环境

Ubuntu 20.04 Desktop amd64

三、实验要求

(一)基本要求

  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
  1. 查看抓包结果,分析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端口 

  1. 回答问题:交换机与控制器建立通信时是使用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头文件中查询到。 经过本次的练习,让我对抓包有了进一步的理解。

 

posted @   三维世界是个球  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示