天天看点

一本SDN入门书籍读书笔记——SDN 标准分析

交换机转发面详解:

OpenFlow交换机转发面内部(即交换芯片)在逻辑上由两部分组成:端口port和流表Flow Table。跟Controller通信的通道Controller channel可以认为是一个特殊的port,一个交换机可以有多种端口,也可以有很多级流表;

在OpenFlow协议中,Controller通过一套标准消息接口,告诉交换机,当报从哪些port进来,就要去查那张流表,匹配到一条流表项(Flow Entry)之后,就要去执行这条流表项所规定的指令,然后要么直接转发出去要么丢弃,要么继续去查找下一个指定的流表(由匹配到的这条流表项来指定),然后重复这个过程,知道报文被转发或者丢弃;

流(Flow):指在一段时间内,经过同一个网络的一系列具有相同属性的顺序发送的报文集合;

流有老化时间,如果具有相同属性的报文隔了足够长时间发,假设这个时间已经超过了老化时间了,那对于交换机来说,这已经是一条新的流了;

流表(Flow Table):流表就是芯片中一张张的转发表,每一张流表都由很多条流表项组成,比如一张流表有16K,就是说这张流表有16K条流表项;

流表项(Flow Entry):流表项是流表的最小单位,每条流表项对应了网络中传输的一条流,流表项是OpenFlow中最核心的元素,根据OpenFlow的标准,每条流表项的组成部分如下:

Match Field 匹配字段

Priority 优先级

Counter 计数器

Instruction 指令

Timeout 超时时间

Cookie 附属属性

这里的流表项的组成部分是指Controller 和交换机之间传输的数据结构,是对流表项的逻辑描述,并不是跟芯片转发表中的实际字段一一对应;

Match Field 匹配字段:

匹配字段包括保温本身的信息(如MacDa,MacSa,Vlan,IPDA,IPSA等)以及跟报文关联的字段(如报文进来的port,前一张流表传过来的属性数据),同一张流表中,里面不同的流表项的匹配字段可以是不同的,也可以相同;

Priority 优先级:

一个报文在流表进行匹配查找的时候,是从上到下顺序查找的,优先级就是用来标志流表项之间的顺序关系的,优先级相同的流表项是平等的,没有顺序关系;Controller往交换机下发流表项的时候,用优先级告诉交换机该条流表项在流表中存放的相对位置;

Counter 计数器:

计数器是管理员用来观察监控网络负载情况的非常重要的工具,原则上每条流表项都应该对应一个计数器,来表示属于这条流的报文已经收到了多少个以及各种其他统计数据(比如多少字节,多少错误的包等)

Instruction 指令:

OpenFlow里面定义的指令有以下几种:

Meter:用于测量该Flow的速率并执行相应的动作。按照OpenFlow标准术语,每个Meter包含几个Band,每个Band对应一个Rate(速率)和动作,Band的意思是如果所测量的Flow速率超过了指定的Rate,就执行相应的动作,动作可以是drop(丢包)或者dscp remark(改写IP头部中的dscp值);

Apply-Action:立即对报文执行一个Action List(动作列表)里面指定的所有Action,这些Action执行的结果可能影响也可能不影响下一级流表查找;Apply-Action的一个例子是,每条流都出一个Counter(计数器),立即匹配该流对应的报文数量进行统计;

Write-Action:并不立即对报文执行动作,而是把一个Action list里面的多个action放到一个action set动作集合中,等到所有流表都出来完了,再一次性处理这个action set里面所有action;如果不同的流所放的action有冲突,那么后面的覆盖前面的;

Clear-Action:如果某条流想把前面的所有流表处理后产生的所有Action Set都清除掉,就要执行Clear-Action的指令;

Write-metadata(metedata可意译为描述信息):代表一条流独一无二的特征ID;用来在多级流表之间传递以达到关联多级流表的目的。

Goto-Table:继续下一级指定流表的处理。唯一一个要求必须支持的指令;只支持单级流表的时候,这个指令没有意义;

Timeout 超时时间:

每套流表项可以被老化,timeout就是表示该流的老化时间。OpenFlow定义了两种老化时间,hard timeout和idle timeout 前者标识从该流表项创建开始,到了这么长时间后,无条件删除;后者表示,如果在这么长时间内,没有任何报文匹配过该流表项,那就删除;前者可以靠软件做,后者可以必须要靠硬件来做;

Cookie 附属属性:

Cookie是被Controller向Switch来传递流表项相关的操作信息的,比如修改Flow,删除Flow等;这个属性不会在报文转发的时候被使用,仅仅用于Controller和交换机之间传递消息;

端口:OpenFlow中定义三大类端口:

