SDN概述

什么是SDN

SDN,Software Defined Networking,软件定义网络。 传统 IP 网络是一个分布式的、对等控制的网络,每条网络设备存在独立的 控制平面转发平面(有的地方也称为数据平面) ,这种网络优势在于设备与协议解耦,厂家之间兼容性较好。 转发平面: 提供高速无阻塞数据通道,实现各个业务模块之间的业务交换功能 控制平面: 完成系统的协议处理、业务处理、路由运算、转发控制、 业务调度、流量统计、系统安全等功能 但传统的 IP 网络存在网络易拥塞(最短路径转发,拥塞时无法从全局考虑)技术复杂(协议多,配置难)、运维困难(困难发现困难,故障定位难)、业务部署慢等问题。 而 SDN 将控制平面和转发平面解耦,实现网络控制平面的 集中控制 ,提出了 转控分离、集中控制、开放可编程接口 的特征。

SDN网络架构

  • 协同应用层:主要完成用户意图的各种上层应用,典型的协同层应用包括OSS、OpenStack 等。OSS可以负责整网的业务协同,OpenStack云平台一般用于数据中心负责网络、计算、存储的业务协同。还有其他的协同层应用,比如用户希望部署一个安全APP,这个安全APP 不关心设备具体部署位置,只是调用了控制器的北向接口,例如Block(Source IP, DestIP),然后控制器会给各网络设备下发指令。这个指令根据南向协议不同而不同。
  • 控制器层:控制器层的实体就是 SDN 控制器,是 SDN 网络架构下最核心的部分。控制层是 SDN 系统的大脑,其核心功能是实现网络业务编排。
  • 设备层:网络设备接收控制器指令,执行设备转发。
  • NBI 北向接口:北向接口为控制器对接协同应用层的接口,主要为RESTful。
  • SBI 南向接口:南向接口为控制器与设备交互的协议,包括NETCONF、SNMP、OpenFlow、OVSDB等。

OpenFlow

OpenFlow 是控制器与交换机之间的一种 南向接口协议 ,定义了 Controller-to-SwitchAsynchronousSymmetric 类型的消息,每种消息又包含更多的子类型

Controller-to-Switch

由 Controller 发送,用于管理 Switch 和查询 Switch 相关信息。子消息包括:

  • Feature 消息:在 SSL/TCP 会话建立后,Controller 给 Switch 发送Features 请求 Switch 的相关信息。Switch 必须应答自己支持的功能,包括接口名、接口 MAC 地址、接口支持的速率等等基本信息。
  • Configuration 消息:Controller可以设置或查询 Switch 的状态。
  • Modify-State 消息:Controller 发送该消息给 Switch,来管理 Switch的状态,即增加/删除、更改流表,并设置 Switch 的端口属性。
  • Read-State 消息:Controller 用该消息收集 Switch 上的统计信息。
  • Send-Packet 消息:Controller 发送该消息到 Switch 的特定端口。
Asynchronous

由 Switch 发起,当 Switch 状态改变时,发送该消息告知 Controller 状态变化。子消息包括如下:

  • Packet-in消息:当 Flow Table 中没有匹配的表项或者匹配“send to Controller”, Switch将给 Controller 发送 packet-in 消息。
  • Packet-out 消息:从控制器回复的消息。
  • Flow-Removed 消息:当给 Switch 增加一条表项时,会设定超时周期。当时间超时后, 该条目就会被删除。这时 Switch 就会给 Controller 发送 Flow-Removed 消息;当流表中有条目要删除时,Switch也会给 Controller 发送该消息。
  • Port-status 消息:当数据路径接口被添加、删除、修改的时候,此消息用于通知控制器。
Symmetric

该类型没有固定的发起方,由 Switch 或 Controller 发起。子消息如下:

  • Hello消息:当一个 OpenFlow 连接建立时,Controller 和Switch 都会立刻向对端发送 OFPT_HELLO 消息,该消息中的version 域填充发送方支持的 OpenFlow 协议最高的版本号;接收方收到该消息后,接收方会计算协议版本号,即在发送方和接收方的版本 号中选择一个较小的;如果接收方支持该版本,则继续处理连接,连接成功;否则, 接收者回复一个OFPT_ERROR消息,类型域中填充 ofp_error_type.OFPET_HELLO_FAILED
  • Echo消息: Switch和Controller任何一方都可以发起Echo request消息,但收到的一 方必须回应Echo reply消息。这个消息可以来测量latency、Controller-Switch之间的 连接性,即心跳消息;
  • Error消息:当交换机需要通知控制器发生问题或错误时,Switch给Controller 发送 Error消息。

Flow Table

OpenFlow 交换机根据 流表(Flow Table) 转发报文

每个流表项由 匹配字段优先级计数器指令超时CookieFlag 七部分组成,关于转发的关键内容是 匹配字段指令

  • 匹配字段 (Match Fields):作为匹配规则,可以匹配入接口、物理入接口,流表间数据,二层报文头,三层报文头,四层端口号等报文字段

  • 优先级 (Priority):定义流表项之间的匹配顺序,优先级越高越先匹配
  • 计数器 (Counters):统计有多少个报文和字节匹配到该流表项
  • 指令 (Instructions):定义匹配到该流表项的报文需要进行的处理动作
  • 超时 (Timeouts):包括 Idle TimeHard Time
    • Idle Time:在 Idle Time 时间超时后如果没有报文匹配到该流表项,则此流表项被删除。
    • Hard Time:在 Hard Time 时间超时后,无论是否有报文匹配到该流表项,此流表项都会被删除。
  • Cookie:Controller 下发的流表项的标识
  • Flags:更改流条目的管理方式

转发方式

基于流表转发报文与传统基于路由表转发的区别如下: 基于流表转发:一般由 OF 控制器统一计算流表项,然后下发到交换机,交换机通过查询流表匹配流表项进行报文转发。流表是变长的,一台网络设备拥有多张流表。 基于路由表转发:网络设备通过允许路由协议计算得到路由表项,组合成一张路由表,接收到报文时通过查询并根据最长匹配原则匹配路由表项进行转发。路由表是定长的,一台设备只有一张路由表(当然可以运行 VPN 实例,实现路由分割,但我觉得本质上还是同一张表)

参考文章