跳到主要内容

2. 标签栈

"标签栈"(label stack)由若干"标签栈项"(label stack entry)组成, 每个标签栈项以一种特定的方式表示。标签栈项的长度均为 4 个八位组(32 比特)。

当带标签的数据包在 MPLS 网络中转发时, 它的标签栈会被压入(push)、弹出(pop)或替换(swap)。本节规定了标签栈项的编码方式, 以及标签栈项各字段的处理规则。

2.1. 标签栈项: 格式

标签栈项的格式如下:

        0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Label | Exp |S| TTL |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Label: Label Value, 20 bits
Exp: Experimental Use, 3 bits
S: Bottom of Stack, 1 bit
TTL: Time to Live, 8 bits

2.2. 标签栈项: 字段

标签栈项中各字段的含义如下:

  • 标签(Label)字段: 长度为 20 比特。

  • 实验用途(EXP)字段: 长度为 3 比特。本文档没有规定该字段的具体含义。在标签栈项被压入标签栈, 直到其从标签栈弹出期间, 其含义保持不变。标签栈项被压入标签栈时的含义由压入该标签栈项的 LSR 决定。然而, 当标签栈项被压入时, 其含义可以由标签分发协议指定, 或被赋予"预留"值。标签栈项被弹出后, 其含义不再有意义。

  • S 字段: 长度为 1 比特。S 字段置 1 表示该标签栈项是标签栈中的最后一项(栈底, bottom of stack)。S 字段置 0 表示后面还有更多的标签栈项。

  • 生存时间(TTL)字段: 长度为 8 比特。在带标签的数据包穿越 MPLS 网络时, 用于防止因转发环路而导致数据包无限循环。TTL 字段的处理规则在 2.4 节中规定。

2.3. 标签栈项: 处理规则

当带标签的数据包在标签交换路由器(LSR)处被转发时, 可能会发生以下情况之一:

  • 如果标签栈非空, 则栈顶标签栈项被弹出(popped), 暴露出下一个标签栈项(如果存在的话)。

  • 一个或多个新的标签栈项被压入(pushed)标签栈。

  • 标签栈项被替换(swapped): 栈顶标签栈项被一个新的标签栈项替换, 而该新的标签栈项来自入标签与出标签之间的"标签映射"(由标签分发协议建立)。

  • 标签栈项被原样保留。

替换或压入操作所使用的具体标签值是由标签分发协议建立的标签映射决定的, 不在本文档的讨论范围内。

当 LSR 接收到带标签的数据包时, 必须(在适当的情况下)根据数据链路层头部之后紧跟的内容以及标签栈项中的 S 字段来确定被封装的数据包所使用的网络层协议。特别地:

  • 如果 S 字段为 0, 则被封装的数据包是另一个带标签的数据包(即, 还有更多标签)。

  • 如果 S 字段为 1, 则紧跟在标签栈之后的就是网络层数据包。该数据包的网络层协议由其他因素确定(例如, 由标签分发协议确定, 或由接收到的标签栈项中封装的网络层数据包类型确定)。

在某些数据链路上, 标签栈项可能被"隐式"地表示。例如, 在 ATM 上, 标签可能被编码在 VPI/VCI 字段中。在这些情况下, 标签栈项的编码可能不按照 2.1 节中规定的格式; 而 2.2 节中规定的字段仍然有意义, 只是它们的表示方式有所不同。

2.4. 标签栈项的 TTL 字段

2.4.1. 术语

带标签数据包的"入向 TTL"(incoming TTL)定义如下:

  • 如果该数据包是在 LSR 处首次被加上标签的(即, 它是一个"初始被标签的 IP 数据报"), 那么入向 TTL 就是在加标签之前 IP 数据包的 IP TTL(对 IPv4 而言是 TTL 字段, 对 IPv6 而言是 Hop Limit 字段)的值。

  • 如果该数据包在进入该 LSR 时已经带有标签, 那么入向 TTL 就是该数据包进入时其标签栈栈顶标签栈项中的 TTL 字段的值。

带标签数据包的"出向 TTL"(outgoing TTL)定义为以下两者中的较大者:

  • a) 入向 TTL 减一;

  • b) 零。

2.4.2. 与协议无关的规则

如果带标签数据包的出向 TTL 为 0, 那么该带标签的数据包 MUST NOT 被继续转发; 也不能将标签栈弹出后作为不带标签的数据包进行转发。此时认为该数据包在网络中的生存期已经耗尽。

根据标签栈项中标签值的不同, 该数据包 MAY 被简单地丢弃, 或者 MAY 被传递给相应的"普通"网络层进行错误处理(例如, 生成 ICMP 错误消息, 参见 2.3 节)。

当带标签的数据包被转发时, 标签栈栈顶标签栈项的 TTL 字段 MUST 被设置为出向 TTL 的值。

请注意, 出向 TTL 的值仅仅是入向 TTL 的函数, 与转发前是否压入或弹出了任何标签无关。对于那些不在栈顶的标签栈项, 其 TTL 字段的值没有任何意义。

2.4.3. 与 IP 相关的规则

我们定义"IP TTL"字段为 IPv4 TTL 字段的值, 或 IPv6 Hop Limit 字段的值, 视具体情况而定。

当一个 IP 数据包首次被加上标签时, 标签栈项的 TTL 字段 MUST BE 设置为 IP TTL 字段的值。(如果出于 IP 处理的需要, IP TTL 字段需要被递减, 则假定这一步已经完成。)

当弹出一个标签, 并且弹出后的标签栈变为空时, IP TTL 字段的值 SHOULD BE 被替换为上面所定义的出向 TTL 值。在 IPv4 中, 这还需要修改 IP 头部校验和。

也认识到, 可能存在某些情况, 网络管理者希望 IPv4 的 TTL 在穿越 MPLS 域时仅递减一, 而不是递减该域内 LSP 的跳数。

2.4.4. 在不同封装之间进行转换

有时, 一个 LSR 可能通过(例如)标签交换控制的 ATM(LC-ATM)接口 [9] 接收一个带标签的数据包, 而需要将其从 PPP 或 LAN 链路发出。此时, 入向数据包不会使用本文档规定的封装方式接收, 但出向数据包会使用本文档规定的封装方式发送。

在这种情况下, "入向 TTL"的值由在(例如)LC-ATM 接口上承载带标签数据包所使用的规程确定。随后 TTL 的处理按照上面所述进行。

有时, 一个 LSR 可能通过 PPP 或 LAN 链路接收一个带标签的数据包, 而需要将其从(例如)LC-ATM 接口发出。此时, 入向数据包会使用本文档规定的封装方式接收, 但出向数据包不会使用本文档规定的封装方式发送。在这种情况下, "出向 TTL"值的承载方式由在(例如)LC-ATM 接口上承载带标签数据包所使用的规程确定。