跳到主要内容

RFC 3031 - MPLS 的应用(Some Applications of MPLS)

4. MPLS 的应用(Some Applications of MPLS)​

4.1 MPLS 与逐跳路由流量​

MPLS 的许多用途都要求: 携带某标签 (label) 的分组, 沿着「转发一个网络层目的地址字段为指定地址的分组时」所会使用的同一条逐跳路由路径 (hop-by-hop routed path) 来转发.

4.1.1 为地址前缀分配标签​

一般而言, 路由器 R 确定分组 P 下一跳的方式是: 在其路由表中查找与 P 的目的地址「最长匹配」的地址前缀 X. 也就是说, 某个给定 FEC (转发等价类) 中的分组, 恰好就是那些与 R 路由表中某个给定地址前缀相匹配的分组. 此时, 一个 FEC 可以用地址前缀来标识.

注意: 分组 P 可以被归入 FEC F, 且 FEC F 可以用地址前缀 X 来标识, 即便 P 的目的地址并不匹配 X.

4.1.2 为地址前缀分发标签​

4.1.2.1 某地址前缀的标签分发对等体​

标签交换路由器 (LSR) R1 与 R2 被视为地址前缀 X 的标签分发对等体 (label distribution peers), 当且仅当下列条件之一成立:

  1. R1 到 X 的路由是它经某个特定 IGP 的特定实例学到的, 且 R2 是该 IGP 实例中 R1 的邻居;

  2. R1 到 X 的路由是它经某路由算法 A1 的某个实例学到的, 而该路由被重分发进路由算法 A2 的某个实例, 且 R2 是 R1 在该 A2 实例中的邻居;

  3. R1 是某条位于另一 LSP (标签交换路径) 之内的 LSP 隧道的接收端点, R2 是该隧道的发送端点, 且 R1 与 R2 同属某个 IGP 的同一实例, 并处于同一 IGP 区域中 (若相关 IGP 有区域之分), 且 R1 到 X 的路由是经该 IGP 实例学到的, 或者由 R1 重分发进该 IGP 实例;

  4. R1 到 X 的路由是它经 BGP 学到的, 且 R2 是 R1 的 BGP 对等体.

一般而言, 这些规则确保: 若到某特定地址前缀的路由是经 IGP 分发的, 则该地址前缀的标签分发对等体就是 IGP 邻居; 若到某特定地址前缀的路由是经 BGP 分发的, 则该地址前缀的标签分发对等体就是 BGP 对等体; 而在其它 LSP 隧道情形中, 隧道端点就是标签分发对等体.

4.1.2.2 分发标签​

为了使用 MPLS 按照与任意地址前缀相对应的逐跳路由来转发分组, 每个 LSR 必须:

  1. 为其路由表中出现的每个地址前缀绑定一个或多个标签;

  2. 对每个这样的地址前缀 X, 使用标签分发协议, 把「标签绑定到 X」的分发给 X 的每个标签分发对等体.

还有一种情形, 即使某个 LSR 并不是把标签绑定到地址前缀的那个 LSR, 它也必须分发该标签绑定:

  1. 若 R1 使用 BGP 分发到 X 的路由, 并把另一个 LSR R2 指定为到 X 的 BGP 下一跳 (BGP Next Hop), 且 R1 知道 R2 已把标签 L 绑定到 X, 则 R1 必须把 L 与 X 之间的绑定, 分发给它向其分发该路由的每个 BGP 对等体.

这些规则确保: 与 BGP 路由相对应的地址前缀所对应的标签, 当且仅当这些 BGP 路由被重分发进 IGP 时, 才会被分发给 IGP 邻居; 否则, 绑定到 BGP 路由的标签只会分发给其他 BGP 发言者 (BGP speakers).

这些规则仅用于指明: 一个给定的 LSR 必须把哪些标签绑定分发给哪些其他 LSR.

4.1.3 使用逐跳路径作为 LSP​