物理端口(Physical Port):交换机面板上所有对外可见的物理端口(带外管理端口除外);逻辑端口:的一个例子就是,Tunnel;保留端口里面有多种端口,Controller Channel(连接Controller的通道,可以是带内业务口,也可以是独立的带外管理口)就是一种保留端口;

组group:

类似 Flow Table;

group中有一个词bucket,bcket指一个action list;

ALL 意思是转发到该group所包含的所有bucket中,可以使用组播实现;

Select:意思是转发到该group所包含的所有bucket中的一个;

Indirect:在多个Flow中共享Action,这种类型的Group只包含一个Bucket

Fail-over:保护倒换,就是在正常状态中,报文只从这个group的一条路径转发出去,一旦这条路径断了,备份路径马上顶上;

Controller和交换机之间的消息:分为三类,分别是Controller-to-Switch消息,Asynchronous(异步消息)(就是Swich-To-Controller消息)、Symmetric(对称消息)

1.Controller-To-Switch消息:

从Controller 发往Switch:

Features:Controller用这个消息类型询问交换机能支持的类型

Configuration:Controller用这个消息类型配置交换机或者查询交换机配置参数

Modify-State:Controller用这个消息类型来操作流表(add/delete/modify)和group表,以及Ports属性等;

Read-State:Controller用这个消息类型来获取交换机各种状态消息,如Counter

Packed-out:Controller用这个消息类型向外发送匹配某条流表项的数据报文;

Barrier:Controller用这个消息类型保证一些其他消息之间的顺序;如B消息依赖与A,那么Controller先朝交换机发送消息A,然后在发送一个Barrier消息,交换机等消息A被执行完后才发送一个对Barrier消息的回复,Controller收到回复后,才会继续发送消息B;

Role-Request:当交换机连了多个Controller的时候,Controller用这个消息类型向交换机通告自己的角色;

Asynchronous-Configuration:用于Controller告诉交换机对交换机发来的哪些消息感兴趣;

2.Asynchronous(异步)消息:

用于交换机想Controller发送,Switch-To-Controller

Packet-in:当有报文匹配某条流表项,该流表项action是output to Controller-Port时,这个报文就被通过Packet-in的消息发送到Controller

Flow-removed:当某个流表项被删除的时候(老化或者Controller主动要求删除),一个Flow-removed的消息就会被发送到Controller;

Port-status:当端口状态发生变化的时候,交换机用这个消息类型告诉Controller通告状态变化,比如Link down/up;

Error:当交换机发生了一些错误的时候,发送这个消息到Controller;

3.Symmetric(对称消息):

可以由任何一方发起:

Hello:Controller或者交换机启动的时候,互发hello消息,通知对方启动了;

Echo:通过发Echo以及得到reply,确认对方的连接没有问题,也可以用来测量连接延时;

Experimenter:用来让产家进行私有扩展。

Controller的三种角色:

Master:一台交换机所连接到的所有Controller中,只能有一个Master,他对交换机拥有完全的操作权限;

Slave:一台交换机所连接到的所有Controlller中,可以有多个Slave,它们对交换机只有读取状态和被动接受交换机消息的权限,不能对交换机进行配置;一旦Master死掉,其中一台Slave就会被选举为Master,接替原来Master继续工作,每个Slave可以接受不同的消息类型,从而在个Slave之间进行负载分担;

Equal:有的网络希望有多个Controller都能对交换机进行配置,以便负载分担,这种情况,这些Controller可以被配置为Equal角色,一台交换机允许同时连接到多个Equal角色的Controller,这些Controller对交换机拥有跟Master一样的功能;

OpenFlow系统性能指标:

交换机处理带宽:芯片决定,无法优化

流表项数量:芯片决定,无法优化

流表项下发能力:即每秒能安装多少条流表项;这个指标跟OpenFlow交换机收包/处理包能力、芯片SDN对流表项处理能力,Contoller软件处理以及CPU主频有很大关系;可以通过提高CPU主频或者优化软件来提高;

To-Controller报文转发:有些报文在交换机里面匹配到某条流表项,这条流表项的动作把报文发送到Controller,Controller经过处理后可能会在把报文通过交换机转发出去;这个转发性能决定Controller和交换机两个元素;

OF-Config:

配置OpenFlow Controller地址;

队列(Queue)和物理端口(Physical Port)的配置管理;

逻辑端口(Tunnel)的创建和管理;

Controller和交换机之间通信通道的创建和配置,包括安全认证;

交换机的能力发现;

目前OF-Config市场接受度很低;要完成上面的工作有三种做法:

一、使用命令行来配置

二、使用厂商的私有方案

三、重新定义另一种协议,(最著名的是Nicira公司的OVSDB)