目录
[1 OpenFlow 交换机](#1 OpenFlow 交换机)
[2 流表](#2 流表)
[3 OpenFlow 通道](#3 OpenFlow 通道)
[4 任务描述](#4 任务描述)
[5 任务要求](#5 任务要求)
[6 任务实施](#6 任务实施)
[7 任务验收](#7 任务验收)
1 OpenFlow 交换机
Open Flow 交换机可以分成流表和安全通道两部分。在 Open Flow协议规范中,控制器可以给交换机下发流表项来指导交换机处理匹配流表项的数据包。安全通道是用于和控制器通信的安全连接。安全通道可以直接建立在 TCP上,也可以基于TLS加密之后的Socket建立。
2 流表
流表(Flow Table)是交换机用于存储流表项的表。在Open Flow1.0版本中仅有一张流表,即单流表。其中匹配域用于区分不同的数据流,网络数据包进入交换机之后会匹配流表中的流表项,匹配到同一条流表的数据包被称为数据流。网络数据包进入交换机之后会匹配流表中的流表项,匹配到同一条流表的数据包被称为数据流,即Data Flow,简称 Flow。数据包匹配成功之后需要执行相关的指令,用于完成数据的处理。计数器部分则记录了匹配该流表的数据包的数目和字节数等相关数目。
3 OpenFlow 通道
OpenFlow安全通道是连接OpenFlow交换机到控制器的接口。控制器通过这个接口控制和管理交换机,同时控制器接收来自交换机的事件并向交换机发送数据包。交换机和控制器通过安全通道进行通信,而且所有的信息必须按照OpenFlow协议规定的格式来执行。
OpenFlow协议用来描述控制器和交换机之间交互所用信息的标准,以及控制器和交换机的接口标准。协议的核心部分是用于OpenFlow协议信息结构的集合。
OpenFlow协议支持三种信息类型:Controller-to-Switch,Asynchronous和Symmetric,每一个类型都有多个子类型。Controller-to-Switch信息由控制器发起并且直接用于检测交换机的状态。Asynchronous信息由交换机发起并通常用于更新控制器的网络事件和改变交换机的状态。Symmetric信息可以在没有请求的情况下由控制器或交换机发起。
4 任务描述
在图2.3.1虚拟组网图所示的网络拓扑中,完成相关IP配置,并实现主机与主机之间的IP通信。用抓包软件获取控制器与交换机之间的通信数据包。
5 任务要求
图2.3.1 虚拟组网图
6 任务实施
1)配置思路如下:
- 用 mininet 虚拟仿真工具,使用可视化界面、python 脚本或者命令行搭建一个如图2.3.1所示的拓扑,并导出配置文件,另存为 lab_2.py
- 给四台主机分别配置 IP 地址
- 使用 ping 命令测试两个主机的互通性
- 使用 wireshark 软件,获取交换机与主机之间和两台主机之间的通信,分析交换机与控制器通信的过程并绘制一张流程图,并对主机之间通讯的 packet_in、packet_out、flow_mod 类型的报文的各组成部分进行分析
操作步骤
- 可视化界面搭建网络拓扑
在超级用户模式下,在目录/mininet/examples 下,运行 miniedit.py 文件。
Python3 ./mininet/examples/miniedit.py
按照如上图2.3.1 配置虚拟组网图,选择对应的设备进行连接,完成拓扑图的搭建。最后导出保存为 lab_2.py文件。
- 配置PC的IP信息
- 控制器的配置:鼠标放在控制器上,右键出现properties,点击后就可以进入设置界面。Name可以定义控制器的名字,port默认一般都是6633,一般不用改,控制器类型我设置的是支持openflow协议的,IP地址为192.168.0.50。控制器的属性如下图2.3.2控制器IP设置界面所示:
图2.3.2 控制器设置界面
- SDN交换机的配置:鼠标放在交换机上,右键出现properties,点击后就可以进入设置界面。hostname可以定义交换机的名字,DPID一般为16位,所以s1,s2分别设置为0000000000000001,0000000000000002,switch type是指交换机的类型,使用的是ovs交换机,IP地址分别设置为192.168.0.101,192.168.0.102。交换机的属性如下图2.3.3交换机设置界面所示:
图2.3.3 交换机设置界面
- 主机的配置:鼠标放在主机上,右键出现properties,点击后就可以进入设置界面。这里面有各种设置,可以根据自己的需要进行设置,这里只设置了主机的IP地址,h1为192.168.0.1/24,h2为192.168.0.2/24,h3为192.168.0.3/24,h4为192.168.0.4/24。主机的属性如下图2.3.4主机设置界面所示:
图2.3.4 主机设置界面
- 对全局进行设置,并运行拓扑。点击界面左上角的edit后,出现properties,点击后进入设计界面,此时需要勾选start CLI,只有勾选这个后,才可以在Linux终端中进行操作,还可以根据需要,选择支持的openflow协议。设置完成后,我们还可以对拓扑进行保存,保存的是python脚本,点击左上角的file会发现有Export Level 2 Script选项,点击进入就可以进行保存操作,下一次可以直接在终端运行脚本。全局设置如下图2.3.5全局设置界面所示,保存设置如下图2.3.6保存设置页面所示
图2.3.5 全局设置界面
图2.3.6 保存设置页面
- Wireshark 抓包并分析
在超级用户下,使用sudo wireshark命令开启 wirshark 软件,点击"any",让其获取全部的数据包,之后再通过过滤器输入"openflow_v1"或"openflow_v4",过滤出 OpenFlow v1.0 或 OpenFlow v1.3 的数据报文,进行分析。
7 任务验收
- 使用 ping 命令测试两个主机的互通性,如图2.3.7 主机测试所示
图2.3.7 主机测试
- Wireshark 抓包并分析
在超级用户下,使用sudo wireshark命令开启 wirshark 软件,点击"any",让其获取全部的数据包,之后再通过过滤器输入"openflow_v1"或"openflow_v4",过滤出 OpenFlow v1.0 或 OpenFlow v1.3 的数据报文,进行分析。
- PACKET_IN
当交换机遇到不知道如何转发的报文时,使用 Packet_IN 消息将无法处理的报文封装起来发送给控制器,交给控制器去判断处理。并且交换机会将该数据包缓存,如图2.3.8 PACKET_IN报文所示
图2.3.8 PACKET_IN报文
- Buffer_id Packet-IN 消息所携带的数据包在交换机中的缓存 ID。
- Total length 帧的长度。
- In port 数据包进入交换机的入端口号。
- Reason packet-in事件的产生原因,分为两种:OFPR_NO_MATCH和OFPR_ACTION。
- PACKET_OUT
控制器可以使用Packet_Out 消息,告诉交换机某一个数据包如何处理,如图2.3.8 PACKET_OUT报文所示
图2.3.8 PACKET_OUT报文
- In port 数据包进入交换机的入端口号。
- Actions length 动作信息的长度。
- FLOW_MOD
FLOW_MOD 消息的作用是下发流表项。通过 Flow_Mod 消息可以对流表进行添加、删除、 变更设置等操作,如图2.3.8 PACKET_IN报文所示
图2.3.9 FLOW_MOD报文
- Command 表示flow-mod消息的动作。一共五种,实现对流表的增、删、改操作。
- Idle time-out 流表匹配数据计时器,如果该时间内流表匹配信息还未到达则删除流表。
- hard time-out 流表项老化时间。一项流表在交换机中存在的时间超过该时间则删除流表项。
- roity 流表项优先级,数字越大越优先。
- Buffer Id 交换机上保存的,发送至控制器请求处理的流表的编号。
- ECHO_REQUEST
控制器和交换机通过 ECHO_REQUEST 和 ECHO_REPLY 报文保持连接,如图2.3.10ECHO_REQUEST报文所示
图2.3.10 ECHO_REQUEST报文
- ECHO_REPLY
如图2.3.11 ECHO_ REPLY报文所示
图2.3.11 ECHO_ REPLY报文