MPLS 标签交换
课程(10 节,按顺序学)
第 1 课 · MPLS 到底解决什么问题
入门 · 约 8 分钟
本课目标:搞清楚为什么要在 IP 之上再套一层标签,不然后面全是死记硬背。
传统 IP 转发的痛点
普通路由器收到一个 IP 报文,要拿目的地址去路由表里做最长前缀匹配。
路由表可能有几十万条,前缀长度还不一样(/8、/16、/24…),每一跳都要重新算一遍。
而且骨干网里每台路由器都得装全网路由,规模一大就撑不住。
MPLS 的思路:只在入口查一次
MPLS 换了个思路:
① 在网络入口查一次 IP 路由表,把结果压缩成一个 20bit 的数字 —— 标签(Label)。
② 中间每一跳只看这个定长数字,做精确匹配(哈希/索引,一次搞定),不再碰 IP 头。
③ 到网络出口把标签剥掉,还原成普通 IP 报文。
所以 MPLS 常被叫做 2.5 层协议:它夹在二层(以太网)和三层(IP)之间。
这带来了什么真正的好处
· 中间的 P 设备不需要装全网路由,只需要知道标签怎么换,骨干网可以做得很大。
· 转发路径和 IP 最短路解耦 → 才有了 MPLS TE(流量工程),可以指定绕行、做带宽预留。
· 标签可以嵌套(多层标签栈) → 才有了 MPLS VPN,不同客户地址重叠也不串。
· 故障时可以预置备份标签路径 → FRR 快速重路由,50ms 级切换。
补充一句实话:当年宣传的"转发比 IP 快"在今天的硬件上已经不是重点了,MPLS 今天真正的价值是 VPN 和流量工程。
动手:先看一眼演练用的那条线路
去发包仿真页。你会看到本课程全程要用的那条真实线路:
北京 → 首尔 → 东京 → 旧金山(阿里骨干网的一条跨洋 TE 隧道)。
四台设备排成一条链,两端是 PE(入栈点 / 出栈点),中间两台是 P(只做标签交换)。
先只看右边那张卡片上的两个标签:cost 30 和 预留 1 Gbps。
★ 「预留 1 Gbps」这一条是重点 —— 它是 LDP 压根做不到的事,也是这个场景里非要用 RSVP-TE 的头号理由。第 8 课会展开讲。
现在先别点「开始演练」,把这一课的概念看完再去走。
实验重点
- MPLS = 入口查一次 IP + 中间只看标签 + 出口剥标签
- 标签是 20 bit 的定长数字,做精确匹配
- MPLS 是 2.5 层协议,夹在以太网和 IP 之间
- 今天 MPLS 的核心价值是 VPN 和 流量工程,不是"快"
第 2 课 · 建第一条 LSP:压栈 → 换标 → 弹栈
入门 · 约 15 分钟
本课目标:亲手建一条 LSP,看清 PUSH / SWAP / POP 三个动作分别落在哪台设备上。
先认三个角色
一条 LSP(Label Switched Path,标签交换路径)上的设备只有三种角色:
· Ingress LER(入栈点):唯一做 PUSH 的设备。你问的"MPLS 入栈点怎么建",说的就是这台。
它是整条路径上唯一还要查 IP 路由表的设备。
· Transit LSR(中间交换点):只做 SWAP,把栈顶标签换成下一个。全程不看 IP 头。
· Egress LER(出栈点):做 POP,把标签剥掉,报文变回普通 IP。
口诀:边缘打标签,核心换标签。
动手:走一遍数据转发的那 5 步
去发包仿真页,点「开始演练」,然后连点「下一步」到第 9 步(前 8 步是建隧道的信令,第 3 课再看)。
第 9~12 步就是一个包从北京走到旧金山的全过程:
· 第 9 步 北京:PUSH —— 压入标签 2001
· 第 10 步 首尔:SWAP —— 2001 换成 3001
· 第 11 步 东京:POP —— 标签被弹掉(倒数第二跳,PHP)
· 第 12 步 旧金山:收到的已经是纯 IP 包
重点盯住每一步下面那个「收到时 → 发出时」的标签栈对照。
看懂那条标签链
演练页右边那张「建好之后的转发表」,竖着读一遍:
北京 [入=无 PUSH 出=2001] 首尔 [入=2001 SWAP 出=3001] 东京 [入=3001 POP 出=无 ] 旧金山 [入=无 IP 转发 ]
读法:
· 北京没有入标签 —— 它收到的是普通 IP 报文,本来就没标签。
· 北京的出标签 2001 是 首尔分配并通告给它的,不是北京自己想出来的。
· ★ 上一行的出标签 = 下一行的入标签。这条链一断,包就到不了。
· 旧金山收到的是纯 IP 包(东京提前弹了),只查一次 IP 路由表。
⚠️ 别被 2001 / 3001 这种规整的数字骗了 —— 真实网络里这几个值毫无规律,它们是各台设备各自从自己的标签空间里挑的号。这里排成这样纯粹是为了好认。
动手:再走一遍,这次只看栈
回演练页,用右边的步骤清单直接点第 9 步,然后一步步往后点。
这一遍什么都别管,只看「收到时 → 发出时」那两个标签栈:
空 → [2001] → [3001] → 空。
报文在中间那两跳里一直是 MPLS 报文,进隧道前和出隧道后都是纯 IP ——隧道两端的 IP 包一模一样,中间那段只是被套了个标签。
实验重点
- PUSH 只发生在入栈点,SWAP 在中间,POP 在出栈点(或倒数第二跳)
- 入栈点是唯一还要查 IP 路由表的设备
- 某台设备的出标签 = 它下游邻居分配并通告给它的值
第 3 课 · 标签是谁分配的?(最容易记反的一课)
入门 · 约 12 分钟
本课目标:把"下游分配、向上游通告"这条铁律刻进脑子里。
先定义什么叫上游、下游
按数据流的方向看:报文先经过的是上游,后经过的是下游。
PE1 → P1 → P2 → PE2 这条流里,对 P1 来说:PE1 是上游,P2 是下游。
⚠️ 注意:上下游是针对某一条 LSP / 某个 FEC 说的。同一对邻居,在另一条反向 LSP 上关系正好相反。
铁律:标签由下游分配,向上游通告
为什么是下游分配?
因为标签的含义是"你发给我的时候请贴这个数字,这样我一查表就知道该怎么转"。
只有收报文的那一方才知道自己表里哪个数字是空的、哪个数字对应哪条路。所以必须由接收方(下游)来定。
推论(考试和面试常问):
· 一台设备的入标签是它自己分配的,然后通告给上游。
· 一台设备的出标签是下游送来的礼物,它自己无权决定。
· 所以标签分配的顺序是从出栈点往入栈点倒着来的。
动手:★ 这一课的重点,走 Resv 那 4 步
去发包仿真页,用右边的步骤清单直接点第 5 步,然后一步步点到第 8 步。
这 4 步是 RSVP-TE 的 Resv 消息,也就是标签真正被分配出来的地方:
· 第 5 步 旧金山(出口):先分配,给的是标签 3(隐式空标签)
· 第 6 步 东京:分配 3001,告诉上游首尔「以后发给我贴 3001」
· 第 7 步 首尔:分配 2001,告诉北京
· 第 8 步 北京:收到 2001,隧道 UP
★ 每一步都去看报文里那个标红的 LABEL 对象 —— 它就是「我分配给上游的标签」。
然后对比方向:
· 分配标签:旧金山 → 东京 → 首尔 → 北京 倒着来
· 转发数据:北京 → 首尔 → 东京 → 旧金山 顺着走
这两个方向相反,是本课唯一需要记住的事。
顺便记一下 LDP 的三个维度
真实网络里干这件事的协议叫 LDP(Label Distribution Protocol)。它有三组模式:
· 标签分发方式:DU(下游自主,不等你问我就发)/ DoD(下游按需,你问我才发)。以太网上默认 DU。
· 标签保持方式:自由(邻居给的标签都存着,切换快,费内存)/ 保守(只留当前下一跳的,省内存,切换慢)。默认自由。
· 标签控制方式:有序(等下游给了我才往上游发,保证端到端通了才通告)/ 独立(我自己就能先发)。默认有序。
厂商默认组合基本都是:DU + 自由 + 有序。
实验重点
- 标签由下游分配、向上游通告 —— 记不住就想"标签是给我用的,当然我说了算"
- 入标签 = 自己分配的;出标签 = 下游给的
- 标签分配方向和数据转发方向相反
- LDP 默认:下游自主 DU + 自由保持 + 有序控制
第 4 课 · 读懂三张表:FTN / LFIB / LIB
入门 · 约 10 分钟
本课目标:会看表,才会排障。
FTN —— 只有入栈点有
FTN = FEC To NHLFE。回答的问题是:
"一个普通 IP 报文要进隧道,该压哪个标签、从哪个口出?"
所以它的输入是 IP 前缀,输出是 PUSH 的标签 + 出接口 + 下一跳。
只有入栈点需要这张表,因为只有它面对未打标签的报文。
LFIB —— 所有 MPLS 设备都有
LFIB = Label Forwarding Information Base,也常被拆成 ILM + NHLFE 两部分:
· ILM(Incoming Label Map):入标签 → 该怎么处理
· NHLFE(Next Hop Label Forwarding Entry):具体动作(SWAP/POP + 出标签 + 出接口 + 下一跳)
回答的问题是:"收到标签 X,我该干什么?"
查表方式是定长精确匹配,这是 MPLS 转发快的原因。
⚠️ 关键:入标签是这张表的主键。所以同一台设备上,一个入标签只能对应一条 LSP。
LIB —— 标签的"通告账本"
LIB = Label Information Base,记的是通告关系而不是转发动作:
"我给上游 X 通告了标签 A"、"下游 Y 给我通告了标签 B"。
LIB 里的东西不一定都在用。比如自由保持方式下,你会存着好几个邻居给的标签,但只有当前最优下一跳的那个会被下到 LFIB 里去真正转发。
LIB 是控制平面,LFIB 是数据平面。
动手:对着表做一次「标签接龙」
去发包仿真页,看右边那张「建好之后的转发表」。四台设备四行,第一行标着 FTN,其余三行标着 LFIB —— 正好对应上面讲的两张表。
从第一行开始接龙:
① 北京那行是 FTN:去 4.4.4.4/32 → PUSH 2001。记住 2001。
② 首尔那行是 LFIB:入标签正好是 2001 —— 接上了。它的出标签是 3001。
③ 东京那行:入标签 3001 —— 又接上了。动作是 POP,没有出标签(倒数第二跳弹栈,隧道到这儿就结束了)。
★ 这个「上一行的出标签 = 下一行的入标签」的接龙,就是真机排障时逐跳 display mpls lsp 的标准动作 —— 哪一环接不上,问题就在那台设备上。
实验重点
- FTN:IP 前缀 → PUSH 标签(只有入栈点有)
- LFIB = ILM + NHLFE:入标签 → 动作 + 出标签(所有 MPLS 设备都有)
- LIB:标签通告账本,控制平面
- 入标签是 LFIB 的主键,同一设备上不能重复
第 5 课 · 出栈点的三种玩法:PHP / 显式空标签 / 普通标签
进阶 · 约 12 分钟
本课目标:理解隐式空标签 3 和显式空标签 0,这是面试高频题。
PHP:让倒数第二跳把标签弹了
PHP = Penultimate Hop Popping,次末跳弹出。
出栈点向上游通告 隐式空标签 3(Implicit NULL),含义是:
"标签你自己弹掉,直接把 IP 报文给我。"
于是倒数第二跳的动作从 SWAP 变成 POP,出栈点收到的是纯 IP 报文,只查一次 IP 表。
好处:出栈点省掉了"弹标签 + 查 IP"两次查表中的一次,CPU/ASIC 负担更小。这是厂商默认行为。
⚠️ 极重要:标签 3 永远不会出现在真实报文里,它只是 LDP 通告里的一个约定信号。很多人以为报文里会带个 3,这是错的。
显式空标签 0:为了保住 QoS 优先级
PHP 有个副作用:标签被提前弹掉,MPLS 头里的 EXP(3bit,携带 QoS 优先级) 也就一起没了。
如果需要在出栈点仍然按优先级调度,就让出栈点通告 显式空标签 0(IPv4 Explicit NULL):
· 倒数第二跳做 SWAP,把标签换成 0;
· 报文到达出栈点时仍然是 MPLS 报文(标签值 0,没有转发含义,只是个占位);
· 出栈点自己 POP,读完 EXP 再转发。
代价是出栈点多查一次表。
普通标签:教学最直观
出栈点分配一个正常标签(比如 1027),倒数第二跳正常 SWAP,出栈点自己 POP。
真机上这不是默认行为,但在学习阶段最好用 —— 每一跳都能看到标签在变,不会因为 PHP 提前弹栈而少看一步。
动手:在演练里看 PHP 到底怎么实现的
演练用的这条隧道走的就是 PHP。去发包仿真页看三个地方,把「PHP 是怎么做到的」串起来:
① 第 5 步(旧金山回 Resv):报文里的 LABEL 对象是 3(隐式空标签)。
这就是 PHP 的开关 —— 出口在信令阶段就说了「你别贴标签,直接给我 IP 包」。
② 第 11 步(东京,倒数第二跳):动作是 POP 而不是 SWAP。
因为它查 LFIB 发现出标签是隐式空标签,于是直接把标签弹了。
③ 第 12 步(旧金山):收到的已经是纯 IP 包,只查一次 IP 路由表。
★ 串起来看:信令阶段的一个标签值(3),换来了数据阶段少查一次表。
如果换成普通标签,第 11 步就会是 SWAP,弹栈推迟到第 12 步,出口得查两次表。
实验重点
- 隐式空标签 3 = PHP 信号,只在通告里出现,报文里绝不出现
- 显式空标签 0 = 报文里真的带标签 0,为了保住 EXP 优先级
- PHP 是厂商默认行为,目的是让出栈点少查一次表
第 6 课 · LSP 是单向的(新手第一大坑)
入门 · 约 6 分钟
本课目标:搞清楚为什么"配好了还是 ping 不通"。
一条 LSP 只能走一个方向
LSP 里的每一跳都是"收到标签 X → 换成 Y → 从某个口出"。
这套规则天生是有方向的:反向报文的标签、出接口全都不一样,套不进这条规则。
所以 PE1 → PE2 的 LSP 不能用来承载 PE2 → PE1 的报文。
ping 不通的经典原因
学员配完一条 LSP,ping 不通,然后开始怀疑人生。
实际原因往往是:去程走了 LSP,回程根本没有 LSP(或者回程走了普通 IP 路由,被中间设备丢了)。
解决办法:两个方向各建一条。它们的标签值必然完全不同,因为是两套独立的分配过程。
动手:在演练里验证「它真的是单向的」
去发包仿真页,看右边那张转发表,只问自己一个问题:
「旧金山 → 北京」的报文能用这张表转发吗?
顺着看一遍就知道不行:
· 北京那行是 FTN(IP → 标签),只处理从北京进隧道的报文
· 首尔 / 东京 的 LFIB 里,出接口全都是朝旧金山方向的
· 旧金山那行根本没有入标签 —— 它只是终点,不是起点
★ 这四行表整体只服务一个方向。要跑双向业务,必须再走一遍完整的 RSVP-TE 流程建一条 旧金山 → 北京 的隧道,而那条隧道的标签值和这条毫无关系 —— 因为是另一套独立的分配过程。
实验重点
- LSP 是单向的,双向业务必须建两条
- 两条方向的标签值毫无关系,各自独立分配
- "配好了 ping 不通"第一个要怀疑的就是反向没配
第 7 课 · 自己设计标签 + 常见错误排查
排障 · 约 20 分钟
本课目标:从"看得懂"升级到"自己能设计",并认识四类高频故障。
动手:自己先设计一遍,再对答案
先别看演练页。 拿张纸,给这条隧道自己设计一套标签:
北京 入=____ 动作=____ 出=____ 首尔 入=____ 动作=____ 出=____ 东京 入=____ 动作=____ 出=____ 旧金山 入=____ 动作=____ 出=____
填完再去发包仿真页对照右边那张转发表。重点自查四件事:
① 北京的入标签是不是空的(它收的是 IP 包,本来就没标签)
② 每一行的出标签是不是等于下一行的入标签(标签链有没有断)
③ 你填的标签值是不是都 ≥ 16(0~15 是保留标签,不能拿来用)
④ 东京(倒数第二跳)的动作是不是 POP(因为这条隧道开了 PHP)
★ 标签的具体数值填什么都对(只要 ≥16 且同一台设备上不重复)——要对的是「链」,不是「值」。这是这一课最重要的一句话。
设计标签的四条规矩
① 入栈点没有入标签 —— 它收到的是纯 IP 报文。
② 出栈点没有出标签 —— 它是隧道终点。
③ 上游出标签 == 下游入标签 —— 这条最重要,也最容易错。
④ 同一台设备上入标签不能重复 —— 它是 LFIB 的主键。
另外:标签取值 16 ~ 1048575;0~15 是保留标签不能用于业务;惯例上静态 LSP 用 16~1023,动态协议用 1024 以上。
四类高频故障
① 标签链断裂(最常见)
上游出标签 ≠ 下游入标签。现象:接口 up、IP 路由表完全正常,但业务不通。
报文在下游查 LFIB 时 miss,被静默丢弃,连日志都不一定有。
排查:从入栈点开始逐跳做"标签接龙"。
② 中间某台设备没使能 MPLS
没有 LFIB,标签报文直接丢。真机上 display mpls interface 看一眼。
③ 用了保留标签
填了 0~15。设备可能直接拒绝配置,或者行为诡异。
④ 只建了单向 LSP
见第 6 课。
动手:在纸上把标签链搞断,推演后果
去发包仿真页看那张转发表,然后做一个思想实验 ——
假设首尔那一行的出标签被误配成 3009(而不是 3001):
① 北京照旧 PUSH 2001,发给首尔 → 正常
② 首尔查 LFIB 命中,SWAP 成 3009,发给东京 → 看起来也正常
③ 东京收到 3009,去 LFIB 里查 —— 它只有 3001 这一条,查不到 → 直接丢包
★ 这个故障最阴的地方:
· IGP 完全正常,ping 底层的 IP 路由也通
· 前两跳都不报错,问题出在第三跳
· 报文是静默丢弃的,不会有任何告警
现象就是那句经典的「路由都正常,但业务不通」。
排查方法只有一个:沿着 LSP 逐跳 display mpls lsp,核对「上一跳的 Out Label」是不是等于「这一跳的 In Label」——接不上的那一跳就是故障点。
实验重点
- 上游出标签 = 下游入标签,这是排障第一检查项
- 标签链断裂的现象是"路由正常但不通",报文被静默丢弃
- 0~15 是保留标签,业务不可用
- 真机命令:display mpls lsp / show mpls forwarding-table
第 8 课 · 显式路径与流量工程 TE 入门
进阶 · 约 15 分钟
本课目标:理解为什么 MPLS 能做到"不走最短路",这是 MPLS 至今不可替代的能力。
问题:IP 路由只会走最短路
传统 IP 网络里,路由协议算出最短路,所有流量就都挤在那条路上。
哪怕旁边有一条空闲的备用路,也用不上 —— 因为 IP 转发是逐跳独立决策的,你没法在某一台设备上说"这些流量给我绕道走",下一跳还是会自己算回最短路。
MPLS 的解法:路径在入口就定死了
LSP 建立时,路径已经通过标签一跳跳串好了。
报文一旦被打上标签,就只能沿着这串标签走 —— 中间设备没有选择权,它只会照着 LFIB 换标签。
所以只要在建 LSP 的时候指定一条非最短路的路径,流量就真的会绕道。
这种指定了路径的 LSP 叫 ER-LSP(Explicit Route LSP),靠 RSVP-TE 协议建立。
动手:★ 回头看第 1 课那个反差
去发包仿真页,看第 1 步(北京发 Path)报文里的两个对象 —— 它们分别对应 RSVP-TE 两个 LDP 做不到的能力:
① SENDER_TSPEC:预留 1 Gbps
沿途每一跳都要真的留出 1 Gbps,哪一跳留不出来就回 PathErr、隧道直接建不起来。
LDP 完全没有带宽这个概念 —— 它只管「有没有路」,从不管「路上还有没有容量」。所以关键业务要保障带宽,只能用 RSVP-TE。这是两者最硬的差别。
② ERO:路径写死在配置里
里面写着「必须依次经过首尔、东京」。
⚠️ 老实说:演练这个拓扑是一条直链,没有旁路,所以这条路径同时也就是 IGP 最短路 —— ERO 在这里不是为了绕路。
它的作用是把路径钉死:以后 IGP cost 改了、或者新加了一条链路,隧道也不会跟着漂。LDP 的 LSP 是跟着 IGP 走的,IGP 一变它就变。
★ 而如果拓扑里真有一条更短的旁路(比如一条北京直达东京的海缆),ERO 就能让隧道故意绕开它 —— 那是 RSVP-TE 更出名的用法,理由通常很实在:那条海缆容量紧张、正在检修、或者只在绕行路径上买了保障带宽。
上面第 ① 条(带宽)和第 ② 条(钉死)是这个拓扑里就能看到的,绕路那条需要一个有旁路的拓扑才演得出来。
★ 顺便看一眼那张「这些命令分别在哪台设备上敲」——explicit-path 和 interface Tunnel1 只在北京配,首尔和东京身上一行隧道配置都没有。加一条 TE 隧道只动一台设备。
真实 TE 还会做什么
· 带宽预留:建 LSP 时声明需要 100M,沿路设备记账,不够就换路(CSPF 算路)。
· 亲和属性/链路着色:给链路打标签,要求 LSP 只走某种颜色的链路(比如避开跨海光缆)。
· FRR 快速重路由:提前算好备份路径并下好标签,主路径断了在本地 50ms 内切换,不等 IGP 收敛。
· SR-TE:现在的新做法是 Segment Routing,用标签栈直接把整条路径编码进报文,中间设备不需要维护每条隧道的状态 —— 这是 MPLS 数据平面 + 全新控制平面。
实验重点
- MPLS 能绕道,是因为路径在入口就被标签串定了,中间设备没有选择权
- 指定路径的 LSP 叫 ER-LSP,由 RSVP-TE 建立
- TE 的核心能力:显式路径 + 带宽预留 + FRR 快速重路由
第 9 课 · MPLS VPN 与双层标签
进阶 · 约 20 分钟
本课目标:看懂为什么两个客户都用 192.168.1.0/24 也不会串。
问题:地址重叠
客户 A 和客户 B 都用 192.168.1.0/24。运营商要用同一张骨干网同时给他们提供互联,
如果把两家的路由都塞进同一张路由表,直接冲突。
第一层隔离:VRF
PE 上给每个客户建一个独立的路由表实例,叫 VRF(VPN Routing and Forwarding,华为叫 vpn-instance)。
客户 A 的路由进 VRF-A,客户 B 的进 VRF-B,两张表物理隔离,地址重叠也互不影响。
靠 RD(Route Distinguisher)给路由加前缀让它全局唯一,靠 RT(Route Target)控制路由在哪些 VRF 之间互相引入。
第二层:两层标签栈
报文在骨干网里带两层标签:
· 外层 = 公网标签(LDP 分配):负责把报文从入口 PE 送到出口 PE。骨干网 P 设备只看这一层,它对客户 VPN 一无所知 —— 这就是 P 设备不需要装客户路由的原因。
· 内层 = VPN 标签(由出口 PE 通过 MP-BGP 通告):告诉出口 PE"这个报文属于哪个 VRF / 哪条私网路由"。
转发过程:
① 入口 PE:查 VRF 路由表 → PUSH 内层 VPN 标签 → PUSH 外层公网标签。
② 中间 P:只 SWAP 外层,内层它根本不看。
③ 倒数第二跳:POP 外层(PHP)。
④ 出口 PE:看到内层标签 → 定位到对应 VRF → POP → 在该 VRF 里查私网路由 → 发给 CE。
动手:把演练那条隧道想成 VPN 承载
演练页那条 北京 → 旧金山 的隧道,标签栈全程只有一层(公网标签)。
现在假设它要承载一个客户的 VPN 业务,栈会变成两层 —— 自己推一遍:
北京 PUSH 内层 1050(VPN)+ PUSH 外层 2001(公网) 栈=[2001, 1050] 首尔 只 SWAP 外层 栈=[3001, 1050] 东京 POP 外层(PHP,倒数第二跳) 栈=[1050] 旧金山 看内层 1050 → 定位 VRF → POP → 查私网路由 栈=[]
把它和演练页里的单层栈对照着看,三件事就清楚了:
① 外层标签的变化和演练里一模一样 —— 2001 → 3001 → 弹掉。公网标签管的就是「送到哪台 PE」,跟客户是谁无关。
② 内层 1050 全程没变过。首尔和东京根本没看过它 ——这就是「P 设备不需要知道任何客户路由」的含义。
③ 只有旧金山看内层,靠它判断「这个包属于哪个客户的 VRF」。
★ 所以 MPLS VPN 的可扩展性来自这个分工:骨干只管送到哪,边缘才管属于谁。
顺便记一下 S 位
标签栈里怎么知道哪层是最后一层?靠 MPLS 头里的 S 位(Bottom of Stack,1bit):
最内层标签的 S=1,其它层 S=0。设备读到 S=1 就知道下面紧跟着的是 IP 头了。
实验重点
- 外层公网标签管"送到哪台 PE",内层 VPN 标签管"属于哪个客户"
- P 设备只看外层,所以完全不需要知道客户路由
- VRF 做路由表隔离,RD 让路由全局唯一,RT 控制路由互引
- S 位=1 表示这是栈底标签,下面就是 IP 头
第 10 课 · MPLS 报文头逐比特拆解 + TTL 两种模式
进阶 · 约 10 分钟
本课目标:彻底搞懂那 32 个 bit 里都装了什么。
32 bit 一层,可以叠很多层
一个标签栈条目正好 4 字节:
· Label(20 bit) 标签值,范围 0 ~ 1048575
· EXP / TC(3 bit) QoS 优先级,一般从 IP 的 DSCP 映射
· S(1 bit) 栈底标志,最内层=1
· TTL(8 bit) 生存时间,逐跳减 1
以太网上用 EtherType 0x8847 标识单播 MPLS,0x8848 是组播。
去"报文结构"页可以看到可视化的比特图。
TTL 的 Uniform 模式
· 入栈点 PUSH 时把 IP TTL 减 1 后拷进 MPLS TTL;
· 每个 LSR 减 MPLS TTL;
· 出栈点 POP 时把 MPLS TTL 写回 IP TTL。
结果:用户 traceroute 能看到骨干网每一跳。调试方便,但暴露了内部拓扑。
本实验室的仿真用的是这个模式。
TTL 的 Pipe 模式
· 入栈点 PUSH 时 MPLS TTL 直接设成 255,不管 IP TTL;
· 出栈点 POP 时不把 MPLS TTL 写回,只把 IP TTL 减 1。
结果:整个骨干网在用户看来只有一跳,traceroute 看不到内部设备。
运营商基本都用这个 —— 既隐藏拓扑,也让客户看到的路径更"干净"。
为什么 MPLS 也需要 TTL
因为 MPLS 转发不看 IP 头,IP TTL 帮不上忙。如果标签配错形成环路(比如 A 的出标签指回 B,B 又指回 A),
没有 MPLS TTL 的话报文会永远转下去。有了它,最多 255 跳就被丢掉。
顺带一提:正因为 MPLS TTL 会逐跳递减并回 ICMP,MPLS 网络里的 traceroute 才能工作。
实验重点
- Label 20 + EXP 3 + S 1 + TTL 8 = 32 bit
- EtherType 0x8847 = 单播 MPLS
- Uniform 模式暴露每一跳,Pipe 模式把骨干网隐藏成一跳
- MPLS TTL 的作用是防环,因为 MPLS 转发时不看 IP TTL