第 0 章 开篇:为何要学 MPLS
如果你第一次听到 MPLS 这个词,多半会觉得它既熟悉又陌生:熟悉是因为它几乎出现在每一张运营商网络架构图里;陌生是因为它的名字“多协议标签交换”听起来就很高冷。别担心,本手册的目标就是用最生活化的语言,把你从“完全没听过”带到“能跟同事讲清楚 SRv6 为什么是下一代”。
0.1 我们为什么需要 MPLS
要理解 MPLS 的存在价值,先要理解“传统 IP 转发”遇到了什么麻烦。在纯 IP 网络中,每台路由器收到一个数据包,都要做一件事:查路由表。路由表里可能有十几万条、上百万条路由,路由器要逐条匹配“最长前缀”,这很消耗算力;更要命的是,传统 IP 路由器做转发决策时,只能基于目的 IP 地址。它无法说“这条流量走便宜链路、那条流量走低延迟链路”,也无法轻松实现“把一个企业的多个分支机构连成一个虚拟私有网络”。
20 世纪 90 年代,互联网流量暴涨,设备厂商开始思考:能不能让网络转发像“电话交换机”那样快、那样可控?于是 MPLS 诞生了。它的核心思想非常朴素:把“每次都重新思考去哪”变成“第一次规划好路径,以后照着走”。这和现实中的城市物流完全一致——货车司机不会每到一个路口就打开地图重新规划,而是出发前就拿到一份“路径清单”。
0.2 MPLS 今天在哪里
你每天用的手机上网、公司总部和分公司的内网互联、银行的核心交易专线,背后几乎都有 MPLS 的身影。三大运营商的 CN2、IP 专网、政企专线,骨干网大概率跑着 MPLS。而在“MPLS 之后”,业界正在向 Segment Routing(段路由),尤其是 SRv6 演进——这是本手册后半段的重头戏。
第 1 章 MPLS 是什么:从“查地址”到“看标签”
1.1 把网络想象成一座大城市
假设你要从北京寄一封信到广州的某个人手里。传统 IP 网络的做法是:每个中转邮局(路由器)拿到信,看一眼收件人地址“广州市天河区……”,然后查自己的“全国地址簿”,决定下一站寄到哪个城市。问题是,所有寄往广州的信,无论你是加急还是平邮、无论你是银行还是视频网站,走的都是同一条默认路径。
MPLS 的做法是:在信的最外面贴一张快递面单,上面印着一个数字编号,比如“1024”。第一个邮局贴上 1024 后,后面每个邮局根本不看收件人地址,只扫这个编号:看到 1024,下一站就去上海;上海邮局把面单换成“2050”,下一站去武汉;武汉再换成“3300”,下一站到广州。整个过程,没有任何一个邮局需要“思考”最终地址,它们只做机械的“换牌”动作。
1.2 MPLS 的全称与本质
MPLS 是 MultiProtocol Label Switching 的缩写,中文叫“多协议标签交换”。拆开看:
- MultiProtocol(多协议):标签不仅能装在 IP 包上,也能装在以太网帧、ATM 信元、帧中继上。也就是说,MPLS 不关心“里面装的是什么”,它只负责“外面贴标签、中间换标签”。
- Label(标签):一个简短的整数,通常是 20 位,最多约 100 万个取值空间。
- Switching(交换):指“基于标签做转发”,类似交换机查 MAC 表那样快,而不是路由器逐包查 IP 表那样慢。
1.3 为什么“标签”能更快
路由器的 IP 转发是“软查找 + 最长前缀匹配”,算法复杂度为 O(W)(W 是地址位数,IPv4 最多 32 位)。而 MPLS 的标签查找是精确匹配的一张表,输入一个标签,输出“出接口 + 新标签”,类似查字典,速度极快,甚至能由专用芯片(ASIC)硬件完成。在流量特别大的骨干网,哪怕是几微秒的差距,乘以每秒几百万个包,累积起来就是巨大的吞吐优势。
1.4 MPLS 解决的三大根本问题
| 传统 IP 的痛点 | MPLS 的解法 |
|---|---|
| 转发只能看目的 IP,路径不可控 | 标签预先规划路径(LSP),可实现流量工程 |
| 难以隔离不同客户、不同业务 | 标签天然区分不同“转发等价类”,轻松做 VPN |
| 服务质量(QoS)难以按流保障 | 标签头部有 EXP 优先级位,可做差分服务 |
| 核心网设备要维护海量路由 | 可只让边缘设备懂路由,核心做简单标签交换 |
第 2 章 核心概念三件套:LSR、LSP 与 FEC
2.1 网络里的三种“角色”
在一个 MPLS 网络里,设备按位置分为三类,记住它们对理解转发过程至关重要:
ingress LER(入节点 / 入口边界路由器)
是“贴标签的人”。它位于 MPLS 域的入口,收到一个普通 IP 包后,根据策略判断“这个包该走哪条 MPLS 路径”,然后压入(Push)一个标签,把 IP 包变成 MPLS 包送进网络。
LSR(Label Switching Router,标签交换路由器)
是“换牌子的人”。位于 MPLS 域中间,收到带标签的包,查标签转发表,把旧标签交换(Swap)成新标签,从另一个接口转发出去。LSR 通常不看 IP 头。
egress LER(出节点 / 出口边界路由器)
是“撕标签的人”。位于 MPLS 域出口,收到最后一个标签包,弹出(Pop)标签,恢复成普通 IP 包,按正常 IP 路由送给最终目的地。
2.2 LSP:标签交换路径
LSP(Label Switched Path,标签交换路径)是数据从入节点到出节点所经过的、由一串标签构成的“隧道”。它是一条单向的逻辑路径。就像快递的“北京→上海→武汉→广州”被预先规划好,LSP 也是预先建立的,中间的 LSR 不需要再做路径决策。
注意 LSP 是单向的:从 A 到 B 是一条 LSP,从 B 回 A 是另一条 LSP,二者独立建立(类似单行车道,对向要另修一条)。
2.3 FEC:转发等价类
FEC(Forwarding Equivalence Class,转发等价类)是 MPLS 里一个非常重要但常被忽略的概念。它回答了一个问题:“哪些包应该走同一条 LSP?”
所谓“等价”,是指网络对某一类包“一视同仁”地做相同处理。FEC 的划分方式非常灵活,可以是:
- 目的 IP 前缀相同(最常见,例如“所有去往 10.1.0.0/16 的包”是一个 FEC);
- 目的地址 + 服务等级相同;
- 属于同一个 VPN 客户;
- 源地址 + 目的地址相同(用于流量工程精细控制)。
每个 FEC 对应一条 LSP。当 ingress 把一个包映射(分类)到某个 FEC 时,就等于决定了它要压入哪个标签、走哪条路径。所以“标签”只是 FEC 的外在编号,真正决定行为的是 FEC。
第 3 章 MPLS 报文结构:标签长什么样
3.1 标签栈:夹心饼干
MPLS 标签不是直接替换 IP 头,而是插在二层帧头和 IP 头之间。看起来像这样:
以太网帧头 | [MPLS 标签 1] [MPLS 标签 2] ... | IP 头 | 数据
(L2) (shim 层,标签栈) (L3) (L4+)
可以插多个标签,叠成一摞,称为标签栈(Label Stack)。最外层(顶部)的标签先生效,越往里越后生效。这就像俄罗斯套娃,或者一封信外面套了好几层转运袋。
3.2 单个标签:32 位精算结构
每个 MPLS 标签固定占 32 比特(4 字节),分成 4 个字段:
| 字段 | 长度 | 含义 |
|---|---|---|
| Label(标签值) | 20 bit | 核心编号,取值 0~2^20-1,决定转发行为 |
| EXP / TC(实验位 / 流量类) | 3 bit | 优先级标记,用于 QoS(现在标准叫 Traffic Class) |
| S(Bottom of Stack) | 1 bit | 栈底标志:0 表示下面还有标签,1 表示这是最后一层 |
| TTL(生存时间) | 8 bit | 防环路,每经过一跳减 1,到 0 丢弃,类似 IP TTL |
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 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 20 bit 标签 3bit 1bit 8bit
3.3 MPLS 与以太网的关系
在以太网上,MPLS 包用什么“类型”标识?以太网帧头的 EtherType 字段会写成 0x8847(单播)或 0x8848(组播)。这样交换机/路由器一看帧类型就知道:“哦,后面跟的是 MPLS,不是纯 IP(0x0800)。”这保证了 MPLS 可以无缝跑在现有二层网络上,不用改造网卡。
第 4 章 工作原理:控制平面与数据平面
4.1 两个平面,两种“思考”
MPLS 的工作可以清晰拆成两个互不打扰的世界:
控制平面(Control Plane)—— “规划路线”
负责建立标签转发表。它通过各种协议(LDP、RSVP-TE、BGP、IS-IS/OSPF 扩展)交换信息,让每台设备知道“收到标签 X 该从哪个口出去、换成什么新标签”。控制平面慢、可以偶尔中断、跑在软件里,它决定“路怎么修”。
数据平面(Data Plane / Forwarding Plane)—— “实际跑车”
负责真正转发每个包。它只看硬件里的标签转发表,做 Push/Swap/Pop,速度极快、跑在 ASIC 芯片上,它决定“车怎么跑”。
4.2 控制平面如何建立 LSP:两种思路
MPLS 建立标签路径有两条主要路线,理解了它们,就理解了 MPLS 的“性格”:
思路一:自底向上(LDP 方式)
LDP(Label Distribution Protocol)的做法是:先有 IP 路由(由 OSPF/IS-IS 算好),然后 LDP 顺着 IP 路由的方向,逐跳分发标签。结果是“沿着最短路径(IGP 算出的路径)建立 LSP”。简单、自动、省心,但路径就是 IGP 最短路径,无法人工指定绕路。
思路二:自顶向下(RSVP-TE 方式)
RSVP-TE(资源预留协议 - 流量工程扩展)的做法是:由源节点主动“预约”一条路径(可以指定经过哪些节点、避开哪些节点、要多少带宽),沿途逐跳向资源管理者“订座”,成功后才建立 LSP。这种方式能实现真正的流量工程,但协议复杂、状态多。
4.3 标签转发表长啥样
数据平面查的是一张叫 LFIB(Label Forwarding Information Base,标签转发信息库)的表。逻辑上长这样:
| 入标签 (In Label) | 入接口 | 操作 (Op) | 出标签 (Out Label) | 出接口 |
|---|---|---|---|---|
| 1024 | Gi0/1 | Swap | 2050 | Gi0/2 |
| 2050 | Gi0/2 | Swap | 3300 | Gi0/3 |
| 3300 | Gi0/3 | Pop | — | Gi0/4 |
设备收到一个带标签 1024 的包,从 Gi0/1 进来,查表:换成 2050,从 Gi0/2 出去。就这么简单、这么快。
第 5 章 标签转发全过程:Push、Swap、Pop
5.1 三个动作,贯穿始终
MPLS 数据平面的全部行为,抽象成三个动词就讲完了:
- Push(压入):在 IP 包前面加一个(或几个)标签。ingress 干这事。
- Swap(交换):把当前顶层标签换成另一个值。中间 LSR 干这事。
- Pop(弹出):撕掉最外层标签。egress 干这事(或倒数第二跳提前撕,见 PHP)。
5.2 完整实例:一次跨城访问
设想公司总部在深圳,分公司在上海,中间经过 MPLS 骨干网(深圳 R1 → 广州 R2 → 武汉 R3 → 上海 R4)。深圳分公司主机 192.168.1.10 要访问上海服务器 10.0.0.5。
步骤 1:ingress R1 收到 IP 包 (src 192.168.1.10, dst 10.0.0.5) 分类到 FEC "去往上海",Push 标签 100(隧道标签) → 发出 [Label=100] + IP包 步骤 2:LSR R2 收到 Label=100 查 LFIB:Swap 100 → 200,从出口2 转发 → 发出 [Label=200] + IP包 步骤 3:LSR R3 收到 Label=200 查 LFIB:Swap 200 → 300,从出口3 转发 → 发出 [Label=300] + IP包 步骤 4:egress R4 收到 Label=300 Pop 撕掉标签,恢复纯 IP 包 按 IP 路由表把包送达 10.0.0.5
关键观察:R2、R3 从头到尾没看过一次 IP 头。它们只扫标签数字。这正是 MPLS 快且可控的根源。
5.3 PHP:倒数第二跳弹出
PHP(Penultimate Hop Popping,倒数第二跳弹出)是 MPLS 里一个非常巧妙的优化。按上面的流程,egress(最后一跳)要负责 Pop。但 egress 其实既要把标签撕掉,又要查 IP 路由做转发,做了“两次查找”。
PHP 的解决办法:让倒数第二跳就提前把标签撕掉,egress 收到的直接就是纯 IP 包,只需做“一次 IP 查找”即可。MPLS 用一个特殊标签值 3 来表示“请下一跳弹标签”。egress 在分发标签时,给倒数第二跳发的是标签 3,R3 收到后就知道:“哦,到 R4 之前我把标签弹了。”
5.4 TTL 与 MPLS 的“可见性”
传统 IP 里,我们用 traceroute 看路径,靠的是 TTL 逐跳减到 0 时设备回 ICMP 超时。MPLS 里,标签也有 TTL。默认情况下,ingress 把 IP TTL 复制到标签 TTL,中间 LSR 只减标签 TTL,不回 ICMP,所以 MPLS 域内部对 traceroute 是“透明”的——你看到的是“进 MPLS 前”和“出 MPLS 后”两个端点,中间黑盒。
如果想让 traceroute 穿透 MPLS 显示每一跳,可以开启 ICMP 隧道超时或 MPLS-aware traceroute(设备回送携带标签信息的 ICMP)。这在排障时很有用。
第 6 章 标签分发协议:LDP 与 RSVP-TE 的取舍
6.1 为什么需要“分发协议”
标签本身没意义,除非全网对“标签 X 代表什么”达成共识。比如 R1 给 R2 发“去往上海我压标签 100”,那 R2 必须知道自己收到 100 后该 Swap 成 200 发给 R3,R3 也要同意 200 对应下一段。这套“谁给谁发什么标签”的协商,就是标签分发协议的任务。
6.2 LDP:简单够用的大多数
LDP 是 MPLS 世界里最经典、部署最广的标签分发协议。它的信条是:“IP 路由怎么走,MPLS 就怎么走。”
- 依赖 IGP(OSPF/IS-IS)先算好路由;
- 邻居间通过 TCP(端口 646)建立会话,交换“前缀→标签”映射;
- 自动为每个 IGP 路由前缀分配标签,建立“顺着最短路径”的 LSP;
- 优点:配置极简(基本一句话开启)、稳定、运维心智负担小;
- 缺点:路径 = IGP 最短路径,无法做精细流量工程、无法预留带宽。
6.3 RSVP-TE:为“控制”而生
RSVP-TE 是资源预留协议加上流量工程扩展。它不是“顺着路由走”,而是“我要订一条特定路线”。
- 源节点可指定显式路径(ERO,Explicit Route Object):“必须经过 R2、R5,避开 R3”;
- 可预留带宽,保证某条 LSP 有专属带宽,避免拥塞;
- 支持快速重路由(FRR),链路故障时 50ms 内切到保护路径(类似环网保护);
- 优点:强大的流量工程、严格的 SLA 保障;
- 缺点:协议复杂、每台设备要维护每条 LSP 的状态(扩展性差)、运维难。
| 维度 | LDP | RSVP-TE |
|---|---|---|
| 路径来源 | IGP 最短路径 | 显式指定 / 约束计算 |
| 带宽预留 | 不支持 | 支持 |
| 快速重路由 | 需配合其他机制 | 原生 FRR |
| 扩展性 | 好(无状态/LSP少) | 一般(每 LSP 有状态) |
| 配置复杂度 | 低 | 高 |
| 典型用途 | 基础 MPLS VPN 承载 | 高价值专线、TE、保护 |
6.4 BGP 在 MPLS 中的特殊角色
除了 LDP/RSVP-TE 分发“公网隧道标签”,MPLS VPN 还需要分发“私网标签”,这靠 MP-BGP(多协议 BGP)。BGP 本来是传互联网路由的,扩展后能携带 VPN 路由和对应的标签。记住:LDP 管“怎么到对端 PE”,BGP 管“哪个客户的哪个网段”,二者配合,VPN 才成立。
第 7 章 MPLS L3VPN:把客户塞进“专属火车车厢”
7.1 问题:多家公司共用一张网,怎么互不干扰
运营商有一张巨大的 MPLS 骨干网。客户 A(银行)和客户 B(视频公司)都想用它互联自己的分支机构。难点在于:A 和 B 可能用了相同的私网地址(比如都用 192.168.1.0/24),运营商的网怎么区分“这是 A 的 192.168.1.0 还是 B 的”?答案就是 MPLS L3VPN。
7.2 三个关键概念:VRF、RD、RT
VRF(VPN Routing and Forwarding,虚拟路由转发实例)
PE(运营商边缘设备)上为每个客户开辟一个独立的“路由表 + 转发表”小空间,叫 VRF。有了 VRF,即使 A 和 B 都用 192.168.1.0/24,在 PE 上它们是两张互不相关的表,互不串门。
RD(Route Distinguisher,路由区分符)
虽然 PE 本地用 VRF 隔开了,但路由要传到对端 PE 的 BGP 里,而 BGP 是全局的。为了解决“相同地址冲突”,给每个 VPN 的每条路由前面拼一个 8 字节的 RD,把 192.168.1.0/24 变成“65001:10-192.168.1.0/24”。这样在 BGP 眼里,A 和 B 的地址就不同了。RD 只为解决“不能重复”的问题,不参与选路。
RT(Route Target,路由目标)
RD 解决了“区分”,RT 解决“谁和谁能通”。RT 是一个团体属性(Community),分 Export(导出时打标签)和 Import(导入时按标签收)。例如 A 公司所有站点都 Export RT=100:1、Import RT=100:1,那么只有同样带 100:1 的路由才会被放进 A 的 VRF。这样就能灵活组建“全互联 VPN”“Hub-Spoke VPN”等拓扑。
| 概念 | 作用 | 类比 |
|---|---|---|
| VRF | PE 上隔离的路由表 | 一节封闭车厢 |
| RD | 让相同地址在 BGP 中唯一 | 车厢编号前缀,防重名 |
| RT | 控制哪些站点互通 | 车票颜色,决定你能进哪节车厢 |
7.3 双层标签:公网隧道 + 私网标签
MPLS L3VPN 转发时,包里其实压了两层标签:
- 外层标签(公网隧道标签):由 LDP/RSVP-TE 分配,负责把包从本端 PE 送到对端 PE(解决“怎么跨越骨干网”)。
- 内层标签(私网标签 / VPN 标签):由 MP-BGP 分配,对端 PE 收到后,靠它知道“该把这个包丢进哪个客户的 VRF”(解决“交给哪个客户”)。
CE --- PE (Push 内层VPN标签 + 外层隧道标签) --- 骨干(LSR Swap外层) --- 对端PE (Pop外层, 按内层标签入VRF) --- CE
7.4 完整流程示例
假设 A 公司北京站点(CE1)要访问上海站点(CE2):
- CE1 把 IP 包发给北京 PE;
- 北京 PE 查 A 的 VRF,发现去往上海私网的下一跳是对端 PE 的 BGP 路由,于是 Push 内层 VPN 标签 Lv,再 Push 外层隧道标签 Lt(去往上海 PE 的 LSP);
- 包带着两层标签进入 MPLS 骨干,中间 LSR 只 Swap 外层 Lt;
- 到达上海 PE(倒数第二跳 PHP 或最后一跳 Pop 外层);
- 上海 PE 看内层标签 Lv,查表知道“Lv 属于 A 公司 VRF 的某接口”,Pop 内层,把纯 IP 包发给 CE2。
整个过程,骨干网 LSR 完全不知道这是哪家客户的什么地址,只当“带标签的包”搬运。隔离性、扩展性都极好。
第 8 章 L2VPN 与 VPLS:让异地像连在同一根线
8.1 L3VPN 与 L2VPN 的区别
L3VPN 里,运营商 PE 参与客户的三层路由(帮客户做 IP 转发、跑路由协议)。但有些客户不想把路由交给运营商,只想把两个站点的二层链路(以太网)在地理上拉直,像一根长网线。这就是 L2VPN。
8.2 VPWS:点对点的“虚拟专线”
VPWS(Virtual Private Wire Service,虚拟私有线缆服务)提供站点 A 到站点 B 的一对一二层透传。PE 把 A 收到的一个以太网帧,原封不动(只加 MPLS 标签)送到 B。客户感觉“两根网线被延长到了一起”。常用于替代传统的 SDH/DDN 专线。
8.3 VPLS:多点的“虚拟交换机”
VPLS(Virtual Private LAN Service,虚拟私有局域网服务)更厉害:它让分散在多地、属于同一客户的多个站点,像连在同一个以太网交换机上。PE 之间通过 MPLS 全连接(或 PW 网格),并在数据平面模拟以太网交换——学习 MAC 地址、广播泛洪、 unknown unicast 泛洪。
8.4 L2VPN 的标签结构
和 L3VPN 类似,L2VPN 也常用“外层隧道标签 + 内层 PW(伪线)标签”。内层 PW 标签标识“这是哪条二层电路/哪个 VPLS 实例”,由信令协议(LDP 的 PW 扩展 或 BGP)分配。VPLS 还需在 PE 间做 MAC 地址学习,复杂度和状态量随站点数平方增长,这是 VPLS 的扩展瓶颈之一。
8.5 EVPN:拯救 L2 的“控制平面革命”
传统 VPLS 用“数据平面泛洪学 MAC”,效率和扩展性都差。后来业界引入 EVPN(Ethernet VPN),用 BGP 来在控制平面提前分发 MAC 地址和可达性,不再靠泛洪。EVPN 既能做二层(替代 VPLS),也能做三层(替代传统 L3VPN),是当今最主流的 VPN 方案。记住:EVPN 是“控制平面”,MPLS/SRv6 是“数据平面承载”,二者可自由组合(EVPN over MPLS、EVPN over SRv6)。
第 9 章 流量工程与 QoS:让网络“听话”
9.1 流量工程(TE)要解决什么
想象城市有两条路去机场:一条近但窄(容易堵),一条远但宽(很空)。传统 IP 路由只看“距离最短”,所有车都挤近路,远路空着。TE 的目标就是让一部分车改走远路,整体不堵。在网络里,这意味着把流量精准地分配到不同链路上,避免局部拥塞、提升利用率。
9.2 MPLS TE 的实现方式
基于前面讲的 RSVP-TE,可以建立“非最短路径”的 LSP:
- 约束路径(C SPF):在 IGP 拓扑上,按“带宽、链路颜色、管理策略”等约束计算路径;
- 带宽预留:LSP 建立时沿途预留资源,保证有路可走;
- 负载均衡:把不同 FEC 映射到不同 LSP,实现“把大象和蚂蚁分开走”;
- 快速重路由 FRR:为主 LSP 预置一条备份路径,链路断了 50ms 内切换,业务几乎无感。
9.3 QoS:用 EXP 位区分“轻重缓急”
MPLS 标签头里有 3 个 EXP 位(现称 TC,Traffic Class),能表示 0~7 共 8 个优先级。设备可以根据 EXP 做:
- 分类与标记:把语音流量标 EXP=5,文件下载标 EXP=0;
- 队列调度:高 EXP 进高优先级队列,优先发送;
- 拥塞避免:拥塞时先丢低 EXP 的包(WRED)。
9.4 MPLS 的“差分服务”哲学
MPLS 网络通常采用差分服务(DiffServ)模型,而不是“逐流保证”。也就是“按类保障”,而不是“为每个视频通话单独开通道”。这既保证了关键业务(语音、信令)的低延迟,又避免了状态爆炸。对绝大多数运营商网络,DiffServ over MPLS 已是标配。
第 10 章 MPLS 的成就与局限:为何要有 SRv6
10.1 MPLS 带来的巨大价值
必须承认,MPLS 统治骨干网二十年,靠的是真功夫:
- 极快转发:标签交换比逐包查路由快得多;
- 天然 VPN:用标签隔离客户,规模巨大;
- 流量工程:能精细控制路径与带宽;
- 成熟稳定:标准完备、厂商互通好、运维经验丰富。
10.2 MPLS 的“阿喀琉斯之踵”
但时代在变,MPLS 的短板越来越明显:
- 协议“全家桶”太重:要跑 MPLS,得同时养 OSPF/IS-IS + LDP + RSVP-TE + BGP + VPN 信令,协议多、状态杂、排障难;
- 控制平面复杂、扩展性差:RSVP-TE 每条 LSP 全网都有状态,大规模时难以为继;
- 与 IPv6/云原生割裂:MPLS 是“另一套体系”,无法直接利用 IPv6 生态、SRv6 可编程、SDN 集中控制等新技术;
- 业务开通慢:跨域、跨运营商建立端到端 LSP 繁琐,难以匹配云时代“分钟级开通”的需求;
- 芯片与运维锁定:MPLS 转发依赖专用标签处理,向新业务演进成本高。
10.3 段路由:把“路牌”换成“导航清单”
下一章开始,我们进入 MPLS 的“继任者”世界——Segment Routing(SR,段路由)。它的核心理念是:不再让每台路由器记住整张标签地图,而是让源头发一份“导航指令清单”,沿途路由器照着清单一步一步走。这就像你出门前在手机里设好“先去加油站,再去超市,最后回家”的导航,一路照做即可,不需要每个路口都有交警指挥。
第 11 章 段路由(Segment Routing)横空出世
11.1 SR 的设计哲学
Segment Routing 由思科等公司提出,后来成为 IETF 标准。它的三个设计原则直指 MPLS 痛点:
- 源路由(Source Routing):路径由入口(源)决定,并把路径编码成一串“段(Segment)”。中间节点无状态,只按指令执行;
- 仅边界有状态:只有源(和可能的尾节点)需要维护路径信息,中间节点零状态,扩展性爆炸式提升;
- 复用现有控制平面:SR 可以直接跑在 IS-IS/OSPF(扩展)或 IPv6 上,不需要 LDP、不需要 RSVP-TE,大幅简化协议栈。
11.2 什么是“段(Segment)”
Segment(段)是 SR 里最小的“指令单元”,代表网络中的某一个“动作目标”,例如:
- 到达某台节点(Node Segment,相当于“去 R3”);
- 经过某条链路(Adjacency Segment,相当于“走 R2-R3 这条线”);
- 进入某个 VPN 实例(VPN Segment);
- 执行某个特定功能(如“到这里做业务链引流”)。
11.3 段序列(Segment List)
把多个 Segment 按顺序排成一列,就是 Segment List(段列表),相当于完整导航路线。例如 [R1, 链路R2-R3, R4] 表示:先到 R1,再走 R2-R3 链路,最后到 R4。源节点把这个列表塞进包里(或在包头指示),沿途设备逐个“消费”段,直到走完。
11.4 SR 的两种数据平面:SR-MPLS 与 SRv6
SR 是“理念”,它可以用两种技术承载:
- SR-MPLS:用 MPLS 标签来装 Segment(把 Segment 编码成标签值)。好处是直接兼容现有 MPLS 设备,是 MPLS 向 SR 演进的平滑路径;
- SRv6:用 IPv6 地址来装 Segment(把 Segment 编码成 128 位 IPv6 地址,放在 IPv6 扩展头里)。好处是原生 IPv6、可编程、面向未来,是终极形态。
下一章先快速过 SR-MPLS,然后我们用大量篇幅攻克 SRv6。
第 12 章 SR-MPLS:给 MPLS 装上“导航清单”
12.1 标签即段
在 SR-MPLS 中,一个 Segment 就是一个 MPLS 标签。Node Segment 对应一个全局标签(如 16003 表示“去节点 3”),Adjacency Segment 对应一个本地标签(如 24003 表示“走某条邻接链路”)。
12.2 段列表 = 标签栈
所谓“段序列”,在 SR-MPLS 里就是一个 MPLS 标签栈。源节点把要依次经过的 Segment 压成一摞标签(顶部是最先执行的段),中间节点照常做 Swap,本质上就是 MPLS 转发——所以 SR-MPLS 不需要新硬件,现有 MPLS 芯片直接支持。这也是它快速普及的原因。
Segment List = [去R1, 走链路R2-R3, 去R4] 映射为标签栈(从底到顶压入): 底层标签: 16004 (Node R4) 中层标签: 24023 (Adj R2-R3) 顶层标签: 16001 (Node R1) <- 先被处理
12.3 SR-MPLS 怎么分发 Segment
关键优势来了:SR-MPLS 不需要 LDP 和 RSVP-TE。Segment 信息通过 IGP 扩展(OSPF/IS-IS 的 SR 扩展)直接在路由协议里广播。每台路由器宣告“我是节点 3,我的 Node-SID 是 16003”,全网自动同步,自动算出任意段的标签路径。协议栈从“OSPF+LDP+RSVP+BGP”精简为“OSPF/IS-IS(带SR扩展)+ BGP”,运维幸福感飙升。
12.4 SR-MPLS 的局限
虽然 SR-MPLS 解决了“协议简化、无状态”,但它终究还是 MPLS 标签体系:
- 标签只有 20 位,能表达的“指令”有限,可编程性弱;
- 仍是“另一套网络层”,与 IPv6、云、主机生态割裂;
- 难以直接在互联网、5G、IoT 等纯 IP 环境端到端部署;
- 对“网络编程”(在沿途插入复杂业务功能)支持不足。
这些局限,正是 SRv6 要彻底解决的。我们正式进入重头戏。
第 13 章 SRv6 基础:用 IPv6 地址当“指令”
13.1 SRv6 是什么
SRv6(Segment Routing over IPv6) 是把 Segment Routing 跑在 IPv6 原生 数据平面上的技术。它最大的颠覆是:不再用 MPLS 标签,而是直接用 IPv6 地址本身来编码“段(指令)”。换句话说,网络里的“导航指令”就是普通的 IPv6 地址,每个地址都代表“到达某处 + 执行某个动作”。
13.2 SID:SRv6 的“段标识符”
在 SRv6 里,Segment 叫做 SID(Segment Identifier)。它就是一个128 位的 IPv6 地址。但和普通的“主机地址”不同,SRv6 的 SID 被人为划分成几个有意义的部分:
| 字段 | 含义 | 说明 |
|---|---|---|
| Locator(定位符) | 路由可达部分 | 类似“街道地址”,保证这个 SID 能被路由到对应节点 |
| Function(功能) | 要执行的指令 | 类似“门牌号后的备注:在此做 VPN 终结/做重定向” |
| Arguments(参数,可选) | 附加参数 | 少数 SID 需要,承载额外控制信息 |
一个 SRv6 SID 的 128 位结构示意: |-------- Locator (例如 64~96 bit) --------|---- Function (例如 32~16 bit) ----| 例如:2001:db8:1:3:: (Locator=节点3) + 4 (Function=End.X 去某邻接) => 完整 SID: 2001:db8:1:3::4
13.3 Locator:让 SID“可被路由”
Locator 是 SID 的前缀部分,它必须能被 IGP/BGP 路由。比如节点 R3 宣告“我负责 2001:db8:1:3::/64 这一段”,那么任何去往以该前缀开头的 SID,都会一路路由到 R3。到达 R3 后,R3 再看 SID 的 Function 部分,决定具体执行什么动作。这就把“如何到达”和“到达后干什么”优雅地编码进同一个地址。
13.4 Function:网络可编程的灵魂
Function 是 SID 的灵魂,它定义了“到达这个节点后要执行什么指令”。这是 SRv6 相比 MPLS 的革命性能力——网络节点可以像执行小程序一样执行 SID。常见 Function 类型(按 IETF 标准命名):
- End:最基础的“终点”动作——弹出当前段,处理下一个段(相当于“到达这里,继续前进”);
- End.X:到达后,把包从指定链路转发出去(Adjacency 段);
- End.T:查指定拓扑表转发(用于多拓扑);
- End.DT4 / End.DT6 / End.DT46:解封装并查 IPv4/IPv6 路由表(用于 SRv6 VPN,对应 MPLS 的私网标签);
- End.DX4 / End.DX6:解封装并直接发给指定下一跳(用于 L2/L3 交叉连接);
- End.B6 / End.BM:绑定到一段 SRv6 策略(Binding SID,做隧道嵌套);
- End.AM:应用层段,用于服务链(把包引向防火墙、DPI 等)。
13.5 SRH:段路由头
既然不用 MPLS 标签栈了,SRv6 靠什么携带“段列表”?答案是 IPv6 的扩展头——SRH(Segment Routing Header,段路由头),Next Header 值为 43(路由头类型 4)。SRH 里装着:
- Segment List[]:完整的目的段序列(多个 SID);
- Segments Left(SL):还剩几个段没处理(类似“导航还剩几站”);
- Last Entry:段列表最后一个元素的索引;
- 可选的类型长度值(TLV),携带 OAM、HMAC 等附加信息。
IPv6 头 (目的地址 = Segment List[SL], 即当前要去的 SID) |--- SRH (段路由头) ---| Segments Left = 2 Segment List = [SID-A, SID-B, SID-C] ^当前在 C(SL=0) 实际 IPv6 目的地址=C |--- 内层原始包 (IP/ payload) ---|
转发时,设备处理完当前 SID,把 Segments Left 减 1,并把 IPv6 目的地址改成段列表里的下一个 SID,然后转发。如此逐级“消费”,直到 SL=0,到达最终目的地。
第 14 章 SRv6 转发机制与编程能力
14.1 两种封装模式
SRv6 向包里插入 SRH 有两种常见方式:
插入模式(Insertion)
在原有 IPv6 包头和净荷之间,直接插入一个 SRH。原包的目的地址被移到段列表(作为最后一段),新的目的地址设为第一个 SID。优点是不额外增加外层 IP 头、开销小;缺点是需要修改原 IPv6 头,某些场景受限。
封装模式(Encapsulation,最常用)
源节点(或入口 PE)把整个原始包作为净荷,外面再套一个新的 IPv6 头 + SRH。外层 IPv6 目的地址设为当前 SID。这类似于“把信装进一个印着导航清单的新信封”。优点是对原包零侵入、兼容性好,是 SRv6 VPN 的标准做法。
封装模式下的报文:
[ 外层 IPv6 头 (dst = 当前SID, nh=43) ]
[ SRH: Segment List=[SID1,SID2,SID3], SL=2 ]
[ 内层: 原始 IPv6/IPv4 包 ]
14.2 节点处理 SRv6 包的标准流程
一个支持 SRv6 的节点收到包后,大致这样做:
- 查 IPv6 目的地址,看它是否匹配本机的某个 SID(Locator 命中);
- 若命中,查该 SID 对应的 Function,执行对应动作(End/End.X/End.DT6 等);
- 若是 End 类,把 SL 减 1,更新目的地址为段列表[SL],转发;
- 若是 End.DT6 类(VPN 终结),解封装,取出内层包,按对应 VRF 路由表转发给客户;
- 若目的地址不是本机 SID,则按普通 IPv6 路由转发(Locator 路由把它送到拥有该 SID 的节点)。
14.3 网络编程:把 SID 当“指令拼图”
SRv6 最迷人的地方是网络编程。因为 SID 自带动作,你可以把一串不同 Function 的 SID 组合起来,描述任意复杂的业务路径。例如要实现一个“总部流量先过防火墙、再走低延迟链路、最后进入分支 VPN”的策略,可以这样拼:
Segment List = [ SID-FW (End.AM: 引流到防火墙做安全检测), SID-LOW (End.X: 走低延迟链路), SID-VPN (End.DT6: 解封装进入分支 VRF 并投递) ]
这在 MPLS 里几乎无法实现(MPLS 标签没有“引流到防火墙”这种语义),但在 SRv6 里只是几个 SID 的组合。这就是“可编程网络”的威力。
14.4 SRv6 与 SDN:天作之合
由于路径完全由源(或控制器下发的头端)决定,SRv6 天然适合 SDN 集中控制。控制器(如华为 iMaster、思科 NSO、开源的 SONiC/Stratum)计算出端到端 Segment List,下发给入口节点。网络中间节点保持“无状态、简单转发”,完美契合云时代“控制与转发分离”的架构。再加上 SRv6 原生 IPv6,能端到端贯通数据中心、广域网、5G 和云,真正实现“一网通达”。
第 15 章 SRv6 应用场景:从 VPN 到切片
15.1 SRv6 L3VPN
对应 MPLS L3VPN,SRv6 用 End.DT4 / End.DT6 SID 做“私网终结”。CE 把 IP 包发给 PE,PE 封装外层 IPv6+SRH(段列表含对端 PE 的 End.DT6 SID),沿途按 SRv6 路由转发,对端 PE 收到后执行 End.DT6:解封装,按内层地址查对应 VRF 表,送给 CE。整个过程不需要 LDP、不需要 RSVP、不需要 MPLS 标签,只用 IPv6 + IGP(SR 扩展)+ BGP(EVPN 传路由)。
15.2 SRv6 L2VPN / EVPN
用 End.DX2(二层交叉连接)等 SID,可以把以太网帧通过 SRv6 隧道透传,实现 VPWS/VPLS 等价功能。更优的是结合 EVPN 作为控制平面,用 BGP 分发 MAC/IP 可达性,数据面走 SRv6。这叫 EVPN over SRv6,是当前城域网、数据中心互联(DCI)的主流方案。
15.3 SRv6 TE(流量工程)
SRv6 的 TE 比 RSVP-TE 简单得多。头端直接构造包含“Node SID + Adjacency SID”的段列表,就能精确指定路径,例如“先到 R2,再强制走 R2-R5 链路,再到 R7”。不需要全网为每条 LSP 维护状态,不需要 RSVP 信令。结合 SR Policy(段路由策略),还能做基于时延、带宽、链路上色的智能选路,以及 TI-LFA(拓扑无关无环路备份,50ms 保护)。
15.4 网络切片(Network Slicing)
5G 和垂直行业(电力、交通、工业)要求“一张物理网,多个逻辑网,彼此 SLA 隔离”。SRv6 的 Locator 可绑定切片 ID,不同切片的流量走不同 Locator 对应的 SID,再配合 Flex-Algo(灵活算法,为不同切片跑独立 IGP 计算)和切片相关的 Function,能实现亚秒级、确定性的硬隔离。这是 MPLS 难以低成本做到的。
15.5 5G 承载与云网融合
3GPP 标准已明确把 SRv6 作为 5G 回传的重要方案。5G 的 CU/DU/UPF 之间需要灵活、低延迟、可编程的连接,SRv6 用标准 IPv6 打通无线、承载、核心网与云,避免了 MPLS 与 IP 两套体系转换的麻烦。同时,SRv6 能直接延伸到云内(Kubernetes、云厂商 VPC),实现“云网一体”。
| 应用 | MPLS 做法 | SRv6 做法 |
|---|---|---|
| L3VPN | LDP隧道+BGP私网标签 | IGP-SR + End.DT6 SID |
| TE | RSVP-TE 信令 | 源端 SR Policy 段列表 |
| 保护 | RSVP FRR | TI-LFA(无状态) |
| 切片 | 复杂、需多层 | Locator+Flex-Algo 原生 |
| 云网延伸 | 需网关转换 | 原生 IPv6 直达 |
第 16 章 SRv6 压缩技术:uSID 与 G-SRv6
16.1 SRv6 的“先天缺点”:报文头太长
SRv6 有个广受批评的问题:每个 SID 是 128 位(16 字节)。如果一条路径要经过 10 个段,SRH 里的段列表就要 160 字节,再加上外层 IPv6 头 40 字节,封装开销巨大。在 MTU 较小、或段数很多的场景,会显著拉低有效吞吐、增加分片风险。于是业界提出压缩 SRv6(Compressed SRv6)。
16.2 uSID(micro SID)
uSID 的思想是:把一个 128 位的 SID,拆成多个短的“微段”。最常见的做法是把 128 位分成 8 个 16 位(或 4 个 32 位)的格子,每个格子放一个 uSID(微段)。这样原本一个 SID 占 16 字节,现在一段路径的多个微段能“挤”进一个 128 位容器里,极大节省空间。
标准 SRv6: [SID1(128bit)][SID2(128bit)][SID3(128bit)] = 48 字节 uSID: [blk | u1 | u2 | u3 | u4 | u5 | u6 | u7] = 16 字节装 7+ 个微段 一个 128 位容器装下整条短路径
16.3 G-SRv6(Generic SRv6)
G-SRv6 是另一派压缩方案(国内标准推动较多),采用“Common Prefix + 变长压缩”的方式:把多个 SID 共享的前缀提取一次,后面只携带变化的“压缩后缀”(如 16/32 位)。既保留 SRv6 的编程能力,又显著降低开销,且对硬件友好。
16.4 压缩技术的意义
压缩 SRv6 解决了“头开销大”这个阻碍 SRv6 规模部署的关键问题,使其在城域、移动回传、甚至对报文效率敏感的场景也能高效运行。今天主流设备厂商均已支持 uSID / G-SRv6,压缩后的 SRv6 与标准 SRv6 可互通,平滑演进。
第 17 章 MPLS 与 SRv6 全面对比与演进路线
17.1 横向对比表
| 维度 | MPLS / SR-MPLS | SRv6 |
|---|---|---|
| 数据平面 | MPLS 标签(32bit, 20bit 值) | IPv6 + SRH(128bit SID) |
| 是否原生 IP | 否,独立垫层 | 是,标准 IPv6 |
| 协议栈 | IGP + LDP/RSVP + BGP | IGP(SR扩展)+ BGP |
| 中间节点状态 | 有(标签表) | 几乎无(仅源/尾端) |
| 可编程性 | 弱(标签无语义) | 强(SID 含 Function) |
| 流量工程 | RSVP-TE 复杂 | SR Policy 源路由,简单 |
| VPN 支持 | 成熟(L3VPN/L2VPN) | 成熟(EVPN over SRv6) |
| 云/5G 延伸 | 需转换网关 | 原生贯通 |
| 硬件要求 | 现有 MPLS 芯片即可 | 需 IPv6/SRH 处理(新芯片) |
| 成熟度 | 极成熟,二十年验证 | 快速成熟,标准持续完善 |
| 头开销 | 小(4 字节/标签) | 大(可压缩优化) |
17.2 演进路线:不是“取代”而是“分层共存”
很多人问“SRv6 会不会淘汰 MPLS?”现实答案是:长期看 SRv6 是方向,但未来十年是共存期。
- 阶段一(已发生):纯 MPLS 网络 → 引入 SR-MPLS,保留 MPLS 转发,简化协议栈;
- 阶段二(进行中):核心/骨干逐步支持 SRv6,新建网络直接上 SRv6;
- 阶段三(未来):SRv6 成为端到端统一底座,MPLS 在存量设备、特定场景长期服役;
- 互通:通过 Binding SID / 网关,MPLS 域和 SRv6 域可以无缝对接,业务不中断迁移。
17.3 如何选型
给实际网络的建议:
- 存量 MPLS 设备多、求稳:继续 MPLS,可平滑加 SR-MPLS;
- 新建广域网/5G 承载/云网:优先 SRv6(配压缩);
- 需要极致可编程、业务链、切片:SRv6 是唯一选择;
- 跨域、跨厂商老设备:MPLS 互通性仍最稳。
第 18 章 实战配置示例(华为风格伪命令)
18.1 MPLS L3VPN 最小配置
下面是一段示意性配置,帮助建立直觉(不同厂商命令不同,但逻辑一致):
# 1) 全局开启 MPLS 与 LDP mpls lsr-id 1.1.1.1 mpls label advertise non-propagonal # 简化示意 mpls ldp route-id 1.1.1.1 # 2) 接口开启 MPLS 与 LDP interface GigabitEthernet0/0/1 mpls mpls ldp # 3) 建立 VRF(客户 A) ip vpn-instance A route-distinguisher 100:1 vpn-target 100:1 export-extcommunity vpn-target 100:1 import-extcommunity # 4) 连接客户的接口绑定 VRF interface GigabitEthernet0/0/2 ip binding vpn-instance A ip address 192.168.1.1 24 # 5) 与对端 PE 建立 MP-BGP,传递 VPNv4 路由 bgp 65000 peer 2.2.2.2 as-number 65000 peer 2.2.2.2 connect-interface LoopBack0 ipv4-family vpnv4 peer 2.2.2.2 enable ipv4-family vpn-instance A import-route direct # 把客户路由引入 VPN
18.2 SRv6 基础配置(示意)
# 1) 启用 IPv6 与 SRv6 ipv6 segment-routing ipv6 locator MYLOC 2001:db8:1::/64 # 本节点 Locator 前缀 opcode ::1 end # 分配 End SID = 2001:db8:1::1 opcode ::2 end-x ge0/0/1 # 分配 Adj SID 走某链路 # 2) IGP (IS-IS) 发布 SRv6 Locator isis 1 ipv6 enable segment-routing ipv6 locator MYLOC # 3) 配置 SRv6 VPN 实例(对应 End.DT6) ip vpn-instance A ipv6-family segment-routing ipv6 locator MYLOC segment-routing ipv6 tunnel-policy ... # 4) BGP EVPN 传递路由,数据面用 SRv6 bgp 65000 peer 2.2.2.2 ipv6-family evpn peer 2.2.2.2 enable
18.3 排障命令直觉
- MPLS:
display mpls lsp看标签路径;display mpls ldp session看邻居;tracert lsp查路径; - SRv6:
display segment-routing ipv6 locator看 SID 分配;display ipv6 routing-table看 Locator 路由;ping ipv6/tracert ipv6验证可达; - 通用:先看 IGP 通不通(Locator/标签前提),再看 BGP 邻居与路由,最后看数据面封装。
第 19 章 学习路径总结与进阶建议
19.1 核心知识地图回顾
我们从“快递贴纸”出发,走完了这样一条路:
- 基础:MPLS 是什么 → 标签/LSR/LSP/FEC → 报文结构 → 控制/数据平面 → Push/Swap/Pop/PHP;
- 协议:LDP 与 RSVP-TE 的取舍 → BGP 在 VPN 中的角色;
- 业务:L3VPN(VRF/RD/RT/双层标签)→ L2VPN/VPLS → EVPN;
- 增强:流量工程、QoS/EXP;
- 演进:MPLS 局限 → Segment Routing 理念 → SR-MPLS → SRv6(SID/Locator/Function/SRH);
- 深入:SRv6 转发与编程、应用(VPN/TE/切片/5G)、压缩(uSID/G-SRv6);
- 对比:MPLS vs SRv6 全面对照与共存演进。
19.2 推荐学习阶梯
| 阶段 | 目标 | 行动建议 |
|---|---|---|
| 入门 | 讲清 MPLS 概念 | 用本手册比喻复述;画一张标签转发流程图 |
| 进阶 | 理解 VPN 与协议 | 在模拟器(EVE-NG/GNS3)搭 MPLS L3VPN 实验 |
| 高级 | 掌握 SR/SRv6 | 读 IETF RFC 8402(SR)、RFC 8986(SRv6);搭 SRv6 实验 |
| 专家 | 面向业务设计 | 研究 EVPN、Flex-Algo、切片、SRv6 编程与压缩 |
19.3 必读 RFC 与标准
- RFC 3031:MPLS 架构(奠基之作,必读);
- RFC 3036:LDP 协议;
- RFC 4364:BGP/MPLS IP VPN(L3VPN 圣经);
- RFC 8402:Segment Routing 架构;
- RFC 8754:IPv6 Segment Routing Header(SRH);
- RFC 8986:SRv6 网络编程(Function 定义大全);
- RFC 9300/9301:SRv6 压缩(uSID)相关。
19.4 给“高手”的最后一句话
真正的高手,不在于背下多少命令,而在于理解“为何这样设计”。MPLS 用标签把“转发”与“路由”解耦,SRv6 进一步把“路径决策”从每台设备收拢到源头、把“网络能力”编码进地址本身。从 MPLS 到 SRv6,是网络从“分布式智能、逐跳协商”走向“集中式编程、源端定义”的范式转移。掌握这条主线,你就能在云、5G、算力网络的时代里,看懂任何一张新一代网络架构图。