首页 > 其他分享 >实验3:OpenFlow协议分析实践

实验3:OpenFlow协议分析实践

时间:2022-09-27 21:33:34浏览次数:52  
标签:struct OpenFlow 端口 实践 packet header ofp uint16 实验

(一)基本要求

搭建下图所示拓扑,完成相关 IP 配置,并实现主机与主机之间的 IP 通信。用抓包软件获取控制器与交换机之间的通信数据。

2.抓包结果

HELLO

控制器6633端口(我最高能支持OpenFlow 1.0) ---> 交换机345692端口

交换机34592端口(我最高能支持OpenFlow 1.5) ---> 控制器6633端口

双方建立连接,并使用OpenFlow 1.0

/* OFPT_HELLO.  This message has an empty body, but implementations must
 * ignore any data included in the body, to allow for future extensions. */
struct ofp_hello {
    struct ofp_header header;
};

FEATURES_REQUEST

控制器6633端口(我需要你的特征信息) ---> 交换机34592端口

源码与 OFPT_HELLO 类似

SET_CONFIG

控制器6633端口(请按照我给你的flag和max bytes of packet进行配置) ---> 交换机34592端口

/* 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. */
};
OFP_ASSERT(sizeof(struct ofp_switch_config) == 12);

FEATURES_REPLY

交换机34592端口(这是我的特征信息,请查收) ---> 控制器6633端口

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. */
};

PACKET_IN

交换机345692端口(有数据包进来,请指示)--->控制器6633端口

/* Packet received on port (datapath -> 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. */
};
OFP_ASSERT(sizeof(struct ofp_packet_in) == 20);

Flow_mod

分析抓取的flow_mod数据包,控制器通过6633端口向交换机34592端口、交换机34592端口下发流表项,指导数据的转发处理

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. */
};
OFP_ASSERT(sizeof(struct ofp_flow_mod) == 72);

PACKET_OUT

控制器6633端口--->交换机34592端口(请按照我给你的action进行处理)

/* Send packet (controller -> datapath). */
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.) */
};
OFP_ASSERT(sizeof(struct ofp_packet_out) == 16);

流程图

四、交换机与控制器建立通信时是使用TCP协议还是UDP协议?

TCP协议

进阶要求

Openflow数据报头部

/* Header on all OpenFlow packets. */
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. */
};
OFP_ASSERT(sizeof(struct ofp_header) == 8);

/* OFPT_HELLO.  This message has an empty body, but implementations must
 * ignore any data included in the body, to allow for future extensions. */
struct ofp_hello {
    struct ofp_header header;
};

剩下如上图

个人总结

  1. 相关数据结构可在openflow安装目录openflow/include/openflow当中的
    openflow.h头文件中查询到。
  2. 运行命令“sudo wireshark”开启wireshark抓包工具。
  3. 进入wireshark界面后,点击“any”,获取全部数据包,保存捕获的文件。通
    过过滤器输入“openflow_v1”或“openflow_v4”,过滤出 OpenFlow v1.0
    或 OpenFlow v1.3 的数据报文,进行分析。

标签:struct,OpenFlow,端口,实践,packet,header,ofp,uint16,实验
From: https://www.cnblogs.com/a178161654/p/16736056.html

相关文章

  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践(一)基本要求1、拓扑文件#!/usr/bin/envpythonfrommininet.netimportMininetfrommininet.nodeimportController,RemoteController......
  • 软件定义网络实验2
    这个作业属于哪个课程https://edu.cnblogs.com/campus/fzzcxy/FZUZCSDN202201这个作业要求在哪里https://edu.cnblogs.com/campus/fzzcxy/FZUZCSDN202201/homewo......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践(一)基本要求拓朴文件点击查看代码#!/usr/bin/envpythonfrommininet.netimportMininetfrommininet.nodeimportController,Remote......
  • 实验3:OpenFlow协议分析实践
    实验3:OpenFlow协议分析实践一、实验目的能够运用wireshark对OpenFlow协议数据交互过程进行抓包;能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制......
  • 实验3:OpenFlow协议分析实践
    一、实验目的1.能够运用wireshark对OpenFlow协议数据交互过程进行抓包;2.能够借助包解析工具,分析与解释OpenFlow协议的数据包交互过程与机制。二、实验环境Ubuntu......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践(一)基本要求ovs-vsctl基础操作实践:创建OVS交换机,以ovs-xxxxxxxxx命名,其中xxxxxxxxx为本人学号。在创建的交换机上增加端口p0和p1,设置p0......
  • 实验3 OpenFlow协议分析实践
    实验3OpenFlow协议分时实践基础实验抓包分析step1:搭建拓扑并配置相应IPIP配置如下:step2:Pingall并抓包step3:分析(1)hello包表示含义:控制器6633端口发送“我最......
  • 实验3:OpenFlow协议分析实践
    基本要求一、拓扑文件二、Wireshark抓包结果1、hello控制台6633端口→交换机33440端口hello交换机33440端口→控制台6633端口2、FeaturesRequest控制台6633端......
  • 实验3:OpenFlow协议分析实践
    (一)基本要求1.导入到/home/用户名/学号/lab3/目录下的拓扑文件//实践代码如下#!/usr/bin/envpythonfrommininet.netimportMininetfrommininet.nodeimportCon......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python......