第198篇:MPLS QoS:EXP 位与隧道优先级
关键词:MPLS QoS、EXP位、DSCP、CoS、PHB、队列调度、流量整形、隧道优先级、QoS标记继承、WRR/PQ
一、引言
在第197篇中,我们为大客户专线设计了 CIR/PIR 限速策略和 WRR 队列调度。但限速只是 QoS(Quality of Service)的一部分——当网络拥塞时,如何决定哪些报文优先通过、哪些报文被丢弃?这就是 MPLS QoS 的核心问题。
MPLS 标签头部中包含一个 3 bit 的 EXP(Experimental)字段,最初设计时称为"实验位",后来被 IETF 重新定义为携带 QoS 标记信息。这 3 bit 可以表示 0-7 共 8 个优先级等级,是 MPLS 网络中实现 DiffServ(区分服务)QoS 的关键机制。
二、MPLS 标签头部与 EXP 位
2.1 MPLS 标签格式
+---------+---------+---------+---------+
| 20 bits | 3 | 1 |
| Label | EXP | S |
| (标签值) |(优先)| Bot |
+---------+---------+---------+---------+
| 8 bits |
| TTL (Time To Live) |
+------------------------------------------------+
| 字段 | 长度 | 说明 |
|---|---|---|
| Label | 20 bit | 标签值,0-15 为保留标签 |
| EXP | 3 bit | QoS 实验位,0-7 表示优先级 |
| S | 1 bit | 栈底标记,1 表示最后一个标签 |
| TTL | 8 bit | 生存时间,防止转发环路 |
2.2 EXP 值与优先级映射
MPLS EXP 值通常遵循以下约定(RFC 3912/5462):
| EXP 值 | 对应 DSCP | PHB 类型 | 业务类型 | 丢弃优先级 |
|---|---|---|---|---|
| 0 | DS (000000) | BE | 普通尽力而为业务 | 低丢弃优先(最后丢弃) |
| 1 | CS1 (001000) | EF 低 | 普通数据业务 | - |
| 2 | CS2 (010000) | EF 中 | 交互型数据 | - |
| 3 | CS3 (011000) | AF3 | 视频流(标准质量) | - |
| 4 | CS4 (100000) | AF4 | 视频流(高质量) | - |
| 5 | CS5 (101000) | EF | 语音(VoIP 媒体流) | - |
| 6 | CS6 (110000) | CS6 | 网络控制(OSPF/BGP) | 低丢弃优先(最后丢弃) |
| 7 | CS7 (111000) | CS7 | 保留(ICMP/系统管理) | 低丢弃优先(最后丢弃) |
注意:EXP 值 6-7 优先级最高,在调度时最先被发送(最高优先级队列),同时在 RED(Random Early Detection)拥塞避免时也是最后被丢弃(最低丢弃优先级)。这种设计是为了保护关键的控制面流量——在网络极度拥塞时,高优先级的控制信令报文应当获得最好的转发保障,尽量避免被丢弃。
三、QoS 标记继承机制
3.1 单层标签场景(L3VPN PE→P→PE)
在 L3VPN 场景中,入口 PE 为报文压入一层 MPLS 标签(VPN 标签)。此时 EXP 位的继承方式取决于配置策略:

标记继承策略有三种:
| 继承策略 | 行为 | 适用场景 |
|---|---|---|
| inherit(继承) | MPLS EXP = 内层 IP DSCP 的高 3 bit | 默认策略,端到端 QoS 一致性 |
| pipe | MPLS EXP = 固定值(通常为 0),不继承 | 运营商不想暴露客户 DSCP |
| uniform | MPLS EXP = 内层 IP DSCP 高 3 bit,出口弹出后恢复 DSCP | 标准 DiffServ 模型 |
3.2 双层标签场景(L3VPN PE→P→PE,PHP)
在典型的双层标签转发中(外层 Tunnel 标签 + 内层 VPN 标签),EXP 继承涉及两个标签:

