当前位置:   article > 正文

实验三:OpenFlow协议分析实践

实验三:OpenFlow协议分析实践

一、实验目的

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

二、实验环境

下载虚拟机软件Oracle VisualBox;
在虚拟机中安装Ubuntu 20.04 Desktop amd64,并完整安装Mininet;

三、实验要求

(一)基本要求

搭建下图所示拓扑,完成相关 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. 配置网段

2. 配置ip地址

3. 保存拓扑为python文件

4. 运行sudo wireshark命令,并选择any模式进行抓包,开启另一个终端,命令行运行031902241.py文件,运行pingall

5. 查看抓包结果,分析OpenFlow协议中交换机与控制器的消息交互过程(截图以其中一个交换机为例)

  • OFPT_HELLO 源端口6633 -> 目的端口34068,从控制器到交换机
  • 也有源端口34068 -> 目的端口6633的,即交换机到控制器的另一个包,此处协议为openflow1.5控制器与交换机建立连接,并使用OpenFlow 1.0
  • OFPT_FEATURES_REQUEST 源端口6633 -> 目的端口34068,从控制器到交换机控制器请求交换器的特征信息
  • OFPT_SET_CONFIG 源端口6633 -> 目的端口34068,从控制器到交换机控制器要求交换机按照所给出的信息进行配置
  • OFPT_PORT_STATUS 源端口35828 -> 目的端口6633,从交换机到控制器当交换机端口发生变化时,交换机告知控制器相应的端口状态
  • OFPT_FEATURES_REPLY 源端口34068 -> 目的端口6633,从交换机到控制器交换机告知控制器它的特征信息
  • OFPT_PACKET_IN 源端口34068 -> 目的端口6633,从交换机到控制器交换机告知控制器有数据包进来,请求控制器指示
  • OFPT_PACKET_OUT 源端口6633 -> 目的端口35844,从控制器到交换机控制器要求交换机按照所给出的action进行处理
  • OFPT_FLOW_MOD 源端口6633 -> 目的端口35844,从控制器到交换机控制器对交换机进行流表的添加、删除、变更等操作
  • 上述OFPT_PACKET_INOFPT_PACKET_OUTOFPT_FLOW_MOD三种消息报文的交互会频繁多次出现在交换机和控制器之间。

6.画出相关交互图或流程图:

7.回答问题:交换机与控制器建立通信时是使用TCP协议还是UDP协议?


如图所示为(Transmission Control Protocol)TCP协议。

(二)进阶要求

将抓包结果对照OpenFlow源码,了解OpenFlow主要消息类型对应的数据结构定义。相关数据结构可在openflow安装目录openflow/include/openflow当中的openflow.h头文件中查询到
1. HELLO

struct ofp_header {

    uint8_t version;    /* OFP_VERSION. */

    uint8_t type;       /* One of the OFPT_ constants. */

    uint16_t length;    /* Length including this ofp_header. */

    uint32_t xid;       /* Transaction id associated with this packet.

                           Replies use the same id as was in the request

                           to facilitate pairing. */

};

struct ofp_hello {

    struct ofp_header header;

};

可以看到对应了HELLO报文的四个参数

2. FEATURES_REQUEST

源码参数格式与HELLO相同,与上述ofp_header结构体中数据相同

3.SET_CONFIG

控制器下发的交换机配置数据结构体

/* Switch configuration. */

struct ofp_switch_config {

    struct ofp_header header;

    uint16_t flags;             /* OFPC_* flags. */

    uint16_t miss_send_len;     /* Max bytes of new flow that datapath should

                                   send to the controller. */

};

4. PORT_STATUS

/* A physical port has changed in the datapath */

struct ofp_port_status {

    struct ofp_header header;

    uint8_t reason;          /* One of OFPPR_*. */

    uint8_t pad[7];          /* Align to 64-bits. */

    struct ofp_phy_port desc;

};

5. FEATURES_REPLY

struct ofp_switch_features {

    struct ofp_header header;

    uint64_t datapath_id;   /* Datapath unique ID.  The lower 48-bits are for

                               a MAC address, while the upper 16-bits are

                               implementer-defined. */

    uint32_t n_buffers;     /* Max packets buffered at once. */

    uint8_t n_tables;       /* Number of tables supported by datapath. */

    uint8_t pad[3];         /* Align to 64-bits. */

    /* Features. */

    uint32_t capabilities;  /* Bitmap of support "ofp_capabilities". */

    uint32_t actions;       /* Bitmap of supported "ofp_action_type"s. */

    /* Port info.*/

    struct ofp_phy_port ports[0];  /* Port definitions.  The number of ports

                                      is inferred from the length field in

                                      the header. */

};

/* Description of a physical port */

struct ofp_phy_port {

    uint16_t port_no;

    uint8_t hw_addr[OFP_ETH_ALEN];

    char name[OFP_MAX_PORT_NAME_LEN]; /* Null-terminated */

    uint32_t config;        /* Bitmap of OFPPC_* flags. */

    uint32_t state;         /* Bitmap of OFPPS_* flags. */

    /* Bitmaps of OFPPF_* that describe features.  All bits zeroed if

     * unsupported or unavailable. */

