博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenFlow 交换机与控制器交互步骤
阅读量:5240 次
发布时间:2019-06-14

本文共 4107 字,大约阅读时间需要 13 分钟。

交互步骤

1. Hello

控制器与交互及互相发送 Hello 消息。Hello消息中只包含有OpenFlow Header,其中的 type 字段为 OFPT_HELLO,version 字段为发送方所支持的最高版本 OpenFlow 。这时候会出现两种情况:

  • 双方都支持 OpenFlow ,则选取 Hello 消息中最低版本的协议作为通信协议
  • 如果其中有一方不支持 OpenFlow 协议版本,则发送 Error 消息后断开连接

如果双方 OpenFlow 版本可以兼容,则 OpenFlow 连接建立成功。

Q1:Hello 消息是使用什么协议传输?TCP?UDP?
Q2:所有的网络协议在升级的时候都必须向前兼容更低版本的协议?

2. Features Request

OpenFlow 连接建立之后,就像你刚到手一部新手机,你最想知道的就是手机的配置如何一样,控制器最需要获得交换机的特性信息,交换机的特性信息包括交换机的 ID(DPID),交换机缓冲区数量,交换机端口及端口属性等等。
控制器向交换机发送 Features Request 消息查询交换机特性,Features Request 消息只包含 OpenFlow Header,其中 type 字段为 OFPT_FEATURES_REQUEST。

3. Features Reply

交换机在收到控制器发出的 Features Request 消息后返回 Features Request 消息,Features 消息包括 OpenFlow Header 和 Features Reply Message。后者结构如下:

struct ofp_switch_features{    struct ofp_header header;    uint64_t datapath_id; /*唯一标识 id 号*/    uint32_t n_buffers; /*交缓冲区可以缓存的最大数据包个数*/    uint8_t n_tables; /*流表数量*/    uint8_t pad[3]; /*align to 64 bits*/    uint32_t capabilities; /*支持的特殊功能,具体见 ofp_capabilities*/    uint32_t actions; /*支持的动作,具体见 ofp_actions_type*/    struct ofp_phy_port ports[0]; /*物理端口描述列表,具体见 ofp_phy_port*/};

Q3:uint8_t pad[3] 这一字段的作用是什么?为了保证整个结构体长度是 64bits 的整数倍?

ofp_capabilities 结构如下:

ofp_capabilities
ofp_actions_type 结构如下:
ofp_actions_type
ofp_phy_port 结构如下:

struct ofp_phy_port{    uint16_t port_no; /*物理端口的编号*/    uint8_t hw_addr[OFP_EHT_ALEN]; /*MAC地址*/    char name[OFP_MAX_PORT_NAME_LEN]; /*端口的名称*/    uint32_t config; /*端口配置,见 ofp_port_config*/     uint32_t state; /*端口状态,见ofp_port_state*/    uint32_t curr; /*物理属性*/    uint32_t advertised; /*物理属性*/    uint32_t supported; /*物理属性*/    uint32_t peer; /*物理属性*/};

ofp_port_config 和 ofp_port_state 结构如下:

ofp_port_config 和 ofp_port_state
4. Set config
知道了交换机的特性之后就要配置交换机了。OpenFlow 交换机只有两个属性需要控制器配置:

  • 第一个属性为 flags,用来指示交换机如何才处理 IP 分片数据包。
  • 第二个属性为 miss_send_len,用来指示当一个交换机无法处理的数据包到达时,将数据包发给控制器的最大字节数。
    set config

5. Packet-in

有两种情况会触发交换机向控制器发送 Packet-in 消息:

  • 当交换机收到一个数据包后,查找流表。如果流表中有匹配条目,则交换机按照流表所指示的 action 列表处理数据包。如果没有,则交换机将数据包封装在 Packet-in 消息中发送给控制器处理,注意这时候数据包仍然会被放进缓冲区等待处理而不是被丢弃。
  • 数据包在流表中有匹配的条目,但是其中所指示的 action 列表中包含转发给控制器的动作(Output = CONTROLLER),注意这时候数据包不会被放进缓冲区。
    Packet-in消息格式如下:
struct ofp_packet_in {    struct ofp_header header;    uint32_t buffer_id; /*Packet-in消息所携带的数据包在交换机缓存区中的ID*/    uint16_t total_len; /*data字段的长度*/    uint16_t in_port; /*数据包进入交换机时的端口号*/    uint8_t reason; /*发送Packet-in消息的原因,具体见 ofp_packet_in_reason*/    uint8_t pad;    uint8_t data[0]; /*携带的数据包*/};

