「MPLS」- 报文格式

当上层为 MPLS 协议时:
1)以太网头部中,Type==0x8847;
2)在 PPP 中,Header.Protocol==0x8281;

报文格式

Label | 标签

用于携带标签值,长度 20 bit;

EXP | Experimental Use

其主要用于 CoS(Class of Service),长度 3bit;

该字段在早期的 MPLS 标准中被定义,意为试验性的字段,但实际上该字段主要被用于 CoS。为了避免歧义,RFC5462 重新定义该字段,命名为流分类(Traffic Class);

S(Bottom of Stack)

栈底位,指示该标签头部是否为最后一层标签,长度 1-bit;

S==1,则表示当前标签头部为栈底,指示设备该标签为最后一个标签;
S==0,则表示当前标签头部之后依然还有其他标签头部;

TTL(Time To Live)

用于当网络出现环路时,防止标签报文被无限制转发,与 IP-Header.TTL 具有相同的意义,长度 8bit;

IP TTL

根据 RFC 3031 描述,LER 在对 Packet 压入标签时,需要将原 IP Packet 或下层标签中的 TTL 值拷贝到新增加的标签的 TTL 域。LSR 在转发标签分组时,对栈顶标签进行 TTL – 1 操作。标签弹出时,再将栈顶的 TTL 值拷贝回 IP Packet 或下层标签中;

TTL 除了用于防止产生路由环路外,也用于实现 tracert 功能:
  • 若在 Ingress LSR 使用 IP TTL 复制功能,则报文在 LSP 中经过的每一跳都体现为 IP TTL 逐跳递减,tracert 的结果将反映报文实际经过的路径;
  • 若在 Ingress LSR 禁用 IP TTL 复制功能,则报文在 LSP 中经过的跳数不会导致 IP TTL 递减,tracert 的结果不包括 MPLS 骨干网络中每一跳,就好像 Ingress LSR 与 Egress LSR 是直连的;

根据 RFC 3443 描述,其定义两种 MPLS 对 IP Packet TTL 的处理模式:

Uniform Mode(MPLS 拷贝 TTL 字段):报文进入 MPLS Network 时,Ingress LSR 将 IP TTL – 1 映射到 MPLS TTL 字段。报文在 MPLS Network 中传递时,按照标准的 TTL 处理方式处理。报文在离开 MPLS Network 时,Egress LSR 将 MPLS TTL – 1 并映射到 IP TTL 字段;

Pipe Mode(MPLS 创建 TTL 字段):在 Ingress 中,IP TTL – 1,且字段 MPLS TTL 为固定值(华为 255),此后报文在 MPLS Network 中按照标准的 TTL 处理方式处理,在出节点会将 IP TTL – 1,即 IP Packet 经过 MPLS Network 时,无论中间经过多少设备,只在出入节点处将 IP Packet TTL 值分别减少 1;

默认情况下,MPLS 对 TTL 的处理模式为 Uniform;

在实际 MPLS 应用中,出于网络安全的考虑,需要隐藏 MPLS Networking 结构。针对该需求,对于私网报文,Ingress LSR 上不能使用 TTL 的复制功能,以防止 tracert 探测 MPLS Networking 结构。而应该使用 Pipe Mode,在 Ingress 中通过将 TTL 设置为 255,以此忽略业务报文的 TTL 值。

ICMP 响应报文

在 MPLS Networking 中,P 路由器无法对 MPLS 承载的报文进行路由。当 MPLS 报文的 TTL 超时时,ICMP 响应报文将按照 LSP 继续传送,到达 LSP 终点路由器后,再根据 IP 路由转发 ICMP 响应报文。这种处理方式增加了网络流量和报文转发时延。对于仅有一层标签的 MPLS 报文,当 TTL Timeout 时,直接使用 IP 路由返回 ICMP 响应报文;

Label Stack | 标签栈

MPLS 支持一层或多层标签头部,针对这些标签头部的有序集合,其被称为标签栈(Label Stack);

当标签栈中存在多个标签时,这些标签的顺序是非常讲究的:

  • 最靠近 L2 Header 的标签是栈顶标签,标签中的 S==0;
  • 最靠近 L3 Header 的标签是栈底标签,标签中的 S==1;

栈顶也被称为外层标签。栈底也被称为内层标签。

