1.6Mininet流表应用实战2——控制器下发流表协议分析

发布时间 2023-06-08 08:53:10作者: ChuenSan

Mininet流表应用实战2——控制器下发流表协议分析

实验目的

1、理解OpenFlow交换机和控制器间的工作原理。
2、学会使用Wireshark抓包分析,熟悉了解OpenFlow协议。。

实验环境

Mininet流表应用实战2——控制器下发流表协议分析实验的拓扑如下图所示。
image-20230524140847812
实验环境信息如下表所示。

设备名称 软件环境 硬件环境
主机 Ubuntu 14.04桌面版 Mininet 2.2.0 CPU:1核 内存:2G 磁盘:20G
控制器 Ubuntu 14.04桌面版 OpenDaylight碳版本 CPU:4核 内存:8G 磁盘:20G

注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。

任务内容

1、通过Mininet自定义创建拓扑,并使用远程控制器进行通信测试。
2、解析控制器与交换机、主机与主机之间的OpenFlow协议通信过程。

实验原理

在SDN环境下,当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将此数据包发送给控制器,由控制器决策数据包如何处理。控制器下发决策后,交换机根据控制器下发的信息来进行数据包的处理,即转发或者丢弃该数据包。

操作步骤

一、创建拓扑并测试通信

步骤1

登录OpenDaylight虚拟机,执行如下命令查看OpenDaylight的启动情况,端口监听情况如下所示。

# netstate -anput|grep 6653
# netstate -anput|grep 8181

image-20230524140951274
说明:为方便用户实验,实验平台中ODL的功能组件已安装,且启动好了。

步骤2

执行命令ifconfig查看ODL控制器的IP地址。
image-20230524141014117
说明:本实验中ODL的IP地址为30.0.1.159,实验需根据具体情况操作。

步骤3

登录Mininet虚机,打开命令行执行终端,执行命令sudo wireshark进行Wireshark抓包,监听网卡any上的数据流量。
image-20230524141104249

步骤4

打开新的命令行执行窗口,执行命令cd /home/openlab/openlab/mininet/custom进入custom目录。

步骤5

执行命令sudo vim exper1.py创建python自定义拓扑脚本文件exper1.py,脚本代码如下:

#!/usr/bin/python
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
    "Simple topology example."
    def __init__( self ):
        "Create custom topo."
        # Initialize topology
        Topo.__init__( self )
        # Add hosts and switches
        Host1 = self.addHost( 'h1' )
        Host2 = self.addHost( 'h2' )
        Host3 = self.addHost( 'h3' )
        Switch1 = self.addSwitch( 's1' )
        Switch2 = self.addSwitch( 's2' )
        # Add links
        self.addLink( Host1, Switch1 )
        self.addLink( Host2, Switch1 )
        self.addLink( Host3, Switch2 )
        self.addLink( Switch1, Switch2 )
topos = { 'mytopo': ( lambda: MyTopo() ) }

说明:为方便用户实验,脚本文件在/home/ftp/exper.py中已预置。

步骤6

执行如下命令通过mn命令执行自定义脚本,并远程指定控制器ODL的IP地址。

# sudo mn --custom exper1.py --topo mytopo --controller=remote,ip=30.0.1.159,port=6653

image-20230524141216242

步骤7

执行命令pingall验证Mininet中虚拟主机的连通性。
image-20230524141301238

步骤8

执行命令dpctl dump-flows查看交换机上的流表。
image-20230524141326457
可以看到交换机上有了流表,接着交换机会根据流表进行数据包的转发使其通信。

步骤9

停止Wireshark抓包并查看抓包结果,筛选出openflow_v1协议数据包。
image-20230524141428900

步骤10

登录ODL控制器,打开浏览器并输入URL地址:http://127.0.0.1:8181/index.html,使用用户名密码:admin/admin登录ODL控制器的Web页面,查看ODL控制器Web页面显示的拓扑。
image-20230524141501816
可以看到ODL控制器发现了交换机及主机的拓扑。

二、OpenFlow协议解析

步骤1

首先发送HELLO消息,建立初始化连接,协商使用的OpenFlow协议版本。由下图可知,ODL与Mininet之间应用的是OpenFlow1.0版本协议。
image-20230524142635450

步骤2

OpenFlow版本协商完成后,控制器发送一条features_request消息获取交换机的特性信息,包括交换机的ID(DPID)、缓冲区数量、端口及端口属性等等。相应的,交换机回复features_reply消息。
image-20230524142709230
ofpt_feature_reply数据包详情如下,交换机的DPID是数据通道独一无二的标识符。本实验中交换机缓冲区数量(n_buffers)为256,交换机支持的流表数量(n_tables)为254,交换机所支持的功能,如下所示。
image-20230524142759657

步骤3

stats reply消息用于回应stats request信息,主要是交换机回应给控制器的状态信息。
image-20230524143051242

步骤4

当交换机收到数据包后查找流表无匹配项时,将数据包封装在packet_in消息发给控制器,由控制器通过packet_out消息下发决策,使发送和接收数据包的两主机间进行通信。
image-20230524143137013
image-20230524143209447

步骤5

flow mod消息涉及流表项的下发匹配信息,下图显示的是flow mod匹配项的类型信息。
image-20230524143227119