实验3:OpenFlow协议分析实践

实验3:OpenFlow协议分析实践

基础实验


可视化建立拓扑代码如下:

点击查看代码
#!/usr/bin/env python

from mininet.net import Mininet
from mininet.node import Controller, RemoteController, OVSController
from mininet.node import CPULimitedHost, Host, Node
from mininet.node import OVSKernelSwitch, UserSwitch
from mininet.node import IVSSwitch
from mininet.cli import CLI
from mininet.log import setLogLevel, info
from mininet.link import TCLink, Intf
from subprocess import call

def myNetwork():

    net = Mininet( topo=None,
                   build=False,
                   ipBase='192.168.0.0/24')

    info( '*** Adding controller\n' )
    c0=net.addController(name='c0',
                      controller=Controller,
                      protocol='tcp',
                      port=6633)

    info( '*** Add switches\n')
    s1 = net.addSwitch('s1', cls=OVSKernelSwitch)
    s2 = net.addSwitch('s2', cls=OVSKernelSwitch)

    info( '*** Add hosts\n')
    h1 = net.addHost('h1', cls=Host, ip='192.168.0.101', defaultRoute=None)
    h2 = net.addHost('h2', cls=Host, ip='192.168.0.102', defaultRoute=None)
    h3 = net.addHost('h3', cls=Host, ip='192.168.0.103', defaultRoute=None)
    h4 = net.addHost('h4', cls=Host, ip='192.168.0.104', defaultRoute=None)

    info( '*** Add links\n')
    net.addLink(h1, s1)
    net.addLink(h3, s1)
    net.addLink(s1, s2)
    net.addLink(s2, h2)
    net.addLink(s2, h4)

    info( '*** Starting network\n')
    net.build()
    info( '*** Starting controllers\n')
    for controller in net.controllers:
        controller.start()

    info( '*** Starting switches\n')
    net.get('s1').start([c0])
    net.get('s2').start([c0])


    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel( 'info' )
    myNetwork()

1.构建拓扑并pingall,用wireshark获取通信数据包

2.分析wireshark抓包内容:

①hello包 表示含义:控制器6633端口 发送“我最高能支持OpenFlow1.0”信息给交换机38046端口

交换机端口38046发送“我最高能支持OpenFlow1.5”的信息给控制器6633端口

②Feature_Request 表示含义:控制器6633端口发送“我需要获取对象的特征信息”信息给交换机的38046端口

③Feature_Reply 表示含义:交换机38046端口发送“这是我的特征信息”信息给控制器6633端口

④Set Config 表示含义:控制器6633端口(请按照我给你的flag和max bytes of packet进行配置)发送给交换机38046端口

⑤Flow_mod 控制器通过6633端口向交换机38046端口下发流表项,指导数据的转发处理

⑥Packet_in 交换机38046端口发送(有数据包进来,请指示)给控制器6633端口

⑦Packet_out 控制器6633端口发送(请按照我给你的action进行处理)给交换机38046端口

⑧Port_Status 当交换机端口发生变化时,告知控制器相应的端口状态

OpenFlow协议中交换机与控制器的消息交互过程,画出相关交互图或流程图:

如图所示可知使用协议为tcp协议

进阶要求:

查看OpenFlow目录下的头文件
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. */
};
物理描述端口
点击查看代码
/* 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. */
};
交换机的特性
点击查看代码

/* Switch features. */
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. */
};
n_buffers表示交换机缓冲区可以 缓存的最大数据包个数 n_tables表示流表数量 pad作为一个填充值 capabilities表示支持的特殊功能 actions:表示支持的动作 port data表示物理端口描述列表

1.OFPT_HELLO

OFPT_HELLO是用于协议协商,内容是本方支持的最高版本的协议,最终使用双方都支持的最低版本协议建立连接。

点击查看代码
/* 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;
};

2.OFPT_FEATURES REQUEST

控制器向交换机发送Features Request消息查询交换机特性,Features Request消息只包含Openflow Header,
交换机的特性信息包括交换机的ID(DPID),交换机缓冲区数量,交换机端口及端口属性等等

点击查看代码
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. */
};

3.OFPT_FEATURES REPLY

Features Reply消息包括Openflow Header 和Features Reply Message;

点击查看代码
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. */
};
OFP_ASSERT(sizeof(struct ofp_phy_port) == 48);

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

4.OFPT_SET_CONFIG

根据收到的flag和max bytes of packet配置

点击查看代码
/* 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. */
};

5.OFPT_PORT_STATUS

当交换机端口发生变化时,告知控制器相应的端口状态

点击查看代码
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;
};

6.OFPT_FLOW_MOD

控制器通过端口向交换机端口下发流表项,指导数据的转发处理

点击查看代码
/* Flow setup and teardown (controller -> datapath). */
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. */
};

7.OFPT_PACKET_IN

在控制器获取完交换机的特性之后 , 交换机开始处理数据。

点击查看代码
enum ofp_packet_in_reason {
    OFPR_NO_MATCH,          /* No matching flow. */
    OFPR_ACTION             /* Action explicitly output to controller. */
};

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

8.OFPT_PACKET_OUT

控制器可以使用PacketOut消息,告诉交换机某一个数据包如何处理。

点击查看代码
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];
};
OFP_ASSERT(sizeof(struct ofp_action_header) == 8);

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

实验总结:

遇到的问题:

1.HELLO数据包只发现2个,实际应为2对,4个数据表。
解决方法:在wireshark中关闭openflow1.0过滤,可以发现由交换机发向控制器的hello数据包。、
2.在开始抓包时,没有找到Flow_mod包。
解决方法:执行pingall操作,抓到了Flow_mod包。

本次实验较为简单,主要是使用wireshark进行抓包以及对抓包结果进行分析
可以使用miniedit生成可视化操作进行ip配置
在进行抓包时必须一次性完成所有包的查找分析,否则再次启动虚拟机时,会发生端口发生变化的情况
运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
通过滤器输入“openflow_v1”或“openflow_v4”等进行数据包过滤,运用 wireshark 对 OpenFlow 协议数据交互过程进行抓包;
借助包解析工具,分析与解释 OpenFlow协议的数据包交互过程与机制;将抓包结果对照OpenFlow源码,让我们能够了解OpenFlow主要消息类型对应的数据结构定义。

在OpenFlow1.3协议的情况下,控制器与OpenFlow交换机的消息完整交互流程如下:
1、 控制器与交换机通过TCP建立有效的连接。其中,控制器一端的端口号为6633,交换机端口为不固定值。
2、 控制器与交换机之间相互发送Hello消息协商双方的OpenFlow版本号,协商的结果将以较低的OpenFlow版本为准。
3、 控制器向交换机发送Features Request,交换机收到请求后,向控制器发送Features Reply消息,详细汇报自身参数
4、 控制器通过Set Config消息下发配置参数
5、 控制器与交换机之间发送Packet_out、Packet_in消息

posted @ 2022-09-28 12:26  102299246鲁玉琪  阅读(45)  评论(0编辑  收藏  举报