Label Space | 标签空间

Label-Space,标签空间,指标签的取值范围;

注,MPLS Label 仅具有本地意义,即说明每台 LSR 间的 Label Space 是相互独立的,即每台 Router 都可以使用完整的标签空间(即标签值可以重复使用);

标签值的范围及规划如下:

0~15

特殊标签值;

Label==0 被定义为 IPv4 显式空标签(IPv4 Explicit NULL Label)。表示该标签必须被弹出(即标签被剥掉),且报文的转发必须基于 IPv4。如果出节点分配给倒数第二跳节点的标签值为 0,则倒数第二跳 LSR 需要将值为 0 的标签正常压入报文标签值顶部,转发给最后一跳。最后一跳发现报文携带的标签值为 0,则将标签弹出;

Label==2 被定义为 IPv6 显式空标签(IPv6 Explicit NULL Label)。表示该标签必须被弹出,且报文的转发必须基于IPv6。如果出节点分配给倒数第二跳节点的标签值为2,则倒数第二跳节点需要将值为2的标签正常压入报文标签值顶部,转发给最后一跳。最后一跳发现报文携带的标签值为2,则直接将标签弹出。

Label==3 被定义为隐式空标签(Implicit NULL Label)。倒数第二跳LSR进行标签交换时,如果发现交换后的标签值为3,则将标签弹出,并将报文发给最后一跳。最后一跳收到该报文直接进行IP转发或下一层标签转发。

https://support.huawei.com/enterprise/zh/doc/EDOC1100127146/b5b946d#tab_dc_fd_mpls_000501

16~1023

用于 Static LSP、Static CR-LSP 的共享标签空间;

1024~1048575

是 LDP、RSVP-TE、MP-BGP 等动态信令协议的标签空间;动态信令协议的 Label Space 不是共享的,而是独立且连续的,互不影响;

报文示例

Frame 1317: 78 bytes on wire (624 bits), 78 bytes captured (624 bits) on interface -, id 0
Ethernet II, Src: HuaweiTe_1b:39:12 (00:e0:fc:1b:39:12), Dst: HuaweiTe_2e:74:4f (00:e0:fc:2e:74:4f)
MultiProtocol Label Switching Header, Label: 200, Exp: 0, S: 1, TTL: 126
    0000 0000 0000 1100 1000 .... .... .... = MPLS Label: 200 (0x000c8)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 0111 1110 = MPLS TTL: 126
Internet Protocol Version 4, Src: 1.1.1.3, Dst: 3.3.3.4
Internet Control Message Protocol

ICMP Request

Frame 171: 102 bytes on wire (816 bits), 102 bytes captured (816 bits) on interface -, id 0
Ethernet II, Src: HuaweiTechno_52:7c:e2 (00:e0:fc:52:7c:e2), Dst: HuaweiTechno_b9:05:85 (00:e0:fc:b9:05:85)
MultiProtocol Label Switching Header, Label: 1027, Exp: 0, S: 1, TTL: 254
    0000 0000 0100 0000 0011 .... .... .... = MPLS Label: 1027 (0x00403)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 2.2.2.2, Dst: 7.7.7.7
Internet Control Message Protocol

ICMP Reply

Frame 172: 102 bytes on wire (816 bits), 102 bytes captured (816 bits) on interface -, id 0
Ethernet II, Src: HuaweiTechno_b9:05:85 (00:e0:fc:b9:05:85), Dst: HuaweiTechno_52:7c:e2 (00:e0:fc:52:7c:e2)
MultiProtocol Label Switching Header, Label: 1024, Exp: 0, S: 1, TTL: 254
    0000 0000 0100 0000 0000 .... .... .... = MPLS Label: 1024 (0x00400)
    .... .... .... .... .... 000. .... .... = MPLS Experimental Bits: 0
    .... .... .... .... .... ...1 .... .... = MPLS Bottom Of Label Stack: 1
    .... .... .... .... .... .... 1111 1110 = MPLS TTL: 254
Internet Protocol Version 4, Src: 7.7.7.7, Dst: 2.2.2.2
Internet Control Message Protocol

参考文献

MPLS 对 TTL 的处理 – 竞予科技
HuaWei ❀ MPLS 对 TTL 的处理_乐学善思的技术博客_51CTO 博客