若分组 P 需要遵循的逐跳路径是 <R1, ..., Rn>, 则 <R1, ..., Rn> 可以成为一条 LSP, 只要:

  1. 存在唯一的地址前缀 X, 使得对所有 i (1<=i<n), X 都是 Ri 路由表中与 P 的目的地址最长匹配的前缀;

  2. 对所有 i (1<i<n), Ri 已为 X 分配了标签, 并把该标签分发给了 R[i-1].

注意: 分组的 LSP 只能延伸到它所遇到的第一个「转发表中对分组目的地址拥有更长最佳匹配地址前缀」的路由器为止. 在该处, LSP 必须终止, 并且必须重新执行最佳匹配 (best match) 算法.

举例来说, 假设目的地址为 10.2.153.178 的分组 P 需要依次从 R1 经 R2 到 R3. 再假设 R2 向 R1 通告地址前缀 10.2/16, 而 R3 向 R2 通告 10.2.153/23, 10.2.154/23 和 10.2/16. 也就是说, R2 正在向 R1 通告一条「聚合路由」. 在这种情形下, 分组 P 可以一直被标签交换 (label switched) 到 R2; 但由于 R2 执行了路由聚合, 它必须执行最佳匹配算法才能找到 P 的 FEC.

4.1.4 LSP 出口与 LSP 代理出口​

若下列条件之一成立, LSR R 就被视为地址前缀 X 的「LSP 出口」(LSP Egress) LSR:

  1. R 拥有地址 Y, 使得 X 是 R 路由表中与 Y 最长匹配的地址前缀; 或

  2. R 的路由表中包含一个或多个地址前缀 Y, 使得 X 是 Y 的真初始子串, 但 R 对 X 的「LSP 前一跳」(LSP previous hops) 中不包含任何这样的地址前缀 Y; 也就是说, R 是地址前缀 X 的「去聚合点」(deaggregation point).

若下列条件之一成立, LSR R1 就被视为地址前缀 X 的「LSP 代理出口」(LSP Proxy Egress) LSR:

  1. R1 到 X 的下一跳是 R2, 且就 X 而言 R1 与 R2 不是标签分发对等体 (也许因为 R2 不支持 MPLS); 或

  2. R1 已被配置为充当 X 的 LSP 代理出口.

LSP 的定义允许 LSP 出口是一个不支持 MPLS 的节点; 此时, LSP 中倒数第二个节点就是代理出口.

4.1.5 隐式空标签(Implicit NULL Label)​

「隐式空标签」(Implicit NULL label) 是一种具有特殊语义的标签, LSR 可以把它绑定到某个地址前缀. 若 LSR Ru 通过查询其入标签映射 (ILM, Incoming Label Map) 看到: 带标签分组 P 下一步必须转发给 Rd, 而 Rd 已把隐式空标签绑定到相应的地址前缀, 则 Ru 不去替换标签栈顶的标签值, 而是弹出 (pop) 整个标签栈, 然后把所得的分组转发给 Rd.

LSR Rd 把「隐式空标签与地址前缀 X 之间的绑定」分发给 LSR Ru, 当且仅当:

  1. 按照 4.1.2 节的规则, Rd 应当向 Ru 分发 X 的标签绑定, 且

  2. Rd 知道 Ru 支持隐式空标签 (即它能够弹出标签栈), 且

  3. Rd 是 X 的 LSP 出口 (而非代理出口).

这会使 LSP 上倒数第二个 LSR 弹出标签栈. 这样做相当合适: 若 LSP 出口是 X 的 MPLS 出口, 那么在倒数第二个 LSR 不弹出标签栈的情况下, LSP 出口将需要查找标签, 弹出标签栈, 然后再查找下一个标签 (若已无更多标签, 则查找第三层地址). 让倒数第二个 LSR 弹出标签栈, 就为 LSP 出口省去了为了做出转发决策而必须查找两个标签的工作.

然而, 若倒数第二个 LSR 是一台 ATM 交换机, 它可能不具备弹出标签栈的能力. 因此, 隐式空标签的绑定只能分发给支持该功能的 LSR.

若地址前缀 X 的 LSP 中倒数第二个 LSR 是 LSP 代理出口, 它的行为就如同 LSP 出口已经分发了 X 的隐式空标签绑定一样.

