OpenFlow Packet-in\out消息学习

任务目的

1、 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式。
2、 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式。

任务环境
设备名称 软件环境(镜像) 硬件环境
控制器 RYU4.7.0桌面版 CPU:2核 内存:4G 磁盘:20G
主机 Mininet2.2.0桌面版 CPU:1核 内存:2G 磁盘:20G

注:
root用户的用户名/密码为root/root@openlab
openlab用户的用户名/密码为openlab/user@openlab

任务内容

1、 掌握OpenFlow交换机发送Packet-in消息过程及其消息格式。
2、 掌握OpenFlow控制器发送Packet-out消息过程及其消息格式。

实验原理

Packet-in消息的功能是:将到达OpenFlow交换机的数据包发送到控制器。触发Packet-in消息的原因有以下两种:
1、 不存在与流表项一致的项目(OFPR_NO_MATCH)。
2、 匹配的流表项中的行动为“发往控制器”(OFPR_ACTION)。
Packet-in消息格式如下图所示:
OpenFlow Packet-in\out消息学习_第1张图片
各字段具体含义如下表所示:

     
字段 比特数 内容
buffer_id 32 表示OpenFlow交换机中保存的数据包的缓存id
Total_len 16 帧的长度
in_port 16 接受帧的端口
reason 8 发送Packet-in消息的原因
pad 8 用于调整对齐的填充
data 任意 包含以太网帧的数据时使用的字段。

Packet-out消息的功能是:将控制器的相关数据发送到OpenFlow交换机,是包含数据包发送命令的消息。Packet-out消息格式如下图所示:
OpenFlow Packet-in\out消息学习_第2张图片
各字段具体含义如下表所示:

     
字段 比特数 内容
buffer_id 32 表示OpenFlow交换机中保存的数据包的缓存id
in_port 16 数据包的输入端口
actions_len 16 行动信息的长度

结合任务一(OpenFlow建立连接交互流程学习)中学到的知识,控制器与OpenFlow交换机在连接建立过程中会存在拓扑发现的环节,该环节会密集出现Packe-in/out消息,其交互流程如下:
OpenFlow Packet-in\out消息学习_第3张图片
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 登录OpenLab实验平台,选择“实验课程 > SDN > OpenFlow Packet-in\out消息学习”。

说明:当前有正在进行的实验课程时,请单击“结束”,结束课程.

步骤2 创建实验,目前支持两种创建实验的模式,具体如下:

  • 实验模式为“上课模式”时:单击实验名称出现一提示框,单击“进入详情”进入实验详情页面,后台自动创建实验,单击“进入实验“即可。
  • 实验模式为“浏览模式”时,单击实验名称进入实验详情页面,单击“开始实验”,创建实验

步骤3 课程实验创建完成后,进入对应的操作界面。

步骤4 选择控制器1,打开命令行终端,登录RYU控制器。执行ifconfig命令,查看控制器IP,如下图所示。

OpenFlow Packet-in\out消息学习_第4张图片

步骤5 选择主机1,打开命令行终端,登录Mininet所在主机,执行ifconfig命令,查看Mininet所在主机的IP,如下图所示。

OpenFlow Packet-in\out消息学习_第5张图片

二、捕获数据包

步骤 1 登录控制器,切换至root用户。输入如下命令,启动RYU相关应用。

$ ryu-manager --verbose --observe-links ryu.topology.switches ryu.app.rest_topology ryu.app.ofctl_rest ryu.app.simple_switch_13

OpenFlow Packet-in\out消息学习_第6张图片

步骤 2 再打开新的命令窗口,切换到root用户。执行wireshark命令启动Wireshark,如下图所示。

OpenFlow Packet-in\out消息学习_第7张图片

步骤 3 双击eth0,开始抓包,如下图所示。

OpenFlow Packet-in\out消息学习_第8张图片

步骤 4 登录Mininet所在的主机,切换至root用户。执行命令mn —controller=remote,ip=30.0.1.3, port=6633 —switch=ovsk,protocols=OpenFlow13 —topo=linear,2,如下图所示。

OpenFlow Packet-in\out消息学习_第9张图片

步骤 5 执行命令links,如下图所示:


Mininet生成的网络模拟图如下:

OpenFlow Packet-in\out消息学习_第10张图片

步骤 6 登录控制器,停止Wireshark,观察数据包列表,可以看出控制器与交换机的基本交互流程。

OpenFlow Packet-in\out消息学习_第11张图片

三、 Packet in/out消息详解

步骤1 登录Mininet所在的主机,查看交换机s1的流表信息(s2同理):

$ sh ovs-ofctl dump-flows -O OpenFlow13 s1

红色标记的流表项中:dl_type=0x88cc表示LLDP帧,dl_dst=01:80:c2:00:00:0e表示目的MAC地址为局域网组播地址,actions=CONTROLLER:65535表示行动为发往控制器的65535端口,意味着输入到交换机中的LLDP组播帧都会发送到控制器。

步骤2 在控制器Wireshark抓取的数据包中,寻找包含LLDP包的Packet-out消息并双击,详细信息展示如下。

OpenFlow Packet-in\out消息学习_第12张图片
可以看出,该控制器与OpenFlow交换机协商的OpenFlow版本为1.3版本,消息类型为Packet-out。由红色标记部分信息可以看出Packet-out消息中包含LLDP帧,动作为从交换机的端口2发出,以此来检测网络拓扑结构。

步骤3 在控制器Wireshark抓取的数据包中,寻找包含LLDP包的Packet-in消息并双击,详细信息展示如下。

OpenFlow Packet-in\out消息学习_第13张图片
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

OpenFlow Packet-in\out消息学习_第14张图片

步骤6 在控制器中查看Wireshark,添加过滤条件icmp,寻找触发原因为“OFPR_NO_MATCH”的Packet-in消息并双击。该消息的详细情况如下。

OpenFlow Packet-in\out消息学习_第15张图片
由于OpenFlow交换机中不存在流表项,故发送到OpenFlow交换机的ICMP包无法匹配流表,只好封装并上传到控制器。红色标记表明该Packet-in消息触发原因为:不存在匹配的流表项(OFPR_NO_MATCH)。


你可能感兴趣的:(Openflow)