openflow packet_out和packet_in分析
任务目的
1、 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式。
2、 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式。
实验原理
Packet-In
使用Packet-In消息的目的是为了将到达OpenFlow交换机的数据包发送至OpenFlow控制器。以下2种情况即可发送Packet-In消息。
不存在与流表项一致的项目时(Table-miss),OFPR_NO_MATCH
匹配的流表项中记载的行动为“发送至OpenFlow控制器”时,OFPR_ACTION
发送Packet-In消息时OpenFlow交换机分为两种情况,一种是缓存数据包,一种是不缓存数据包。如果不通过OpenFlow交换机缓存数据包,那么Packet-In消息的buffer_id字段设置为-1,将整个数据包发送至OpenFlow控制器。
如果通过OpenFlow交换机缓存数据包,那么以通过SET_CONFIG消息设置的miss_send_len为最大值的数据包数据将发送至OpenFlow控制器。
miss_send_len的默认值为128。未实施SET_CONFIG消息的交换时,使用该默认值。
字段 | 比特数 | 内容 |
buffer_id | 32 | 表示OpenFlow交换机中保存的数据包的缓存id |
Total_len | 16 | 帧的长度 |
in_port | 16 | 接受帧的端口 |
reason | 8 | 发送Packet-in消息的原因 |
pad | 8 | 用于调整对齐的填充 |
data | 任意 | 包含以太网帧的数据时使用的字段。 |
Packet-Out
Packet-Out消息是从OpenFlow控制器向OpenFlow交换机发送的消息,是包含数据包发送命令的消息”。
若OpenFlow交换机的缓存中已存在数据包,而OpenFlow控制器发出“发送该数据包”的命令时,该消息指定了表示相应数据包的buffer_id。使用Packet-Out消息还可将OpenFlow控制器创建的数据包发送至OpenFlow交换机。此时,buffer_id置为-1,在Packet-Out消息的最后添加数据包数据。
字段 | 比特数 | 内容 |
buffer_id | 32 | 表示OpenFlow交换机中保存的数据包的缓存id |
in_port | 16 | 数据包的输入端口 |
actions_len | 16 | 行动信息的长度 |
制器与OpenFlow交换机在连接建立过程中会存在拓扑发现的环节,该环节会密集出现Packe-in/out消息,其交互流程如下:
1、 SDN控制器通过构造Packet-out消息,向交换机s1的三个端口分别发送上图所示的LLDP数据包。
2、 控制器向交换机s1下发流表,流表规则为:将从Controller端口收到的LLDP数据包从规定端口发送出去。
3、 控制器向交换机s2下发流表,流表规则为:将从非Controller接收到LLDP数据包发送给控制器。
4、 当LLDP数据包到达交换机s2,会触发Packet-in消息发往控制器。控制器通过解析LLDP数据包,得到链路的源交换机,源接口(s1,port1)。通过收到的Packet-in消息知道目的交换机(s2)。
5、 同理,当SDN控制器向交换机s2发送Packet-out消息时,可以得知链路源交换机,源接口(s2,port3)。通过收到的Packet-in消息知道目的交换机(s1)。如此,控制器便发现了s1与s2之间的完整链路。
对于存在多个交换机的网络,上述分析过程一样成立。
实验步骤
步骤 1
登录控制器,切换至root用户。输入如下命令,启动RYU相关应用。
ryu-manager --verbose --observe-links ryu.topology.switches ryu.app.rest_topology ryu.app.ofctl_rest ryu.app.simple_switch_13
步骤 2
再打开新的命令窗口,切换到root用户。执行wireshark命令启动Wireshark,抓包enp0s17
步骤 3
登录Mininet所在的主机,切换至root用户。执行命令mn —controller=remote,ip=30.0.1.3, port=6633 —switch=ovsk,protocols=OpenFlow13 —topo=linear,2
,如下图所示。
步骤 4
执行命令links
步骤 5
登录控制器,停止Wireshark,观察数据包列表,可以看出控制器与交换机的基本交互流程。
Packet in/out消息详解
步骤1 登录Mininet所在的主机,查看交换机s1的流表信息(s2同理):
ovs-ofctl dump-flows -O OpenFlow13 s1
root@mininet:~# ovs-ofctl dump-flows -O OpenFlow13 s1
cookie=0x0, duration=495.916s, table=0, n_packets=552, n_bytes=33120, priority=65535,dl_dst=01:80:c2:00:00:0e,dl_type=0x88cc actions=CONTROLLER:65535
cookie=0x0, duration=495.923s, table=0, n_packets=50, n_bytes=4923, priority=0 actions=CONTROLLER:65535
红色标记的流表项中:dl_type=0x88cc
表示LLD
P帧,dl_dst=01:80:c2:00:00:0e
表示目的MAC地址为局域网组播地址,actions=CONTROLLER:65535
表示行动为发往控制器的65535端口,意味着输入到交换机中的LLDP组播帧都会发送到控制器。
步骤2 在控制器Wireshark抓取的数据包中,寻找包含LLDP包的Packet-out消息并双击,详细信息展示如下。
可以看出,该控制器与OpenFlow交换机协商的OpenFlow版本为1.3版本,消息类型为Packet-out
。由红色标记部分信息可以看出Packet-out消息中包含LLDP帧,动作为从交换机的端口2发出,以此来检测网络拓扑结构。
步骤3 在控制器Wireshark抓取的数据包中,寻找包含LLDP包的Packet-in消息并双击,详细信息展示如下。
当LLDP
帧被发送至相邻的交换机后,与事先设置好的流表项进行匹配(红色标记表示Packet-in
消息触发原因为:匹配的流表项的行动为“发往控制器”),通过Packet-in
消息封装LLDP帧,把消息发送到控制器。
步骤4 在控制器中重启Wireshark,准备抓取Packet-in消息。
步骤5 在Mininet主机中,删除交换机s1的流表,同时快速进行Ping操作。
$ sh ovs-ofctl del-flows s1 -O OpenFlow13
$ sh ovs-ofctl dump-flows s1 -O OpenFlow13
$ h1 ping h2
步骤6 在控制器中查看Wireshark,添加过滤条件icmp,寻找触发原因为“OFPR_NO_MATCH”的Packet-in消息并双击。该消息的详细情况如下。
由于OpenFlow交换机中不存在流表项,故发送到OpenFlow交换机的ICMP
包无法匹配流表,只好封装并上传到控制器。红色标记表明该Packet-in
消息触发原因为:不存在匹配的流表项(OFPR_NO_MATCH)。
openflow packet_out和packet_in分析的更多相关文章
- SDN学习之OpenFlow协议分析
学习SDN相关的学习也已经有快半年了,期间从一无所知到懵懵懂懂,再到现在的有所熟悉,经历了许多,也走了不少弯路,其中,最为忌讳的便是,我在学习过程中,尚未搞明白OpenFlow协议的情况下,便开始对S ...
- 可编程数据平面将OpenFlow扩展至电信级应用(二)
可编程数据平面将OpenFlow扩展至电信级应用(二) 案例:基于WinPath网络处理器的电信极OpenFlow (CG-OF)client实现 作者:Liviu Pinchas, Tao Lang ...
- 软件定义网络基础---OpenFlow协议
一:OpenFlow协议概述 OpenFlow协议为控制器与交换机之间的通信,提供了一种开放标准的方式.OpenFlow交换机通过安全通道与控制器进行信息交互 二:OpenFlow消息类型 (一)co ...
- SDN实验---Ryu的应用开发(一)Hub实现
补充: (一)Ubuntu下安装Notepadqq 背景:为什么安装Notepadqq Notepad++ 不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的外挂模组.但是可惜的是N ...
- 实战录 | 基于openflow协议的抓包分析
<实战录>导语 云端卫士<实战录>栏目定期会向粉丝朋友们分享一些在开发运维中的经验和技巧,希望对于关注我们的朋友有所裨益.本期分享人为云端卫士安全SDN工程师宋飞虎,将带来基于 ...
- OpenFlow协议1.0及1.3版本分析
OpenFlow是SDN控制器和交换之间交流的协议,在SDN领域有着十分重要的地位. OpenFlow协议发展到现在已经经过了1.0.1.3.1.4等版本.其中1.0和1.3版本使用的是最为广泛的. ...
- 利用Wireshark抓取并分析OpenFlow协议报文
OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...
- OpenFlow协议分析
OpenFlow协议分析实验手册 启动虚拟机mininet 和 控制器 ODL 启动wireshark,在控制器的ens32 网卡抓包 使用mininet创建简单拓扑,并连接控制器,指定交换机为ovs ...
- Ryu控制器编程开发——packet_in和packet_out简易交换机实现
Ryu控制器二次开发,实现一个简单的只能够简单地广播数据包的交换机. from ryu.base import app_manager from ryu.controller import ofp_e ...
随机推荐
- 【译】最大限度地降低多线程 C# 代码的复杂性
分支或多线程编程是编程时最难最对的事情之一.这是由于它们的并行性质所致,即要求采用与使用单线程的线性编程完全不同的思维模式.对于这个问题,恰当类比就是抛接杂耍表演者,必须在空中抛接多个球,而不要让它们 ...
- 桥接模式 桥梁模式 bridge 结构型 设计模式(十二)
桥接模式Bridge Bridge 意为桥梁,桥接模式的作用就像桥梁一样,用于把两件事物连接起来 意图 将抽象部分与他的实现部分进行分离,使得他们都可以独立的发展. 意图解析 依赖倒置原 ...
- 05 入门 - 浅谈 ASP.NET MVC程序的工作原理
目录索引:<ASP.NET MVC 5 高级编程>学习笔记 本篇内容 1. Global.asax文件 2. RouteConfig.cs文件 3. 视图命名和寻址的规则 前面创建了一个简 ...
- selenium+python自动化测试系列---基础知识篇(1、HTML基础知识1)
1.什么是HTML HTML是一种描述网页的语言.HTML指超文本标记语言(Hyper Text Markup Language),它不是一种编程语言,而是一种标记语言(markup language ...
- 1.4 GPU分析
shader 加宏 编译说明glsl
- EclipseAndroid打包签名发布安装失败闪退运行不了
EclipseAndroid打包签名发布安装失败闪退运行不了 本来没怎么用过用Eclipse写安卓,可是有人有需要必须用Eclipse写,那就写呗. 可在签名打包的时候,发到手机上安装,提示安装成功. ...
- c/c++ 继承与多态 文本查询的小例子(非智能指针版本)
问题:在上一篇继承与多态 文本查询的小例子(智能指针版本)在Query类里使用的是智能指针,只把智能指针换成普通的指针,并不添加拷贝构造方法,会发生什么呢? 执行时,代码崩掉. 分析下面一行代码: Q ...
- WPF软件开发系统之六——药品管理查询系统
本系统使用.Net WPF开发,运行于Windows操作系统,电脑或者触摸屏设备. 功能主要是药品按照各类条件检索及展示. 开发环境及工具: 首页: 按关键字查询: 按功效查询: 还有其它按拼音.按笔 ...
- objective-c高级编程 笔记
引用计数:通过给对象计数标志,来判断是否释放对象 注:只能释放自己持有的对象 id obj = [NSMutableArray array] 如obj这个对象,并不是你所持有的对象,所以你无法进行释放 ...
- Git + Docker + Jenkins自动化部署web到Linux(Centos)
1.把代码托管到Github上 2.安装Docker 3.安装Jenkins 4.在项目中编写Dockerfile.publish.sh (1)Dockerfile内容 # 基于dotnet基础环境构 ...