4.1.6 可选项: 面向出口的标签分配(Egress-Targeted Label Assignment)​

存在这样的情形: LSP 入口 Ri 知道, 若干个不同 FEC 的分组都必须沿着同一条 LSP 前行, 终止于 (比如说) LSP 出口 Re. 此时, 只需为所有这些 FEC 使用同一个标签, 即可实现正确的路由; 没有必要为每个 FEC 使用互不相同的标签. 当且仅当下列条件成立时:

  1. LSR Re 的地址本身已作为「主机路由」(host route) 存在于路由表中, 且

  2. Ri 有某种办法确定: Re 是某组特定 FEC 中所有分组的 LSP 出口

Ri 就可以把同一个标签绑定到该组中的所有 FEC 上. 这称为「面向出口的标签分配」(Egress-Targeted Label Assignment).

LSR Ri 如何确定某个 LSR Re 是某特定 FEC 中所有分组的 LSP 出口? 有若干种可能的途径:

  • 若网络运行的是链路状态路由算法, 且区域内所有节点都支持 MPLS, 则该路由算法为 Ri 提供了足够的信息, 使其能够确定该 FEC 中的分组经由哪些路由器离开路由域或区域.

  • 若网络运行的是 BGP, Ri 也许能够确定: 某特定 FEC 中的分组必须经由某个特定路由器离开网络, 该路由器是该 FEC 的「BGP 下一跳」.

  • 可以利用标签分发协议来传递「哪些地址前缀『附着』(attached) 在哪些出口 LSR 上」的信息. 这种方法的优点是不依赖链路状态路由的存在.

若采用面向出口的标签分配, 整个网络需要支持的标签数量可以大幅减少. 当使用传统交换硬件来实现 MPLS, 而该硬件只能支持有限数量的标签时, 这一点可能意义重大.

一种可能的做法是: 把网络配置成默认使用面向出口的标签分配, 但把某些 LSR 配置成: 对其作为 LSP 出口的一个或多个地址前缀, 不使用面向出口的标签分配. 我们规定如下规则:

  • 若某个 LSR 不是某组地址前缀的 LSP 出口, 则它对这些地址前缀分配标签的方式, 应当与其在这些地址前缀上的 LSP 下一跳的做法相同. 也就是说, 假设 Rd 是 Ru 在地址前缀 X1 和 X2 上的 LSP 下一跳. 若 Rd 给 X1 和 X2 分配同一个标签, Ru 也应当如此; 若 Rd 给 X1 和 X2 分配不同的标签, Ru 也应当如此.

例如, 假设想把面向出口的标签分配作为默认方式, 但对存在多个可能 LSP 出口的地址前缀 (即多宿主 (multi-homed) 的地址前缀) 分配互不相同的标签. 可以把所有 LSR 都配置成使用面向出口的标签分配, 再把少数几台 LSR 配置成为多宿主地址前缀分配不同的标签. 对于某个特定的多宿主地址前缀 X, 只需在作为 X 的 LSP 出口或 LSP 代理出口的那些 LSR 中进行此项配置即可.

需要着重指出: 若 Ru 与 Rd 是 X1 和 X2 的某条 LSP 中相邻的两个 LSR, 那么, 即使 Ru 给 X1 和 X2 分配不同的标签, 而 Rd 只给它们两者分配同一个标签, 转发仍然会正确进行. 这只意味着 R1 会把不同的入标签映射到同一个出标签上, 这是一种普通情形.

类似地, 若 Rd 给 X1 和 X2 分配不同的标签, 而 Ru 给它们两者都分配与其 LSP 出口 (或代理出口) 的地址相对应的标签, 转发仍然会正确进行. Ru 只需把入标签映射到 Rd 分配给该 LSP 出口地址的那个标签即可.

4.2 MPLS 与显式路由 LSP(Explicitly Routed LSPs)​

