SDN

交换机与控制器通信过程

Posted by Cai Qiqi on 2016-12-22

交换机与控制器通过OpenFlow(1.0)协议通信过程

Reference : 《Openflow协议基础入门》 by 张健男

建立OpenFlow连接 ( Controller <-> Switch )

控制器与交换机互相发送Hello消息(Hello消息值包含OpenFlow Header,其中version字段为发送放所支持的最高版本的OpenFlow协议)
双方选取Hello消息中最低版本的协议作为通信协议。若双方OpenFlow版本可兼容,则OpenFlow连接建立成功。

? OpenFlow连接建立后,控制器最关心什么事情呢?

获取交换机特性(Features)信息 ( Controller <-> Switch )

OpenFlow连接建立后,控制器最需要获得交换机的Features信息(包括交换机的ID, 即DPID),交换机的缓冲区数量,交换机端口已经端口属性等。

控制器向交换机发送 Features Request消息(Features消息只包含OpenFlow Header)查询交换机的特性。
交换机在收到 Features Request消息后返回Features Reply消息(包括OpenFlow Header和 Features Reply Message)

Features Reply Message结构

struct ofp_switch_features {
uint64_t datapath_id // 为交换机独一无二的ID号
uint32_t n_buffers // 为交换机可以同时缓存的最大数据包个数
uint8_t n_tables // 为交换机的流表数量
/* Features */
uint32_t capabilities // 为交换机支持的特殊功能
uint32_t actions // 表示交换机支持的动作 (见 ofp_action_type)
/* Port Info */
struct ofp_phy_port // 为交换机的物理端口描述列表
}

配置交换机OpenFlow属性 ( Controller -> Switch )

OpenFlow交换机只有两个属性需要控制器配置

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

Packet-in事件 (交换机接收数据包) ( Switch -> Controller )

Pakcet-in消息触发情况1:
当交换机收到一个数据包后,会查找流表(Flow table),找出与数据包包头匹配的条目(Entry)。
如果流表中有匹配条目,则交换机按照流表所指示的action列表处理数据包(也就没有Packet-in消息了);
如果流表中没有匹配条目,则交换机会将数据包封装在Packet-in消息中发送给控制器处理。此时数据包会缓存在交换机中等待处理。

Packet-in消息触发情况2:
交换机流表所指示的action列表中包含转发给控制器的动作(Output=CONTROLLER)。此时数据包不会被缓存在交换机中。

Packet-in消息格式

struct ofp_packet_in {
struct ofp_header
uint32_t buffer_id // 为`Packet-in`事件所携带的数据包在交换机中的缓存区ID
uint16_t total_len // 为data段的长度
uint16_t in_port // 数据包进入交换机的端口号
uint8_t reason // 为`Packet-in`事件产生的原因
}
enum ofp_packet_in_reason {
OFPR_NO_MATCH, // 没有匹配到flow table entry(流表项)
OFPR_ACTION // 明确指定转发给控制器
}

控制器配置流表 (Flow-Mod 消息) ( Controller -> Switch )

Flow-Mod消息用来添加、删除、修改OpenFlow交换机的流表消息
Flow-Mod消息共有五种类型:
ADD, DELETE, DELETED-STRICT, MODIFY, MODIFY-STRICT
ADD: 添加一条新的流表项
DELETE: 删除所有符合某种条件的流表项
DELETED-STRICT: 删除某一条指定的流表项
MODIFY: 修改所有符合某种条件的流表项
MODIFY-STRICT: 修改某一条指定的流表项

Flow-Mod 消息格式

//TODO

用Flow-Mod消息响应Packet-in消息 ( Controller -> Switch )

当交换机收到一个数据包并且交换机中没有与该数据包匹配的流表项时,交换机将次数据包封装到Packet-in消息中发送给控制器,
并且交换机会将该数据包缓存。
控制器收到Packet-in消息后,可以发送Flow-Mod消息向交换机写一个流表项。并且将该Flow-Mod消息中的 buffer_id 字段设置为Packet-in消息中的 buffer_id值。
这样,控制器就成功向交换机写入了一条与数据包相关的流表项,并且指定该数据包按照此流表项的action列表处理。

交换机转发数据包 (Packet-out) ( Controller -> Switch )

并不是所有的数据包都需要向交换机中添加一条流表项来匹配处理,网络中还存在多种数据包,它出现的数量很少(如ARP、IGMP等),以至于没有必要通过流表项来指定这一类数据包的处理方法。
此时,控制器可以使用Packet-out消息,告诉交换机某一个数据包如何处理。

Packet-out消息格式

//TODO

Packet‐Out消息的应用场景

//TODO

  1. 指定某一个数据包的处理方法

基于OpenFlow的SDN工作流程