多协议标签交换MPLS
多协议标签交换MPLS(multiProtocal Label Switching):“多协议”表示在MPLS的上层可以采用多种协议。
MPLS利用面向连接技术,使每个分组携带一个叫作标签的小整数(这叫作打上标签)。当分组到达交换机时,交换机读取分组的标签,并用标签值来检索分组转发表。这样就比查找路由表来转发分组快得多。
人们经常把多标签交换MPLS与异步传递方式ATM相联系,这仅仅是因为它们都采用了面向连接的工作方式。
MPLS具有以下三个方面的特点:
- 面向连接的服务质量
- 支持流量工程,均衡网络负载
- 有效支持虚拟专用网
MPLS的工作原理
在传统IP网络中,分组传输有着很大的不方便:
- 如每到达一个路由器,都必须查找转发表,并按照“最长前缀匹配”找到下一跳地址;
- 当网络很大时,查找大量转发表很耗费时间;
- 在突发通信量,往往还会使缓存溢出,引起分组丢失、传输延时增大和服务质量下降。
MPLS域和LSR路由器
MPLS 域(MPLS domain)是指该域中有许多彼此相邻的路由器,并且所有的路由器都是支持 MPLS技术的标签交换路由器LSR(Label Switching Router)。
LSR同时具有标签交换和路由选择这两种功能:标签交换功能是为了快速转发,但在这之前LSR需要先使用路由选择功能构造转发表。
MPLS的一个重要特点就是在MPLS 域的入口处,给每一个IP数据报打上固定长度“标签”,然后对打上标签的IP数据报用硬件进行转发,这就使得IP数据报转发的过程大大地加快了。
采用硬件技术对打上标签的IP数据报进行转发就称为标签交换。“交换”也表示在转发时不再上升到第三层查找转发表,而是根据标签在第二层(链路层)用硬件进行转发。
MPLS可使用多种链路层协议,如 PPP、以太网、ATM 以及帧中继等。
基本工作流程
(1) MPLS域中的各LSR使用专门的标签分配协议LDP(Label Distribution Protocol)交换报文,并找出和特定标签相对应的路径,即标签交换路径LSP (Label Switched Path)。例如在图中的路径A→B→C→D。各LSR根据这些路径构造出转发表。这个过程和路由器构造自己的路由表相似
但应注意的是,MPLS是面向连接的,因为在标签交换路径上的第一个LSR就根据IP数据报的初始标签确定了整个的标签交换路径,就像一条虚连接一样。
(2)当一个IP数据报进入到MPLS域时,MPLS入口节点(ingress node)就给它打上标签(后面我们就会知道,这实际上是插入一个MPLS首部),并按照转发表把它转发给下一个LSR。以后的所有LSR都按照标签进行转发。
给IP数据报打标签的过程叫作分类(classification)。
- 严格的第三层(网络层)分类只使用了IP首部中的字段,如源IP地址和目的IP地址等。
- 大多数运营商实现了第四层(运输层)分类(除了要检查IP首部外,运输层还要检查TCP或UDP首部中的协议端口号)。
- 而有些运营商则实现了第五层(应用层)分类(更进一步地检查数据报的内部并考虑其有效载荷)。
(3)由于在全网内统一分配全局标签数值是非常困难的,因此一个标签仅仅在两个标签交换路由器LSR之间才有意义。分组每经过一个LSR,LSR就要做两件事:一是转发,二是更换新的标签,即把入标签更换成为出标签。这就叫作标签对换(label swapping)。
做这两件事所需的数据都已清楚地写在转发表中。举例如下:
(4)当IP数据报离开MPLS域时,MPLS 出口节点(egress node)就把MPLS的标签去除,把IP数据报交付非 MPLS 的主机或路由器,以后就按照普通的转发方法进行转发。
上述这种“由入口LSR确定进入MPLS域以后的转发路径” 称为显示路由选择,它和互联网中通常使用的“每一个路由器逐跳进行路由选择”有着很大区别。
转发等价类FEC
所谓“转发等价类”就是路由器按照同样方式对待的IP数据报的集合。这里“按照同样方式对待”表示从同样接口转发到同样的下一跳地址,并且具有同样服务类别和同样丢弃优先级等。
FEC的例子是:
- 目的IP地址与某一个特定IP地址的前缀匹配的IP数据报(这就相当于普通的IP路由器);
- 所有源地址与目的地址都相同的IP数据报;
- 具有某种服务质量需求的IP数据报
入口节点并不是给每一个IP数据报指派一个不同的标签,而是将属于同样FEC的IP数据报都指派同样的标签。FEC和标签是一一对应的关系。
FEC数据均载
网络管理员采用自定义的FEC就可以更好地管理网络资源。这种均衡网络负载的做法也称为流量工程TE或者通信量工程
MPLS首部
MPLS并不要求下层的网络都使用面向连接的技术。因此一对MPLS路由器之间的物理连接,既可以由一个专用电路组成,也可以使用像以太网这样的网络。
但是这些网络并不提供打标签的手段,而IPv4 数据报首部也没有多余的位置存放MPLS标签。这就需要一个特殊的封装技术:
MPLS首部位置
MPLS首部格式
“给IP数据报打上标签”其实就是在以太网的帧首部和IP数据报的首部之间插入一个4字节的MPLS首部。具体的标签就在“标签值”这个字段中。
MPLS 首部共包括以下四个字段:
(1)标签值:占20 位。由于一个MPLS标签占20 位,因此从理论上讲,在设置MPLS时可以使用标签的所有20位,因而可以同时容纳高达个流(即1048576个流)。但是,实际上几乎没有哪个 MPLS实例会使用很大数目的流,因为通常需要管理员人工管理和设置每条交换路径。
(2)试验:占3位,目前保留用于试验。
(3)S:占1位,S (Stack)表示栈,在有“标签栈”时使用。
(4)生存时间TTL:占8位,用来防止 MPLS分组在 MPLS域中兜圈子。
新一代MPLS
虽然 MPLS能够更快地转发分组,但其有关的控制协议(如 LDP)却比较复杂,其扩展性差,运行维护也较困难。
协议LDP也无法做到基于时延或带宽等要求的流量调度。为了根据需要灵活地选择流量的转发路径,就还需要再使用资源预留协议RSVP(第八章内容)。
但RSVP的信令非常复杂,每个节点都要维护一个庞大的链路信息数据库。此外,RSVP不支持等价多路径路由选择ECMP (Equal-CostMultipath Routing),而只会选择一条最优路径进行转发。
段路由选择协议SR:
为了解决上述问题,一种保留了MPLS的主要特点,但更加简单的新的源路由选择协议出现了。这就是段路由选择协议(Segment Routing),简称为SR。
在SR中,“段(segment)”就是标签,也就是转发指令的一种标识符。SR的工作原理仍然是基于标签交换的,不过现在不需要使用协议LDP,因此简化了设备运行的协议数量。
SR由源节点为发送的报文指定路径,并将路径转换成有序的段列表(Segment List),即 MPLS标签栈,其被封装在分组首部。网络中的其他节点就执行首部中的指令(即标签)进行转发。
有SDN存储器的SR:
整个网络设有控制器,也就是SDN 控制器,控制器收集并掌握全网的拓扑信息和链路状态信息,计算出分组应传送的整个路径。
控制器负责给分组分配SR标签。这些标签指明了分组从源点到终点的路径,当分组到达某个网络节点时,节点就根据分组携带的标签转发到下一个节点。
软件定义网络SDN
在SDN中,数据层面中的交换机是由控制层面进行控制的,这种控制是通过openflow协议来实现的。
时常有人把SDN与openflow放在一起讨论。我们要注重两者差别。
SDN:是一种体系结构,一种设计、构建和管理网络的新方法,其要点就是把网络的控制层面和数据层面分离,进而让控制层面利用软件控制数据层面的设备。
OpenFlow:可以把协议 OpenFlow 看成是在 SDN体系结构中控制层面和数据层面之间的通信接口,它使得控制层面的控制器可以对数据层面中的物理设备或虚拟设备,进行直接访问和操纵。这种控制在逻辑上是集中式的,是基于流的控制。
传统意义的“转发”与SDN的广义转发
传统意义上的数据层面的任务,根据转发表转发分组,转发分组分为以下两个步骤:
- 进行“匹配”:查找转发表中的网络前缀,进行最长前缀匹配。
- 执行“动作”:把分组从匹配结果指明的接口转发出去。
SDN的广义转发分为以下两个步骤:
- 进行“匹配”∶能够对网络体系结构中各层(数据链路层、网络层、运输层)首部中的字段进行匹配。
- 执行“动作”︰不仅转发分组,还可以负载均衡、重写IP首部(类似NAT路由器中的地址转换)。人为地阻挡或丢弃一些分组(类似防火墙一样)
在SDN的广义转发中,完成“匹配+动作”的设备并不局限在网络层工作,因此不再称为路由器,而称为“OpenFlow交换机”或“分组交换机”,或更简单地称为“交换机”。
在SDN中取代传统路由器中转发表的是“流表(Flow Table)"。
流表
在SDN中取代传统路由器中转发表的是“流表(Flow Table)"。因此,流表就是“匹配+动作”的转发表。
一个流就是穿过网络的一种分组序列,而在此序列中的每个分组都共享分组首部某些字段的值。例如,某个流可以是具有相同源IP地址和目的IP地址的所有分组。
OpenFlow交换机中的流表是由SDN远程控制器来管理的。SDN远程控制器通过一个安全信道,使用OpenFlow协议来管理OpenFlow交换机中的流表。
流表项
- 每个OpenFlow交换机必须有一个或多个流表。
- 每一个流表可以包含多个流表项。
- 每个流表项包含三个字段:首部字段值((或称匹配字段)、计数器、动作。
首部字段值
在OpenFlow交换机中,既可以处理链路层的帧,也可以处理网络层的IP分组和运输层的报文。
计数器
动作
类似于指令
SDN的使用场景举例
简单转发
负载均衡
什么是负载均衡?
为了均衡链路S2和S1的通信量,我们规定如下:
- 但凡是由H4发往H5,H6的数据分组,其转发路径为S2—S3交换机。
- 但凡是由H3发往H5,H6的数据分组,其转发路径为S2—S1—S3交换机。
很显然,基于IP目的地址的转发方法不能实现这种负载均衡;而SDN控制器可以通过设置好S2的流表项进行这项操作。
防火墙设置
为了避免外来攻击,S2交换机只接受S1交换机发来的分组,通过流表进行如上控制。
SDN体系结构
SDN体系结构四种关键特征
1.基于流的转发:
SDN 控制的交换机分布在数据层面中,而分组的转发可以基于网络层、运输层和链路层协议数据单元中的首部字段值进行。
SDN 的转发规则都精确规定在交换机中的流表中。所有交换机中的流表项,都是由SDN控制器进行计算、管理和安装的。
这和传统的路由器仅仅根据IP分组的目的地址进行转发,有着很大的区别。
2.数据层面与控制层面分离:在传统的转发设备路由器中,其数据层面与控制层面都处在同一个设备中,因此二者耦合得非常紧密。
但在SDN 中,则把这两个层面分离,使二者不在同一个设备中:
数据层面有许多相对简单但快速的网络交换机。这些交换机在其流表中执行“匹配+动作”的规则;而控制层面则由若干服务器和相应的软件组成,这些服务器和软件决定并管理这些交换机中的流表。
3.位于数据层面交换机之外的网络控制功能:SDN 中的控制层面是用软件实现的,而且软件是处在不同的机器上,并且可能还远离这些网络交换机。
SDN 控制层面包含两个构件:一个是SDN控制器(也就是网络操作系统),另一个由若干个网络控制应用程序组成。
SDN 控制器维护准确的网络状态信息(例如,远程链路、交换机和主机的状态):把这些信息提供给运行在控制层面的各种控制应用程序,以及提供一些方法,使得这些应用程序能够对底层的许多网络设备进行监视、编程和控制。
需要注意的是,图中SDN控制器中只画了一个服务器,但这只是强调在逻辑上是集中控制的。实际上,在控制层面中总是使用多个分散的服务器协调地工作,以便实现可扩展性和高可用性。
4.可编程的网络:通过在控制层面的一些网络控制应用程序,使整个网络成为可编程的。
这些应用程序相当于SDN 控制层面中的“大脑”,SDN 控制器使用这些应用程序,在这些网络设备中指明和控制数据层面。
例如,路由选择网络控制应用程序能够确定在源点和终点之间的端到端路径(这需要执行某种算法,也需要使用由SDN控制器维护的节点状态和链路状态信息)。
网络应用程序还可以进行接入控制:即决定哪些分组在进入某个交换机时就必须被阻挡住。此外,网络应用程序在转发分组时还可以执行负载均衡的措施。
SDN控制器的三个层次
通信层:位于最下层,其任务是完成SDN控制器与受控的网络设备之间的通信。
显然,要完成这样的通信,我们必须有一个协议,用来在SDN 控制器与这些设备之间传送信息。此外,这些设备还必须能够向SDN控制器传送在本地观察到的事件。
(例如,用一个报文指示某条链路正常工作或出了故障断开了,或指示某个设备刚刚接入到网络中,或者某种信号突然出现可以表示某个设备已加电并可以工作)。
网络范围的状态管理层:位于中间的一层,SDN 控制层面若要做出任何最终的控制决定,就需要让控制器掌握全网的主机、链路、交换机,以及其他受SDN控制的设备。(例如,在所有的交换机中配置流表以便进行端到端的转发,或实现负载均衡,或实现某种特殊的防火墙能力)
交换机的流表中包含有计数器,而网络应用程序需要使用这些计数器的值。因此,这些计数器的值对网络应用程序来说也必须是可用的。
由于控制层面的最终目的是确定各种被控设备的流表,因此控制器还需要维护这些流表的副本。所有上述这些信息构成由SDN控制器维护的网络范围状态。
到网络控制应用程序层的接口:位于最上方一层,SDN控制器与网络控制应用程序的交互都要通过北接口。
这个 API 接口允许网络控制应用程序对状态管理层里面的网络状态和流表进行读写操作。
网络控制应用程序事先已进行了注册,当状态变化的事件出现时,网络控制应用程序把得到的网络事件进行通告,并采取相应的动作:
例如,计算新的最低开销的路径。这一层可以提供不同类型的 API。
图中的REST (REpresentational State Transfer)即表述性状态传递,是一种针对网络应用的设计和开发方法[W-REST]。
图中的 Intent是对要进行的操作的一种抽象描述[W-INTENT],可用它在组件之间传递数据。
目前已经出现了一些开放源代码控制器,或简称为开源控制器(Open Source Controller),最有代表性的就是 OpenDaylight和 ONOS。这里就不再进行讨论了。