SR MPLS Data Plane

本文是在读C. Filsfils et al. 所著的Segment Routing第一卷第三章后所做的总结。

现有MPLS数据平面

SR可以直接应用于MPLS架构,而不需要改变MPLS数据平面。这意味着通常只需要软件升级就可以在节点上启动基本的SR功能,因为现有的MPLS转发硬件可用于SR MPLS。在SR MPLS实现中,SID在数据平面中被编码为MPLS标签。
Segment List被编码为数据包报头中的MPLS标签栈。要处理的active Segment位于数据包标签栈顶部。在完成一个Segment时,相关的标签从栈中弹出。
MPLS架构使用转发等价类FEC (Forwarding Equivalent Class) 的概念来选择入向的数据包将要被映射到的标签交换路径LSP,以及必须对进入MPLS网络的数据包压入哪些标签(如果有的话)。
FEC通常是基于目的地IP前缀创建的。这意味着转发表中的每一个前缀条目与一个FEC相关联。 通过这种方式,在转发表中查找与数据包目的地址相匹配的最长前缀,同时找到数据包对应的FEC,因为FEC就是最长匹配的前缀。为数据包压入的标签,就是与该最长匹配的前缀相关联的标签。
如果FEC是由转发表中对目的地址的最长前缀匹配确定的,那么这等同于常规的基于目的地址的IP转发。要压入的标签,就是转发表中与IP数据包目的地址相匹配的最长前缀所对应的标签。MPLS转发与常规IP逐跳转发的区别在于,数据包到FEC的分类仅在MPLS网络的入口节点处进行,之后数据包沿着LSP转发。即显式路由 (Explicit Routing)。
在SR中,前缀到FEC的映射方式与经典的MPLS相比几乎没有区别,唯一的区别是对应于该FEC的标签实际上是从它的Prefix-SID(IGP/BGP作为信令协议)获得的,而不是由传统的逐跳MPLS信令协议(LDP)分发而来的。

Segment Routing Global Block

SR架构中的SR全局块SRGB (Segment Routing Global Block) 适用于全局Segment的SID集合。 在SR MPLS Data Plane中,SID是一个标签值或是标签的一个索引。本地Segment的SID是本地标签值,而全局Segment的SID是全局唯一的一个索引——SID索引,在给定的节点上,此SID索引指向该节点SRGB内的一个标签。SRGB是给定节点为全局Segment预留的本地标签集合
SID索引是从0开始的,它指向每个节点本地的SRGB中的一个本地标签值。通常,SRGB由单个标签范围组成,在这种情况下,SRGB的第一个标签的值加上SID索引的数字,就可以计算出一个全局Segment的本地标签值。
由于SRGB只是本地有效,因此每个节点必须向其他节点通告它的SRGB。其他节点需要此信息,来计算针对某一特定的SID索引,这个节点期望收到的标签值是什么。每个节点必须分发它的SRGB信息,以及它的全局Segment的SID索引。
如果所有节点都使用相同的SRGB,那么SID索引在所有节点上就会有相同的本地标签值,同时这些相同的本地标签值就等同于全局标签值。SRGB不适用于Local Segment。用于Local Segment的SID是从SRGB之外的标签范围中分配的本地标签。

注意:SRGB不等同于节点中支持的标签范围,它属于该标签范围的一部分,而SRGB之外的标签范围就是用于Local Segment的本地标签。

SR MPLS标签栈操作

MPLS网络节点,即标签交换路由器LSR (Label Switching Router),可以对数据包报头的标签栈执行三个基本操作,这些操作与Segment List的映射关系如下:

Segment List Operations MPLS Label Stack Operations
PUSH,压入 PUSH,压入
CONTINUE,继续 SWAP,交换
NEXT,下一个 POP,弹出

1. 压入MPLS标签
满足以下所有条件,则节点为所收到的不带标签的IP数据包压入Prefix-SID标签。

  • 数据包的IP地址与转发表中的前缀相匹配(使用最长前缀匹配),或者IP地址解析到的下一跳地址(如BGP目的地的BGP下一跳)与转发表中的前缀匹配。
  • 目的地前缀的下一跳,即转发表中该目的地前缀的下游邻居,必须启用SR。
  • 节点被配置为优先压入SR标签,而不是LDP标签,又或者是目的地前缀没有相关联的出向LDP标签。

P54有个例子,很清晰地演示了这个机制。