3.3 QoS 配置示例(华为 VRP)
# 入口 PE 配置
<PE-IN> system-view
[PE-IN] sysname PE-IN
# 定义 DSCP 到 EXP 的映射策略(入口)
[PE-IN] qos mapcarule DSCP-TO-EXP
[PE-IN-qos-mapcarule-DSCP-TO-EXP] if-match dscp 0 7
[PE-IN-qos-mapcarule-DSCP-TO-EXP] apply mpls-exp 0 7
[PE-IN-qos-mapcarule-DSCP-TO-EXP] quit
# 定义 EXP 到 DSCP 的映射策略(出口弹出标签后恢复 DSCP)
[PE-IN] qos mapcarule EXP-TO-DSCP
[PE-IN-qos-mapcarule-EXP-TO-DSCP] if-match mpls-exp 0 7
[PE-IN-qos-mapcarule-EXP-TO-DSCP] apply dscp 0 56
[PE-IN-qos-mapcarule-EXP-TO-DSCP] quit
# 创建 QoS 策略
[PE-IN] qos car DSCP-CAR
[PE-IN-qos-car-DSCP-CAR] if-match mapcarule DSCP-TO-EXP
[PE-IN-qos-car-DSCP-CAR] quit
[PE-IN] qos policy QOS-INGRESS
[PE-IN-qos-policy-QOS-INGRESS] car DSCP-CAR inbound
[PE-IN-qos-policy-QOS-INGRESS] quit
# 应用到接口
[PE-IN] interface GigabitEthernet0/0/1
[PE-IN-GigabitEthernet0/0/1] qos apply policy QOS-INGRESS inbound
[PE-IN-GigabitEthernet0/0/1] quit
四、队列调度与拥塞管理
4.1 队列调度算法
| 算法 | 全称 | 工作原理 | 适用场景 |
|---|---|---|---|
| FIFO | First In First Out | 先进先出,无优先级区分 | 低负载、简单场景 |
| PQ | Priority Queue | 严格优先级,高优先级队列不为空时低优先级不发送 | 语音/信令保障 |
| WRR | Weighted Round Robin | 按权重轮询调度各队列 | 多业务均衡保障 |
| WFQ | Weighted Fair Queue | 按流加权公平队列 | 细粒度公平性 |
| WFQ+PQ | 严格优先 + 加权轮询 | 高优先级用 PQ,其余用 WRR | 综合场景(推荐) |
4.2 队列调度配置
# 出口 PE 配置队列调度
<PE-OUT> system-view
[PE-OUT] sysname PE-OUT
# 配置队列调度策略
[PE-OUT] qos queue wrr weight queue 0 weight 1 # BE
[PE-OUT] qos queue wrr weight queue 1 weight 1 # CS1
[PE-OUT] qos queue wrr weight queue 2 weight 2 # CS2
[PE-OUT] qos queue wrr weight queue 3 weight 3 # CS3
[PE-OUT] qos queue wrr weight queue 4 weight 4 # CS4
[PE-OUT] qos queue wrr weight queue 5 weight 8 # CS5 (语音)
[PE-OUT] qos queue wrr weight queue 6 weight 1 # CS6
[PE-OUT] qos queue wrr weight queue 7 weight 1 # CS7
# 队列 5 (CS5/VoIP) 使用严格优先级调度
[PE-OUT] qos queue hq queue 5 mode pq
# 配置 EXP 到队列的映射
[PE-OUT] qos mapcarule EXP-TO-QUEUE
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 0
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 0
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 1
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 1
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 2
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 2
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 3
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 3
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 4
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 4
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 5
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 5
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 6
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 6
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] if-match mpls-exp 7
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] apply queue 7
[PE-OUT-qos-mapcarule-EXP-TO-QUEUE] quit
# 创建 QoS 策略并应用
[PE-OUT] qos car EXP-CAR
[PE-OUT-qos-car-EXP-CAR] if-match mapcarule EXP-TO-QUEUE
[PE-OUT-qos-car-EXP-CAR] quit
[PE-OUT] qos policy QOS-EGRESS
[PE-OUT-qos-policy-QOS-EGRESS] car EXP-CAR outbound
[PE-OUT-qos-policy-QOS-EGRESS] quit
[PE-OUT] interface 100GE1/0/1
[PE-OUT-100GE1/0/1] qos apply policy QOS-EGRESS outbound
[PE-OUT-100GE1/0/1] quit
五、隧道级 QoS:TE 隧道优先级
5.1 TE 隧道优先级与抢占
在 MPLS TE(Traffic Engineering)中,除了报文级的 EXP 优先级,还有隧道级的优先级控制。TE 隧道通过优先级(Priority)参数控制隧道的建立和抢占行为:
| 优先级类型 | 范围 | 说明 |
|---|---|---|
| 建立优先级(Setup Priority) | 0-7 | 0 最高,7 最低,决定隧道建立时的资源分配顺序 |
| 保持优先级(Hold Priority) | 0-7 | 0 最高,7 最低,决定隧道被抢占的难易程度 |
抢占规则:只有当新隧道的建立优先级 高于 已有隧道的保持优先级时,才能抢占已有隧道的资源。
TE隧道A: Setup=3, Hold=3
TE隧道B: Setup=1, Hold=1
当网络带宽不足时:
- 隧道B (Setup=1) 优先于隧道A (Setup=3) 建立
- 隧道B (Setup=1 > Hold=3) 可以抢占隧道A的带宽
- 隧道A (Setup=3 < Hold=1) 不可以抢占隧道B的带宽
5.2 TE 隧道优先级配置
# 创建 TE 隧道并设置优先级
<PE-IN> system-view
[PE-IN] interface Tunnel10
[PE-IN-Tunnel10] tunnel-protocol mpls te
[PE-IN-Tunnel10] mpls te tunnel-id 10
[PE-IN-Tunnel10] mpls te bandwidth priority 1 1 # Setup=1, Hold=1
[PE-IN-Tunnel10] mpls te bandwidth bipreceded-bw 1000 # 1000Mbps
[PE-IN-Tunnel10] destination 20.1.2.1
[PE-IN-Tunnel10] quit
# 低优先级隧道(可被抢占)
[PE-IN] interface Tunnel11
[PE-IN-Tunnel11] tunnel-protocol mpls te
[PE-IN-Tunnel11] mpls te tunnel-id 11
[PE-IN-Tunnel11] mpls te bandwidth priority 5 5 # Setup=5, Hold=5
[PE-IN-Tunnel11] mpls te bandwidth bipreceded-bw 500
[PE-IN-Tunnel11] destination 20.1.2.1
[PE-IN-Tunnel11] quit
六、MPLS QoS 故障案例
6.1 案例:语音通话质量差(高时延与丢包)
故障现象: 某银行部署了 VoIP 系统,语音报文 DSCP 标记为 EF(46,对应 EXP=5)。但在网络高峰期,语音通话出现严重断续和回声。
排查过程:
# 在核心 P 路由器上检查队列状态
<P-Router> display qos queue interface 100GE1/0/1
Queue Interface PKT_IN PKT_OUT DROP BYTES_IN UTIL(%)
0 100GE1/0/1 1234567 1234500 67 123456789 12
5 100GE1/0/1 987654 987600 54 157784576 95 # 队列5利用率极高!
根因分析: 队列 5(语音队列)虽然配置了 PQ(严格优先级),但队列带宽没有做限制。当语音流量突发时,占据了过多带宽,导致其他队列饿死。同时,队列 5 自身也出现了尾丢。
解决方案:
# 为语音队列配置带宽保障和上限
[PE-OUT] interface 100GE1/0/1
[PE-OUT-100GE1/0/1] qos queue hq queue 5 mode pq
[PE-OUT-100GE1/0/1] qos lr queue 5 cir 200 enable # 语音队列保证200Mbps
[PE-OUT-100GE1/0/1] qos car queue 5 cir 500 # 上限500Mbps,防止抢占过多
[PE-OUT-100GE1/0/1] quit
6.2 案例:EXP 标记丢失导致 QoS 失效
故障现象: 客户端标记了 DSCP EF 的语音报文,经过 MPLS 网络后到达出口 PE 时,恢复的 DSCP 值变为 0(Best Effort),导致语音业务在出口被调度到低优先级队列。
根因分析: 出口 PE 上缺少 EXP 到 DSCP 的映射策略,或者 QoS 策略未应用到正确的方向(outbound)。
解决方案:
# 在出口 PE 检查并修复 EXP→DSCP 映射
<PE-OUT> display qos mapcarule EXP-TO-DSCP
# 确认映射规则存在且正确
<PE-OUT> display qos policy QOS-EGRESS interface 100GE1/0/1
# 确认 QoS 策略已应用到 outbound 方向
# 如果映射不存在,补充配置
[PE-OUT] qos mapcarule EXP-TO-DSCP
[PE-OUT-qos-mapcarule-EXP-TO-DSCP] if-match mpls-exp 5
[PE-OUT-qos-mapcarule-EXP-TO-DSCP] apply dscp 46
[PE-OUT-qos-mapcarule-EXP-TO-DSCP] quit
七、总结
MPLS QoS 通过 EXP 位实现跨 MPLS 域的优先级标记传递,结合队列调度与拥塞管理,确保关键业务(语音、视频、信令)在网络拥塞时获得优先保障。
| QoS 机制 | 作用位置 | 功能 | 配置要点 |
|---|---|---|---|
| EXP 标记继承 | 入口 PE | IP DSCP → MPLS EXP 映射 | inherit/pipe/uniform 模式 |
| 队列调度 | 出口 P/PE | 基于 EXP 将报文送入不同优先级队列 | WFQ+PQ 混合调度 |
| 拥塞避免 | 出口 P/PE | RED 在队列拥塞前主动丢弃低优先级报文 | 阈值与概率参数调优 |
| TE 隧道优先级 | TE 隧道 | 控制隧道建立与抢占顺序 | Setup/Hold 优先级分离 |
思考题:
- EXP 值 6-7 的报文在调度时优先级最高(最先发送),在拥塞避免(RED)时也是最后被丢弃(最低丢弃优先级)。为什么网络控制流量需要这样的双重保护?
- Pipe 模型和 Uniform 模型在 QoS 标记继承上有何本质区别?在运营商网络中为什么通常推荐使用 Pipe 模型?
- TE 隧道抢占规则中,为什么需要区分"建立优先级"和"保持优先级"两个独立参数?如果只用一个优先级值会导致什么问题?
下篇预告:第199篇《MPLS OAM:LSP Ping 与 Traceroute》将介绍 MPLS 网络中的操作维护管理(OAM)技术,通过 LSP Ping 和 LSP Traceroute 实现对 MPLS 标签交换路径的端到端检测与故障定位。