ofp_packet_in_reason 结构如下:

enum ofp_packet_in_reason {    OFPR_NO_MACTH  /*没有匹配的条目*/    OFPR_ACTION   /*action列表中包含转发给控制器的动作*/};

6. Flow-Mod / Packet-out

当控制器收到 Packet-in 消息时有两种响应的方式:
Flow-Mod
控制器收到 Packet‐in 消息后,可以发送 Flow‐Mod 消息向交换机写一个流表项。并
且将 Flow‐Mod 消息中的 buffer_id 字段设置为 Packet‐in 消息中的 buffer_id 值。从而
控制器向交换机写入了一条与数据包相关的流表项,并且指定该数据包按照此流表项的 action 列表处理。
Flow-Model 消息共有五种类型:

  • ADD,用来添加一条新的流表项
  • DELETE,用来删除所有符合一定条件的流表项
  • DELETE-STRICT,用来删除某一条指定的流表项
  • MODIFY,用来修改所有符合一定条件的流表项
  • MODIFY-STRICT,用来修改某一条指定的流表项
    Flow-Mod 消息格式:
struct ofp_flow_mod {    struct ofp_header header;    struct ofp_match match; /*流表的匹配域*/     uint64_t cookie; /*流表项标识符*/        uint16_t command; /*可以是ADD,DELETE,DELETE-STRICT,MODIFY,MODIFY-STRICT*/    uint16_t idle_timeout; /*空闲超时时间*/    uint16_t hard_timeout; /*最大生存时间*/    uint16_t priority; /*优先级,优先级高的流表项优先匹配*/    uint32_t buffer_id; /*缓存区ID ,用于指定缓存区中的一个数据包按这个消息的action列表处理*/      uint16_t out_port; /*如果这条消息是用于删除流表则需要提供额外的匹配参数*/    uint16_t flags; /*标志位,可以用来指示流表删除后是否发送flow‐removed消息,添加流表时是否检查流表重复项,添加的流表项是否为应急流表项。*/    struct ofp_action_header actions[0]; /*action列表*/};

Packet-Out

并不是所有的数据包都需要 向交换机中添加一条流表项来匹配处理,网络中有些数据包出现的数量很少(如ARP、 IGMP等),没必要通过流表项来指定这一类数据包的处理方法。此时可以使用 Packet-Out 消息,高速交换机某一个数据包如何处理。

struct ofp_packet_out {    struct ofp_header header;    uint32_t buffer_id; /*交换机缓存区id,如果为-1则指定的为packet-out消息携带的data字段*/    uint16_t in_port; /*如果buffer_id为‐1,并且action列表中指定了Output=TABLE的动作,in_port将作为data段数据包的额外匹配信息进行流表查询*/    uint16_t actions_len; /*action列表的长度,可以用来区分actions和data段*/    struct ofp_action_header actions[0]; /*动作列表*/    uint8_t data[0]; /*数据缓存区,可以存储一个以太网帧,可选*/}

Flow-Mod 是指定一类数据包的处理方法,而 Packet-Out 则是指定某一个数据包的处理方法。不仅如此,Packet-Out 消息还可以让交换机产生一个数据包并按照 action 列表处理。

总结

基于 OpenFlow 的 SDN 工作流程,如下图:

工作流程

转载于:https://www.cnblogs.com/multhree/p/9520859.html

你可能感兴趣的文章
多线程---线程间的通信
查看>>
poj 1331 Multiply
查看>>
严重: 文档无效: 找不到语法。 at (null:2:19)
查看>>
tomcat7的数据库连接池tomcatjdbc的25个优势
查看>>
Html 小插件5 百度搜索代码2
查看>>
nodejs-Path模块
查看>>
P1107 最大整数
查看>>
EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器...
查看>>
监控CPU和内存的使用
查看>>
Ubuntu14.04设置开机自启动程序
查看>>
ios app 单元测试 自动化测试
查看>>
强连通tarjan模版
查看>>
javascript_09-数组
查看>>
多进程与多线程的区别
查看>>
PAT 1145 1078| hashing哈希表 平方探测法
查看>>
Ubuntu(虚拟机)下安装Qt5.5.1
查看>>
Linux第七周学习总结——可执行程序的装载
查看>>
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
查看>>
细说php(二) 变量和常量
查看>>
iOS开发网络篇之Web Service和XML数据解析
查看>>