2. MPLS标签交换
这个比较简单,看下P56的例子就好了。

3. 倒数第二跳节点行为
Prefix Segment的始发节点,可以通过置位或不置位其Prefix-SID通告中的某些标志,来指定该Prefix Segment的倒数第二跳节点的行为。Prefix-SID的始发节点可以请求三种倒数第二跳节点的行为。

  1. 交换为Prefix-SID标签
    倒数第二跳节点将数据包顶层的Prefix-SID的标签交换为相同的Prefix-SID出向标签,这与Prefix Segment路径上的任何其他中间节点行为相同。
  2. 弹出
    倒数第二跳节点把数据包转发到最后一跳节点之前,去除顶层Prefix-SID标签。这就是众所周知的 “倒数第二跳弹出” 行为。
  3. 交换为显式空标签 (Explicit-null Label)
    倒数第二跳节点把数据包转发到最后一跳节点之前,将顶层Prefix-SID标签交换为显式空标签。

3.1. 交换为Prefix-SID标签
这种行为有时被称为 “最后一跳弹出” (UHP, Ultimate Hop Popping),以与倒数第二跳弹出行为区分开来。
使用这种行为模型,最后一跳节点必须对每个数据包执行两次查找:首先必须在它的MPLS转发表中查找数据包的顶层标签,结果会发现这个标签就是它的本地标签,必须被弹出。然后,该节点需要进行第二次查找,并基于第二次查找的结果将数据包转发到目的地。如果所接收到的数据包携带的是单个标签,则第二次查找是IP查找;如果数据包携带多于一个标签,则第二次查找是标签查找。
这种二次查找对于转发性能是有影响的。与绝大多数MPLS协议相似,这种二次查找可以通过 “倒数第二跳弹出” 行为避免。

3.2. 弹出Prefix-SID标签
Prefix Segment的 “倒数第二跳弹出” (PHP, Penultimate Hop Popping)行为与其它MPLS协议(例如LDP或BGP标签单播)实现的行为是相同的。在那些MPLS协议中,最后一跳节点向其上游邻居通告一个隐式空标签 (implicit-null Label),这些上游邻居为收到的隐式空标签在其转发表中安装弹出操作。 在Prefix Segment IGP控制平面中,虽然没用信令向上游通告一个隐式空标签,但是一个节点的IGP控制平面能够知道它是倒数第二跳节点,并相应地将隐式空标签写入转发条目中。这将在第5章中做进一步论述。

3.3. 交换为显式空标签 (Explicit-null Lable)
使用倒数第二跳弹出提高了转发效率,然而它也有缺点: MPLS标签不仅包含标签字段,而且包括流量分类TC (Traffic Class) 字段(先前称为"EXP"位)。MPLS标签中的TC字段传递的是应用于数据包的服务等级。如果数据包到达倒数第二跳时只携带了一个标签,而该标签又被倒数第二跳节点弹出了,那么TC字段也就被移除了,结果编码在MPLS标签中的CoS信息无法到达最后一跳节点,而运行商可能希望将该CoS信息一直传递到最后一跳以用于流量分类。
如果Prefix-SID的始发节点请求的行为是交换为显式空标签,则倒数第二跳节点在将数据包转发到最终跳节点之前,把顶层标签交换为显式空标签。这样,到达最终节点的数据包上总是具有MPLS TC字段的标签,最后一跳可以从MPLS TC字段获得数据包的CoS信息。然而这种行为是有代价的,最后一跳节点必须进行二次查找。
交换为显式空标签行为不限于携带单个标签的数据包。如果数据包的标签栈上有多个标签,则只有顶层标签被交换为显式空标签。
显式空标签的值,也就是MPLS标签字段中的实际值,是保留的标签值:IPv4显式空标签的值为0,IPv6显式空标签的值为2。

Adjacency-SID和MPLS

与Prefix Segment始发节点可以向倒数第二跳请求不同的行为不同,Adjacency Segment的MPLS标签操作总是弹出。(这里弹出的位置是最后一跳节点)

后面有关 “不带标签” 转发条目,MPLS TTL和TC/EXP处理,MPLS负载均衡和MPLS MTU处理的内容,具体看书,比较好理解,这里不多阐述。

注意:MPLS MTU的大小会直接影响报文中允许的最多的标签数 / Segment数。

你可能感兴趣的:(Segment,Routing,计算机网络)