SDN

openflow

  • OpenFlow 协议简单来说就是把路由器的控制平面(Control Plane,管理路由表、负责网络配置和系统管理等)从转发平面(Forward Plane,转发决策和输出链路调度等)中分离出来,以软件方式实现。从第一个正式商用版本 v1.0 开始,OpenFlow 有先后推出了v1.1,v1.2,v1.3,v1.4 等,版本之间存在不兼容的内容, OpenFlow 交换机或者其它解决方案也存在版本支持不尽相同的情况,版本兼容的问题需要尤其关注。
  • SDN 控制器和交换机之间需要建立通讯连接才能进行配置、管理和监控。通讯连接基于 TCP (或者 TLS)协议之上,监听 6653 端口 。初始化模式:1)网络交换机发起,发送连接请求到控制器 2)控制器发起,交换机需要设置被动模式( passive mode)开启监听。 无论使用哪种模式,一旦通讯连接建立,OpenFlow 消息将通过 TCP/TLS 连接传递。
  • 流表(Flow Table)
    • Match fields:他们将定义在包头字段:L2(源目的地 以太网地址,VLAN ID,VLAN优先级等),L3(IPv4和IPv6 源目的地 地址、协议类型、DSCP、等),L4领域(TCP/UDP/SCTP源目的端口),ARP ICMP字段,字段,MPLS域等等。
    • Actions:他们将定义一个包是否符合特定条件。例如丢弃(drop),转发到交换机的指定端口,修改数据包(push/pop VLAN ID,push/pop 标签,递增/递减IP TTL),转发到特殊端口的序列等
    • 计数器:记录由多少数据包匹配到当前flow
    • 网络交换机将 SDN 控制器下发的所有规则存储于流表:ACL 策略(configuring ACL rules),安全策略(security policy rules),QoS 限速策略(QoS rate limiting bandwidth rules),路由策略(routing rules),端口镜像策略(port mirroring rules),包变更策略(packet modification rules)
  • 支持 OpenFlow 的开源交换机:Open vSwitch (后面再说) alt openflowtopo
  • Openflow 转发流程: 假设主机A向主机B发送IP数据包,且OpenFlow交换机中流表为空
    • OF交换机接收IP数据包
    • OF交换机解析数据包首部并查询流表,由于流表为空,不知道如何转发,因此需要询问控制器
    • OF交换机向控制器发送Packet-In消息
    • 控制器为主机A发送给主机B的IP数据包计算路由
    • 控制器向OF交换机下发流表,使用FlowMod消息承载流表信息,OF交换机接收该消息后安装流表
    • 控制器向OF交换机发送Packet-Out消息,指示OF交换机按照刚安装好的流表转发IP数据包
    • OF交换机收到Packet-Out消息后转发数据包
  • 流: 在介绍流表之前,需要先解释流的概念,流(Flow)就是具有相同特征的数据包集合。例如,源MAC地址为MAC_A,目的MAC地址为MAC_B的所有数据包集合就可以视为一条流,可见流具有方向性。有别于传统网络中路由器基于数据包独立转发的模式,使用OpenFlow的SDN网络是基于流进行转发的,即对相同特征的数据包集合采用同样的处理。
  • 流表: 流表(Flow Table)是OpenFlow中最重要的一张表,它用于指导OpenFlow交换机对收到的数据包进行转发,相当于二层的MAC地址表和三层的路由表。在OpenFlow 1.1以后的版本中,每台交换机支持使用多张流表,构成流水线处理,从而完成对数据包更为复杂的处理。 alt flowtable
  • 流表由若干条流表项(Flow Entry)组成:
  • https://chentingz.github.io/2019/12/30/%E3%80%8COpenFlow%E3%80%8D%E5%8D%8F%E8%AE%AE%E5%85%A5%E9%97%A8/#
    • 匹配域(Match Fields):用于定义某条流,也是流表匹配的依据
      • OpenFlow提供丰富的匹配域字段来定义不同粒度的流,如可以基于目的IP地址定义一条流,也可以根据源IP地址 + 目的IP地址来定义一条流
      • alt openflowmatch
    • 指令(Instructions):表示对该条流应该如何处理
      • 指令(Instruction)是流表项匹配成功时的处理动作,分为三类
      • 更新动作集(Action Set):添加、修改、清空动作集,前面两个对应Write-Actions指令,清空动作集对应Clear-Actions指令
      • 修改流水线处理次序:从序号低的表跳转到序号高的表,对应Go-To-Table指令
      • 其他:更新元数据以及设定触发器,分别对应Write-Metadata指令和Stat-Trigger指令
      • alt openflowinstructions
      • 动作(Action:Action是指对数据包的具体处理动作,可分为两类,一类是定义数据包的转发,另一类是修改数据包包头字段
      • alt openflowactions
    • 优先级(Priority):表示该流表项的优先匹配程度
    • 计数器(Counters):用于统计该条流的信息
    • 生存时间(Timeouts):表示流表项的有效存活时间
    • Cookie:控制器设置用来过滤被流统计、流修改和流删除操作请求影响的流表项
    • 标志(Flags):用于流表项管理
  • 例子——使用单流表转发数据包
    • 假设主机A发送数据包给主机B,使用单张流表的OF交换机处理数据包过程,如图所示 alt openflowexample
    • OF交换机从1端口接收数据包
    • OF交换机解析数据包首部,并查询流表进行流表匹配,匹配第一条流表项,并执行相应指令
    • 将数据包转发到OF交换机的2端口
  • 例子——使用多流表转发数据包
    • 流水线处理开始:OpenFlow交换机接收数据包后,执行入端口的流水线处理,同时给该流水线分配一个动作集(Action Set)
    • 流表匹配
      • 匹配成功: 更新相应流表项的计数器,完成对该条流的统计工作, 执行流表项对应的指令
      • 匹配失败:一个数据包可能在流表中与所有的流表项都不匹配或者匹配到Table-Miss流表项(优先级为0且匹配域为ANY),这两种情况都称为Table-Miss,对于前者,OpenFlow交换机将丢弃数据包;对于后者,OpenFlow交换机根据Table-Miss流表项,处理数据包(丢弃数据包、转发给控制器、交给下一个流表处理)
    • 流水线处理结束:若当前不是执行跳转指令,则执行动作集中的所有动作,完成对数据包的处理,然后结束流水线处理
  • 例子——多级流表实现对流的细粒度控制

    alt openflowprocessmulti

    • 使用多级流表实现主机A发送到给主机B的所有TCP报文正常转发,UDP报文均丢弃,从而实现对不同流的细粒度控制
      • 流表0中匹配主机A到主机B的IP流,然后跳转到其他流表,如流表2
      • 流表2中在IP流的基础上进一步匹配TCP流或UDP流,根据要求将TCP流正常转发,UDP流丢弃
  • OpenFlow的两种下发流表方式: proactive/reactive
  • 组表: 独立于流水线之外,每台OpenFlow交换机只有一张组表。组表(Group Table)由若干条组表项(Group Entry)组成,具有将多个端口定义为一个组的能力,从而实现广播、多播,负载均衡、链路聚合、故障转移等

    alt openflowmulticasting

  • 例子——使用组表实现多播: 假设主机A使用多播方式向主机B和C发送IP数据包

    alt openflowmulticastingexample

  • 计量表: 对流进行测量,从而为流提供QoS功能,如限速、DiffServ。每台OpenFlow交换机只有一张计量表(Meter Table),由若干计量表项(Meter Entry)组成,每个计量表项可以定义一至多个计量带(Meter Band),计量带定义了带宽阈值和数据包处理方式(丢弃、DSCP标记)

    alt openflowmonitor

  • OpenFlow消息
    • controller to switch
      • Features:用于获取交换机特性: Configuration:用来配置和查询交换机参数, Modify-State:用来修改交换机状态信息(增删改流表项、组表项等)
      • Table-Mod消息: Flow-Mod消息(流表操作,添加、删除、修改流表项, Group-Mod消息, Port-Mod消息, Meter-Mod消息
      • Read-State:用来读取交换机状态信息(当前配置、统计信息等): Port-Stats消息, Flow-Stats消息
      • Packet-Out:用来指定交换机将数据包从指定端口转发出去: Barrier:在不同消息之间使用,确保操作顺序执行, Role Request:控制器用于询问或设置自身在交换机中的角色,常用于交换机与多控制器连接的场景, Asynchronous-Configuration:控制器设置异步消息过滤器,只接收感兴趣的异步消息,一般在多控制器场景下使用
    • Switch-to-Controller
      • Packet-In:将数据包交给控制器处理,一般流表匹配中出现Table-Miss时或流表项显示指定将数据包交给控制器时,触发该消息
      • Flow-Removed:通知控制器,流表项被删除;流表项超时或控制器删除流表项时触发该消息(需要在交换机配置时使能该消息)
      • Port-status :通知控制器,交换机端口状态发生变化
      • Role-status:通知控制器,控制器在交换机中的角色发送变化
      • Controller-Status:通知控制器,OpenFlow通道状态发生变化
      • Flow-monitor:通知控制器,流表发送变化
    • Both side message
      • Hello:建立控制器与交换机之间的OpenFlow通道
      • Echo:检测交换机与控制器之间的连接状态或测量OpenFlow通道的时延和带宽
      • Error:用于通告错误
      • Experiment:用于实验,测试新特性
  • 盛科openflow
    • ovs-ofctl dump-flows br0 -O openflow13 dl_vlan=, in_port= , output=, mpls,mpls_label= (查看流表)
    • ovs-ofctl meter-stats br0 meter=xxx -O openflow13 (查看限速)
    • show mpls oam lm session (查看OAM)
    • Show qos interface eth-0-x queue (查看端口缓存)

      SR-MPLS

  • Segment Routing MPLS特性涉及的概念如下:
    • SR域(Segment Routing Domain):SR节点的集合。
    • SID:即Segment ID,用来标识唯一的段。在转发层面,可以映射为MPLS标签。
    • SRGB(Segment Routing Global Block):用户指定的为Segment Routing MPLS预留的全局标签集合。
    • SRLB(Segment Routing Local Block):用户指定的为Segment Routing MPLS预留的本地标签集合。这些标签在本地配置,仅在本地有效,但是会通过IGP对外发布,所以是全局可见。SRLB当前主要用于配置Binding SID。
  • Segment分类
    • Prefix Segment(前缀段), 手工配置
      • 更像是针对每个路由条目的ID分发
      • Prefix Segment用于标识网络中的某个目的地址前缀(Prefix)。
      • Prefix Segment通过IGP协议扩散到其他网元,全局可见,全局有效。
      • Prefix Segment通过Prefix Segment ID(SID)标识。Prefix SID是源端发布的SRGB范围内的偏移值,接收端会根据自己的SRGB计算实际标签值用于生成MPLS转发表项。
    • Adjacency Segment(邻接段),源节点通过协议动态分配。也可以手工配置。
      • 针对每个邻接链路的
      • Adjacency Segment用于标识网络中的某个邻接。
      • Adjacency Segment通过IGP协议扩散到其他网元,全局可见,本地有效。
      • Adjacency Segment通过Adjacency Segment ID(SID)标识。Adjacency SID为SRGB范围外的本地SID。
    • Node Segment(节点段), 手工配置。
      • 代表结点,设备,有点像routerID
      • Node Segment是特殊的Prefix Segment,用于标识特定的节点(Node)。在节点的Loopback接口下配置IP地址作为前缀,这个节点的Prefix SID实际就是Node SID。
  • segement ID的使用
    • 可以单独使用,也可以结合使用