    uint32_t curr;          /* Current features. */

    uint32_t advertised;    /* Features being advertised by the port. */

    uint32_t supported;     /* Features supported by the port. */

    uint32_t peer;          /* Features advertised by peer. */

};

可以看到与图中信息一一对应,包括交换机物理端口的信息

6. PACKET_IN

PACKET_IN有两种情况:

  1. 交换机查找流表,发现没有匹配条目,但是这种包没有抓到过

enum ofp_packet_in_reason {

    OFPR_NO_MATCH,          /* No matching flow. */

    OFPR_ACTION             /* Action explicitly output to controller. */

};

  1. 有匹配条目,对应的action是OUTPUT=CONTROLLER,固定收到向控制器发送包

struct ofp_packet_in {

    struct ofp_header header;

    uint32_t buffer_id;     /* ID assigned by datapath. */

    uint16_t total_len;     /* Full length of frame. */

    uint16_t in_port;       /* Port on which frame was received. */

    uint8_t reason;         /* Reason packet is being sent (one of OFPR_*) */

    uint8_t pad;

    uint8_t data[0];        /* Ethernet frame, halfway through 32-bit word,

                               so the IP header is 32-bit aligned.  The

                               amount of data is inferred from the length

                               field in the header.  Because of padding,

                               offsetof(struct ofp_packet_in, data) ==

                               sizeof(struct ofp_packet_in) - 2. */

};

7. PACKET_OUT

struct ofp_packet_out {

    struct ofp_header header;

    uint32_t buffer_id;           /* ID assigned by datapath (-1 if none). */

    uint16_t in_port;             /* Packet's input port (OFPP_NONE if none). */

    uint16_t actions_len;         /* Size of action array in bytes. */

    struct ofp_action_header actions[0]; /* Actions. */

    /* uint8_t data[0]; */        /* Packet data.  The length is inferred

                                     from the length field in the header.

                                     (Only meaningful if buffer_id == -1.) */

};

8. FLOW_MOD

struct ofp_flow_mod {

    struct ofp_header header;

    struct ofp_match match;      /* Fields to match */

    uint64_t cookie;             /* Opaque controller-issued identifier. */

    /* Flow actions. */

    uint16_t command;             /* One of OFPFC_*. */

    uint16_t idle_timeout;        /* Idle time before discarding (seconds). */

    uint16_t hard_timeout;        /* Max time before discarding (seconds). */

    uint16_t priority;            /* Priority level of flow entry. */

    uint32_t buffer_id;           /* Buffered packet to apply to (or -1).

                                     Not meaningful for OFPFC_DELETE*. */

    uint16_t out_port;            /* For OFPFC_DELETE* commands, require

                                     matching entries to include this as an

                                     output port.  A value of OFPP_NONE

                                     indicates no restriction. */

    uint16_t flags;               /* One of OFPFF_*. */

    struct ofp_action_header actions[0]; /* The action length is inferred

                                            from the length field in the

                                            header. */

};

struct ofp_action_header {

    uint16_t type;                  /* One of OFPAT_*. */

    uint16_t len;                   /* Length of action, including this

                                       header.  This is the length of action,

                                       including any padding to make it

                                       64-bit aligned. */

    uint8_t pad[4];

};

(一)个人心得

在深入探索网络技术的世界中,我有幸接触到了OpenFlow协议,这一革命性的网络通信协议为我打开了一扇通往软件定义网络(SDN)的大门。通过实践分析OpenFlow协议,我不仅加深了对SDN核心概念的理解,还体会到了它在现代网络架构中的重要性和灵活性。

首先,OpenFlow协议的核心在于其控制平面与数据平面的分离。这种分离使得网络管理员可以通过集中的控制器来管理和配置整个网络,而不是传统的分散式设备管理。在实践中,我通过部署一个OpenFlow控制器,如流行的RyuONOS控制器,体验了如何利用它们来编排网络流量,这极大地提高了网络的灵活性和响应速度。

其次,OpenFlow协议的流表概念让我印象深刻。在传统的网络设备中,路由决策通常基于目的IP地址或MAC地址。而在OpenFlow网络中,流表允许我们定义更为复杂的匹配规则,包括源和目的地址、端口号、甚至数据包的VLAN标签。通过实践,我发现这种精细的控制能力使得网络策略的实施更加精确和高效。

然而,实践过程中也遇到了挑战。配置OpenFlow交换机和控制器并非易事,特别是在处理复杂的网络拓扑和大规模部署时。调试和故障排除也需要深厚的网络知识和耐心。此外,OpenFlow的安全性也是一个值得关注的问题,因为它引入了一个新的攻击面——控制通道。

总的来说,OpenFlow协议的实践分析是一次宝贵的学习经历。它不仅提升了我的技术技能,也让我认识到了SDN在未来的网络发展中的潜力。尽管存在挑战,但OpenFlow协议无疑为网络工程师提供了强大的工具,以构建更加智能、可控的网络环境。随着技术的不断进步,我相信OpenFlow及其相关的SDN技术将继续推动网络领域的创新和发展。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/660492
推荐阅读
相关标签
  

闽ICP备14008679号