与逐跳路由相比, 使用显式路由 (explicit routing) 可能出于多方面的原因. 例如, 它允许路由基于管理策略来建立, 也允许对 LSP 所走的路径进行精心设计, 以支持流量工程 (traffic engineering) [MPLS-TRFENG].

4.2.1 显式路由 LSP 隧道(Explicitly Routed LSP Tunnels)​

在某些情形下, 网络管理员可能希望把某些类别的流量沿某些预先指定的路径转发, 而这些路径不同于该流量通常遵循的逐跳路径. 这样做可以是为了支持策略路由 (policy routing), 也可以是为了支持流量工程. 显式路由可以是预先配置的, 也可以通过某种手段动态确定, 例如基于约束的路由 (constraint-based routing).

MPLS 借助「显式路由 LSP 隧道」(Explicitly Routed LSP Tunnels) 可以轻松做到这一点. 所需要的只是:

  1. 一种选择「哪些分组要被送入显式路由 LSP 隧道」的手段;

  2. 一种建立显式路由 LSP 隧道的手段;

  3. 一种确保「送入隧道的分组不会从接收端点回环到发送端点」的手段.

若隧道的发送端点想把一个带标签分组送入隧道, 它必须首先把栈顶的标签值替换为由隧道接收端点分发给它的标签值, 然后压入与隧道本身相对应的标签, 该标签是由隧道沿途的下一跳分发给它的. 为此, 隧道端点应当互为显式 (explicit) 的标签分发对等体. 它们需要交换的标签绑定, 对隧道沿途的各 LSR 而言并无用处.

4.3 标签栈与隐式对等(Label Stacks and Implicit Peering)​

假设某个 LSR Re 是 10 个地址前缀的 LSP 代理出口, 并且它经由各自不同的接口到达这 10 个地址前缀.

可以为这 10 个地址前缀只分配一个标签. 此时 Re 是这 10 个地址前缀的 LSP 出口. 这确保了这 10 个地址前缀的分组都会被送达 Re; 但这样一来, Re 就不得不查找每个这类分组的网络层地址, 才能选出发送该分组的正确接口.

反过来, 也可以为每个接口分配一个互不相同的标签. 此时 Re 是这 10 个地址前缀的 LSP 代理出口. 这免除了 Re 为转发分组而查找网络层地址的必要; 但这可能需要使用大量的标签.

另一种做法是: 把这 10 个地址前缀都绑定到同一个第 1 层标签 (该标签同时也绑定到该 LSR 自身的地址上), 然后再把每个地址前缀分别绑定到一个互不相同的第 2 层标签. 第 2 层标签被视为第 1 层标签绑定的一个属性, 我们称之为「栈属性」(Stack Attribute). 我们规定如下规则:

  • 当 LSR Ru 首次为一个迄今未打标签的分组打标签时, 若该分组目的地址的最长匹配是 X, 且 Ru 在 X 上的 LSP 下一跳是 Rd, 且 Rd 已向 Ru 分发了「标签 L1 绑定到 X, 并附带栈属性 L2」的绑定, 那么:

    1. Ru 必须先把 L2, 再把 L1 压入该分组的标签栈, 然后把分组转发给 Rd;

    2. 当 Ru 向其标签分发对等体分发 X 的标签绑定时, 必须把 L2 作为栈属性一并包含在内.

    3. 只要栈属性发生变化 (可能是 Ru 在 X 上的 LSP 下一跳发生变化所致), Ru 就必须分发新的栈属性.

注意: 虽然绑定到 X 的标签值在 LSP 的每一跳都可能不同, 但栈属性的值会原样传递, 且由 LSP 代理出口设置.

这样, X 的 LSP 代理出口就成为路由区域或路由域中每个其他 LSR 的「隐式对等体」(implicit peer). 在这种情形下, 显式对等将过于笨重, 因为对等体的数量会过于庞大.

4.4 MPLS 与多路径路由(Multi-Path Routing)​

若某个 LSR 针对某个特定的流 (stream) 支持多条路由, 则它可以给该流分配多个标签, 每条路由一个. 因此, 从某个特定邻居那里收到某特定地址前缀的第二个标签绑定时, 应当将其理解为: 两个标签中的任何一个都可以用来代表该地址前缀.

