SWITCHING
网络交换的概念
网络设备的数据平面(处理报文流),控制平面(分布式算法),管理平面(集中控制)。
报文处理:路由查找、报文分类、执行动作、报文交换调度、到达输出端口
第三层交换模型
IP流:网络中符合流规范和超时约束的IP报文集合。
第三层交换:将报文进行流分类处理,并在IP报文的转发处理中引入面向连接的处理机制。
Overlay(叠加)模型:具有层次型体系结构的特征,网络层和链路层有各自路由协议互相独立。
Peer(对等)模型:基于集成型体系结构的特征、相邻节点平等交换数据、只使用网络层标识和路由协议、使用数据流概念,由边界路由器决定数据如何穿越。
IP over SDH(即将以太帧信号封装在SDH链路中进行传输)
将IP报文直接映射到SDH帧的负荷区、链路层使用PPP协议实现SDH通路的数据传输、实现OC48以及更高速率上的IP传输。
IP over WDM(指直接在光网上运行的因特网)
将IP报文直接映射到SDH帧的负荷区、链路层使用PPP协议实现SDH通路的数据传输、实现OC48以及更高速率上的IP传输。
多协议标记交换-MPLS
基本概念:基于标记交换和数据流的原理,采用peer交换模型,通往同一个下一跳地点的报文可以用等价转发类的概念来划分,每个等价类走同一路径,用同一种转发策略来处理对应一个流。
在传统的路由决策中,路由器需要对网络数据包进行解包,再根据目的IP地址计算归属的FEC(等价转发类)。
而MPLS提出,当网络数据包进入MPLS网络时,对网络数据包进行解包,计算归属的FEC,生成标签(Label)。当网络数据包在MPLS网络中传输时,路由决策都是基于Label,路由器不再需要对网络数据包进行解包。并且Label是个整数,以整数作为key,可以达到O(1)的查找时间。大大减少了路由决策的时间。这里的Label就是MPLS里面的L。需要注意的是Label在MPLS网络里面,是作为网络数据包的一部分,随着网络数据包传输的。
MPLS的核心就是,一旦进入了MPLS网络,那么网络数据包的内容就不再重要,路由决策(包括FEC归属的计算,next hop的查找)都是基于Label来进行的。
MPLS的数据平面:带标记的报文按交换方式而不是路由方式进行转发、发挥L2转发的效率
MPLS的控制平面:使用现有的IP控制协议扩展+用于交换标记信息的新协议、发挥L3控制的灵活性和可扩展性
四种不同方式的流:①点到点②点到多点③多点到点④多点到多点
环路处理三种方式:①loop survival②loop detection③loop prevention
标记分配协议-LDP:MPLS的一种控制协议
? MPLS标记的指派是由下行节点确定,并通知上行节点(发送方是下行节点,接收方是上行节点),并通知上行节点,同时可以对LSR所允许的标记范围进行限定。
? 在使用LDP进行标记分配时,下行(Rd)LSP执行分配规程、撤销规程;上行(Ru)LSP执行请求规程、不可用规程、释放规程和标记使用规程。
? LDP使用UDP实现发现机制,使用TCP实现其他传输机制。
LDP规程:①分配规程②撤销规程③请求规程④不可用规程⑤释放规程⑥标记使用规程
LDP分配规程
? 无条件PUSH:对于路由表中的每一条路由,下行要给上行分配一个标记。
? 有条件PUSH:对于路由表中的路由,如果下行是这条路由的LSP外向节点,或者下行的下行节点已对该路由分配了标记,则下行向对应的上行分配一个标记。
? 无条件PULL:这时针对downstream-on-demand的情况,当上行请求时,下行要分配一个标记。
? 有条件PULL:如果下行满足有条件PUSH的条件,则可响应上行的请求进行标记分配。
软件定义网络-SDN
SDN体系结构:控制层与数据层分离(即控制与转发分离)
SDN控制器:
北向接口面对应用;南向接口面向路由器(南向接口形成事实接口:Openflow…)
SDN要解决的问题:
? “决策者”过多导致全网资源利用率低
? 为不必要的“决策者”付费
? 网络过于复杂
SDN网络面临的问题:
? 北向接口难以统一
? 控制器容易出现单点故障(控制器集群技术)
? 南向接口庞杂
? 难以实现跨域管理和跨域协同(控制器分层)
网络功能虚拟化-NFV
核心思想:软件和专用硬件解耦(使得软件和通用硬件结合)
核心技术:管理和编排
网络功能虚拟化:不使用专有设备-需要云服务和SDN技术的支持,需要进行网络功能编排;
OpenFlow
OpenFlow网络从底到高由三部分组成:
? OpenFlow交换机-实现数据层的转发
? Flow Visor-对网络进行虚拟化
? Controller-对网络集中控制
OpenFlow网络由OpenFlow网络设备(OpenFlow 交换机)、控制器(OpenFlow控制器)、用于连接设备和控制器的安全通道(Secure Channel)以及OpenFlow表项组成。其中,OpenFlow 交换机设备和OpenFlow控制器是组成OpenFlow网络的实体,要求能够支持安全信道和OpenFlow表项。
流表
流表是数据转发的依据,与交换机的mac地址转发表和IP地址路由表类似,流表中保存了网络中各个层次的网络配置信息,因此可以进行更加丰富的转发规则。交换机收到来自主机的数据包后,会在本机查询对应的动作,和对应的输出端口。流表有很多流表项,每一条流表项都是一个转发规则。
流表处理流程
当报文进入Switch后,必须从最小的Flow Table开始依次匹配。Flow Table可以按次序从小到大越级跳转,但不能从某一Flow Table向前跳转至编号更小的Flow Table。当报文成功匹配一条Flow Entry后,将首先更新该Flow Entry对应的统计数据(如成功匹配数据包总数目和总字节数等),然后根据Flow Table中的指令进行相应操作,比如跳转至后续某一Flow Table继续处理,修改或者立即执行该数据包对应的Action Set等。当数据包已经处于最后一个Flow Table时,其对应的Action Set中的所有Action将被执行,包括转发至某一端口,修改数据包某一字段,丢弃数据包等。具体实现时,OpenFlow交换机还需要对匹配表项次数进行计数、更新匹配集和元数据等操作。
Table Miss表项
每个流表(Flow Table)都包含一个Table Miss流表项,该表项用于定义在流表中没有匹配的报文的处理方式,该表项的匹配域为通配,即匹配任何报文,优先级为0,Instructions与正常表项相同。通常,如果Table-Miss表项不存在,默认行为是丢弃报文。
组表
OpenFlow组表的表项被流表项(Flow Entry)所引用,提供组播报文转发功能。一系列的Group表项组成了Group Table,每个表项结构如图:
根据Group ID可检索到相应Group表项,每个Group表项包含多个动作Bucket,每个Bucket包含多个动作,Bucket内的动作执行顺序依照Action Set的顺序。
计量表(Meter Table)
Meter计量表项被流表项(Flow Entry)所引用,为所有引用Meter表项的流表项提供报文限速的功能。一系列的Meter表项组成了Meter Table, 每个Meter表项的组织结构如下:
一个Meter表项可以包含一个或者多个Meter Bands,每个Meter Band定义了速率以及动作,报文的速率超过了某些MeterBand,根据这些MeterBand中速率最大的那个定义的动作进行处理。
安全通道
OpenFlow设备与Controller通过建立OpenFlow信道,进行OpenFlow消息交互,实现表项下发,查询以及状态上报等功能。通过OpenFlow信道的报文都是根据OpenFlow协议定义的,通常采用TLS(Transport Layer Security)加密,但也支持简单的TCP直接传输。如果安全通道采用TLS连接加密,当交换机启动时,会尝试连接到控制器的6633 TCP端口(Openflow端口通常默认建议设置为6633)。双方通过交换证书进行认证。因此,在加密时,每个交换机至少需配置两个证书。
OpenFlow端口是OpenFlow处理单元与网路其他部分传递封包的网路接口。
一个OpenFlow交换机必须支持三种类型的端口:①物理端口,②逻辑端口和③保留端口。
标准端口
OpenFlow标准端口定义为物理端口,逻辑端口以及本地预定的端口。
标准端口可以当做入口端口,出口端口来使用。
物理端口
OpenFlow的物理端口是与交换机硬件接口对应的由交换机定义的端口。举个例子,以太网交换机上,物理端口与以太网接口一一映射对应。
逻辑端口
逻辑端口指的是由交换机定义但不与硬件接口直接相关的端口。
预定端口
OpenFlow预定端口是有这篇文档所定义的。它指明了一般性的转发规则,例如发送给控制器,泛洪或者是使用非OpenFlow的方式转发。
指令
每一个流表的表项都包含一系列的指令,当报文匹配上了这个表项后,这些指令就会被执行,这些指令的执行结果有几种:改变报文,改变action set,改变pipeline。这些指令可以按照其执行结果的不同而分类,不同的流表的表项包含的指令种类也不同,前面说了指令可以包含动作,但也并非所有种类的指令都包含动作,下面是指令的分类。
? (可选指令)Meter meter_id,不包含动作,行为是将报文送往指定的meter
? (可选指令)Apply-actions action(s),这个指令是真正包含动作的指令,它的行为是立即对报文应用这些指令,不要改变报文的action set
? (可选指令)Clear-actions,这个指令并不包含任何的动作,它的行为是立即清除报文的action set中所有的动作
? (必选指令)Write-actions actions(s),这个指令真正的包含动作,它的行为是将自己包含的动作合并到报文的action set中
? (可选指令)Write-Metadata metadata / mask,这个也不包含动作,用的不多
? (必选指令)Goto-Table next-table-id,这个指令也不包含动作,它表示把报文交给后续的哪张流表处理。OpenFlow协议要求交换机必须支持这个action,但有一个例外是假设你的交换机本身就只支持一张流表,那可以不支持这个action。
动作
OpenFlow协议不要求交换机支持所有的动作种类,几个常见的:
? (可选) Output,表示将报文从某个特定的端口送出去
? (必选) Drop,丢弃报文
? (必选) Group,表示将报文交给指定的组
? (可选) Change-TTL,改变报文的TTL字段(可以是IPv4 TTL,MPLS TTL或者Ipv6 Hop Limit)
Action Set
Action set是一个与报文相关联的概念,只要提起action set,它就一定是报文的action set,它包含了当报文离开流表时要附加于这个报文上的动作。我们前面看到了有一种Apply-actions指令,它是在报文匹配了表项的时候将它包含的动作立即应用到报文上,而Write-actions则是将它包含的动作合并到报文的action set中,另外还有Clear-actions指令,是将报文的action set清空。最终报文走完所有流表时,其action set里面有什么动作,就执行什么动作,这就是action set的作用了。
Action List
Action list实际上就是一系列动作的有序序列,一定要注意其有序性。在上面说到的流表中的Apply-actions指令中,以及OpenFlow协议中同样能够包含动作的Packet-out命令中,都要求所包含的动作被有序执行。所以就出来了这么个action list的概念,这是与action set的一点区别。另一个区别是action list并不是和报文相关联的概念,action list可以直接夹带在 controller发给agent的消息中,比如Packet-out消息;也可以存在于流表表项的指令中,比如Apply-actions指令。
OpenFlow协议目前支持的三种报文类型:
? Controller to Switch消息
由Controller发起、Switch接收并处理的消息。这些消息主要用于Controller对Switch进行状态查询和修改配置等管理操作,可能不需要交换机响应。
? 异步(Asynchronous)消息
由Switch发送给Controller,用来通知Switch上发生的某些异步事件的消息,主要包括Packet-in、Flow-Removed、Port-Status和Error等。例如,当某一条规则因为超时而被删除时,Switch将自动发送一条Flow-Removed消息通知Controller,以方便Controller作出相应的操作,如重新设置相关规则等。
? 同步(Symmetric)消息
顾名思义,同步(Symmetric)消息是双向对称的消息,主要用来建立连接、检测对方是否在线等,是控制器和OpenFlow交换机都会在无请求情况下发送的消息,包括Hello、Echo、Error和Experimenter四种消息。
信道建立过程
OpenFlow控制器和OpenFlow交换机之间建立信道连接的基本过程,具体步骤如下:
- OpenFlow交换机与OpenFlow控制器之间通过TCP三次握手过程建立连接,使用的TCP端口号为6633。
- TCP连接建立后,交换机和控制器就会互相发送hello报文。Hello报文负责在交换机和控制器之间进行版本协商,该报文中OpenFlow数据头的类型值为0。
- 功能请求(Feature Request):控制器发向交换机的一条OpenFlow 消息,目的是为了获取交换机性能,功能以及一些系统参数。该报文中OpenFlow 数据头的类型值为5。
- 功能响应(Feature Reply):由交换机向控制器发送的功能响应(Feature Reply)报文,描述了OpenFlow交换机的详细细节。控制器获得交换机功能信息后,OpenFlow协议相关的特定操作就可以开始了。
- Echo请求(Echo Request)和Echo响应(EchoReply)属于OpenFlow中的对称型报文,他们通常用于OpenFlow交换机和OpenFlow控制器之间的保活。通常echo请求报文中OpenFlow数据头的类型值为2,echo响应的类型值为3。不同厂商提供的不同实现中,echo请求和响应报文中携带的信息也会有所不同。
OpenFlow流表下发分为主动和被动两种机制:
主动模式下,Controller将自己收集的流表信息主动下发给网络设备,随后网络设备可以直接根据流表进行转发。
被动模式下,网络设备收到一个报文没有匹配的FlowTable记录时,会将该报文转发给Controller,由后者进行决策该如何转发,并下发相应的流表。被动模式的好处是网络设备无需维护全部的流表,只有当实际的流量产生时才向Controller获取流表记录并存储,当老化定时器超时后可以删除相应的流表,因此可以大大节省交换机芯片空间。
在实际应用中,通常是主动模式与被动模式结合使用。
交换机报文上送控制器
控制器回应报文