转载地址:3. OpenFlow协议_SDN核心技术剖析和实战指南_红黑联盟读书频道http://book.2cto.com/201310/34138.html
OpenFlow协议是用来描述控制器和OpenFlow交换机之间交互所用的信息的接口标准,其核心是OpenFlow协议信息的集合。OpenFlow协议支持三种消息类型:controller-to-switch、asynchronous(异步)和symmetric(对称),而每一类消息又可以拥有多个子消息类型。其中,controller-to-switch消息由控制器发起,用来管理或获取OpenFlow交换机的状态;asynchronous消息由OpenFlow交换机发起,用来将网络事件或交换机状态变化更新到控制器;symmetric消息可由交换机或控制器发起。各类消息的细节描述如表2-2所示。
表2-2 OpenFlow协议消息列表
类 型 | 名 称 | 说 明 | 备 注 |
controller-to-switch | Features | 在建立TIS会话时,控制器发送features请求消息给交换机,交换机需要应答自身支持的功能 | 由控制器发起,对OpenFlow交换机进行状态查询和修改配置等操作。OpenFlow交换机接收并处理可能发送或不需要发送的应答消息 |
Configuration | 控制器设置或查询交换机上的配置参数,交换机仅需要应答查询消息 | ||
Modify-state | 控制器管理交换机流表项和端口状态等 | ||
Read-state | 控制器向交换机请求诸如流表、端口、各个流表项等方面的统计信息 | ||
Send-packet | 控制器通过交换机指定端口发出数据包 | ||
Barrier | 控制器通过barrier请求及相应报文,确认相关消息已经被满足或收到完成操作的通知 |
类 型 | 名 称 | 说 明 | 备 注 |
asynchronous | Packet-in | 交换机收到一个数据包,在流表中没有匹配项,或者在流表中规定的行为是“发送到控制器”,则发送Packet-in消息给控制器。如果交换机缓存足够多,数据包被临时放在缓存中,数据包的部分内容(默认128字节)和在交换机缓存中的序号也一同发给控制器;如果交换机缓存不足以存储数据包,则将整个数据包作为消息的附带内容发给控制器 | 由OpenFlow交换机主动发起,用来通知交换机上发生的某些异步事件,消息是单向的,不需要控制器应答。主要用于交换机向控制器通知收到报文、状态变化及出席错误等事件信息 |
Flow-removed | OpenFlow交换机中的流表项因为超时或收到修改/删除命令等原因被删除掉,会触发Flow-removed消息 | ||
Port-status | OpenFlow交换机端口状态发生变化时,触发Port-status消息 | ||
Error | OpenFlow交换机通过Error消息通知控制器发生的问题 | ||
symmetric | Hello | 用于在OpenFlow交换机和控制器之间发起连接建立 | 本类消息不必通过请求建立,控制器和交换机都可以主动发起,并需要接收方应答。这些都是双向对称的消息,主要用来建立连接、检测对方是否在线等 |
Echo | 交换机和控制器均可以向对方发出Echo消息,接收者则需要回复Echo reply。该消息用来协商延迟、带宽、是否连接保持等控制器到OpenFlow交换机之间隧道的连接参数 | ||
Vendor | 用于OpenFlow交换机协商厂家自定义的附加功能。为未来版本预留 |
基于表2-2所示的内容,OpenFlow规定了在其主要的协议交互过程(例如连接建立、连接中断、加密、生成树支持、流表删除、流表项修改等等)中需要使用的协议消息,具体情况包括如下几点。
连接建立:控制器与OpenFlow交换机建立TLS隧道后,隧道中传送的都是控制协议消息,因此隧道中的所有流量转发都无需查询交换机中的流表。当OpenFlow安全隧道建立起来后,双方必须首先发送HELLO消息给对方,该消息携带本方支持的最高协议版本号,接收方将采用双方都支持的最低协议版本进行通信。一旦发现两者拥有共同支持的协议版本,则连接建立,否则发送ERROR消息,描述失败原因,并终止连接。
连接中断:当交换机与控制器之间的连接发生异常时,OpenFlow交换机应尝试连接备份控制器。当多次尝试均失败后,OpenFlow交换机将进入紧急模式,并重置所有的TCP连接。此时,所有包将匹配指定的紧急模式表项,其他所有正常表项将从流表中删除。此外,当交换机刚启动时,默认进入紧急模式。
加密:控制器与OpenFlow交换机之间的安全通道采用TLS连接加密。当交换机启动时,尝试连接到控制器的6633 TCP 端口。双方通过交换证书进行认证。因此,每个交换机至少需配置两个证书,一个用来认证控制器,一个用来向控制器发出认证。
生成树支持:OpenFlow交换机可以选择支持802.1d生成树协议。如果支持,所有相关包在查找流表之前应该先在本地进行传统生成树处理。支持生成树协议的交换机在应答控制器的FEATURES消息的相应应答域中设置STP(Spanning Tree Protocol,生成树协议)支持位,并且需要所有物理端口均支持生成树协议,但无需在虚拟端口支持。生成树协议会设置端口状态,来限制发往FLOOD的数据包仅被转发到生成树指定的端口。需要注意的是,已经指定了出端口的转发或发往ALL的数据包会忽略生成树所指定的端口,而按照规则的设置进行端口转发。
如果交换机不支持802.1d 生成树协议,则必须允许控制器指定洪泛时的端口状态。
流表项修改:流表项修改是控制器下发的最主要的消息,共有五种类型,如表2-3所示。
表2-3 流表项修改消息类型
名 称 | 说 明 |
ADD | 增加一个新的流表项 |
MODIFY | 修改所有匹配的流表项 |
MODIFY_STRICT | 修改严格匹配的流表项 |
DELETE | 删除所有匹配的流表项 |
DELETE_STRICT | 删除严格匹配的流表项 |
交换机移除流表项。交换机移除流表项有两种情况:一种是定时器计时结束,另一种是控制器发出删除表项的命令。每个表项均有一个idle_timeout定时器和一个hard_timeout定时器,前者计算没有流量匹配的时间(单位都是秒),后者计算被插入表中的总时间。一旦到达时间期限,则交换机自动删除该表项,同时发出一个流删除的消息。另外,控制器也可以下发DELETE、DELETE_STRICT等消息主动删除流表项。