若为某个特定地址前缀指定了多个标签绑定, 则它们可以具有各不相同的属性.

4.5 作为多点到点实体的 LSP 树(LSP Trees as Multipoint-to-Point Entities)​

考虑分组 P1 和 P2 的情形: 两者的目的地址在整个特定路由域内的最长匹配都是地址前缀 X. 假设 P1 的逐跳路径是 <R1, R2, R3>, 而 P2 的逐跳路径是 <R4, R2, R3>. 再假设 R3 把标签 L3 绑定到 X, 并把该绑定分发给 R2; R2 把标签 L2 绑定到 X, 并把该绑定同时分发给 R1 和 R4. 当 R2 收到分组 P1 时, 其入标签将是 L2; R2 用 L3 覆写 L2, 并把 P1 发往 R3. 当 R2 收到分组 P2 时, 其入标签同样是 L2; R2 再次用 L3 覆写 L2, 并把 P2 继续发往 R3.

于是可以注意到: 当 P1 与 P2 从 R2 传往 R3 时, 它们携带相同的标签; 就 MPLS 而言, 二者无法区分. 因此, 与其谈论两条互不相同的 LSP <R1, R2, R3> 和 <R4, R2, R3>, 不如谈论一棵单一的「多点到点 LSP 树」(Multipoint-to-Point LSP Tree), 可以把它记作 <{R1, R4}, R2, R3>.

当我们试图把传统的 ATM 交换机用作 LSR 时, 这会带来困难. 由于传统 ATM 交换机不支持多点到点连接, 必须有相应的规程来确保每条 LSP 都被实现为点到点 VC. 然而, 若网络中使用的 ATM 交换机支持多点到点 VC, 则 LSP 可以最高效地实现为多点到点 VC. 另外, 若能采用 SVP 多点编码 (SVP Multipoint Encoding, 见 3.25.2 节), 则 LSP 可以实现为多点到点 SVP.

4.6 BGP 边界路由器之间的 LSP 隧道(LSP Tunneling between BGP Border Routers)​

考虑一个在其它自治系统之间承载过境流量的自治系统 A. 自治系统 A 会有若干台 BGP 边界路由器 (BGP Border Routers), 并在它们之间维持一张 BGP 连接的全互联网状 (mesh) 结构, BGP 路由就通过这些连接分发. 在很多这样的情形下, 最好能避免把 BGP 路由分发给那些不是 BGP 边界路由器的路由器. 若能避免, 这些路由器上的「路由分发负载」(route distribution load) 就会显著降低. 然而, 必须有某种手段, 确保过境流量能够由内部路由器从边界路由器送达边界路由器.

这可以借助 LSP 隧道轻松实现. 假设 BGP 路由只分发给 BGP 边界路由器, 而不分发给位于「边界路由器到边界路由器的逐跳路径」上的内部路由器. 那么, LSP 隧道可以按如下方式使用:

  1. 每台 BGP 边界路由器向同一自治系统内的其他每台 BGP 边界路由器分发: 它经由 BGP 分发给该路由器的每个地址前缀所对应的标签.

  2. 该自治系统的 IGP 为每台 BGP 边界路由器维护一条主机路由. 每台内部路由器把这些主机路由所对应的标签分发给它的每个 IGP 邻居.

  3. 假设:

    a) BGP 边界路由器 B1 收到一个未打标签的分组 P;

    b) B1 路由表中的地址前缀 X 是 P 的目的地址的最长匹配;

    c) 到 X 的路由是一条 BGP 路由;

    d) X 的 BGP 下一跳是 B2;

    e) B2 已把标签 L1 绑定到 X, 并已把该绑定分发给 B1;

    f) B2 的地址的 IGP 下一跳是 I1;

    g) B2 的地址在 B1 和 I1 的 IGP 路由表中都作为主机路由存在, 且

    h) I1 已把标签 L2 绑定到 B2 的地址, 并已把该绑定分发给 B1.

    那么, 在把分组 P 发送给 I1 之前, B1 必须为 P 创建一个标签栈, 先压入标签 L1, 再压入标签 L2.

  4. 假设 BGP 边界路由器 B1 收到一个带标签的分组 P, 其标签栈顶的标签对应于某个地址前缀 X, 且到 X 的路由是一条 BGP 路由, 并假设条件 3b, 3c, 3d 和 3e 全部成立. 那么, 在把分组 P 发送给 I1 之前, B1 必须把标签栈顶的标签替换为 L1, 然后压入标签 L2.

有了这些规程, 给定的分组 P 将沿着一条第 1 层 LSP 前行, 该 LSP 的所有成员都是 BGP 边界路由器; 而在第 1 层 LSP 中每对 BGP 边界路由器之间, 它又沿着一条第 2 层 LSP 前行.

这些规程实际上在 BGP 边界路由器之间创建了一条逐跳路由 LSP 隧道 (Hop-by-Hop Routed LSP Tunnel).

由于 BGP 边界路由器相互交换的标签绑定所涉及的地址前缀, 甚至不为 IGP 路由所知, 这些 BGP 路由器应当互为显式的标签分发对等体.

有时, 即使两台 BGP 边界路由器不在同一个自治系统内, 也可能在它们之间建立逐跳路由 LSP 隧道. 例如, 假设 B1 和 B2 位于 AS 1 中. 假设 B3 是 B2 的 EBGP 邻居, 且位于 AS 2 中. 最后, 假设 B2 和 B3 都处于两个自治系统共用的某个网络 (即「非军事区」(Demilitarized Zone)) 上. 此时, 可以按下述方式直接在 B1 与 B3 之间建立 LSP 隧道:

  • B3 使用 EBGP 向 B2 分发路由, 并可选择性 (optionally) 地为地址前缀分配标签;

  • B2 使用 IBGP 把这些路由重分发给 B1, 并指明每条此类路由的 BGP 下一跳是 B3. 若 B3 已为地址前缀分配了标签, B2 会把这些标签原封不动地传递给 B1.

  • AS 1 的 IGP 中有指向 B3 的主机路由.

4.7 逐跳路由 LSP 隧道的其他用途(Other Uses of Hop-by-Hop Routed LSP Tunnels)​

逐跳路由 LSP 隧道的用途并不限于 BGP 下一跳之间的隧道. 任何原本可能使用封装隧道 (encapsulation tunnel) 的场合, 都是适合使用逐跳路由 LSP 隧道的场合. 此时不再用一个目的地址为隧道接收端点地址的新报头来封装分组, 而是把「与隧道接收端点地址的最长匹配地址前缀相对应的标签」压入分组的标签栈. 送入隧道的分组可以已经带标签, 也可以尚未带标签.

若隧道的发送端点想把一个带标签分组送入隧道, 它必须首先把栈顶的标签值替换为由隧道接收端点分发给它的标签值, 然后压入与隧道本身相对应的标签, 该标签是由隧道沿途的下一跳分发给它的. 为此, 隧道端点应当互为显式的标签分发对等体. 它们需要交换的标签绑定, 对隧道沿途的各 LSR 而言并无用处.

4.8 MPLS 与多播(MPLS and Multicast)​

组播 (multicast) 路由通过构造组播树来进行. 某个特定组播分组必须沿其转发的树, 一般取决于该分组的源地址和目的地址. 只要某个特定 LSR 是某个特定组播树中的一个节点, 它就把一个标签绑定到该树上, 然后把该绑定分发给自己在该组播树上的父节点. (若该节点位于某个 LAN 上, 且在该 LAN 上还有兄弟节点, 则它还必须把该绑定分发给这些兄弟节点. 这样, 父节点在向 LAN 上的所有子节点组播时, 就可以使用单一的标签值.)

当一个组播的带标签分组到达时, 与该标签相对应的下一跳标签转发条目 (NHLFE) 指明了该分组的输出接口集合, 以及出标签. 若所有出接口采用相同的标签编码技术, 则同一个分组可以被发送给所有的子节点.