mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
5788 字
17 分钟
运营商骨干网与流量工程:ISP内部如何调度流量
2022-05-13

数据包经过 BGP与域间路由 的策略选路,又由 BGP安全与路由信任 的 RPKI 机制确认路由可信,终于安全地跨越了 AS 边界。但进入一个大型 ISP 的骨干网后,纯 IP 逐跳转发的问题暴露出来——最短路径不等于最优路径,一条链路可能拥塞到丢包,而旁路的链路却空闲着;运营商需要在成百上千台核心路由器之间精确调度流量,IP 路由表做不了这件事。

答案是 MPLS(多协议标签交换)和流量工程(Traffic Engineering)。MPLS 用固定长度的标签替代最长前缀匹配,让转发效率飞跃;流量工程让运营商摆脱”IGP 说走哪就走哪”的被动局面,主动把流量引导到带宽充足的路径上。本章从 ISP 的层次结构出发,深入 MPLS 标签交换、段路由(SR-MPLS/SRv6)、流量工程隧道、MPLS VPN 和运营商 QoS,最后用 GNS3 搭建 MPLS 拓扑亲手验证。

一、ISP的层次结构#

1.1 Tier 1/2/3运营商#

全球互联网的运营商按规模和互联关系分为三个层次:

维度Tier 1Tier 2Tier 3
定义不需要从任何人购买 transit 即可到达全球路由表需要购买部分 transit,但也有对等互联完全依赖上游 transit 提供商
典型代表Lumen、NTT、Telia、Cogent、GTT中国电信、中国联通、Comcast、DT地方宽带运营商、企业专线提供商
互联方式纯对等互联(免费互通)混合(对等 + transit)纯 transit(付费购买)
覆盖范围全球骨干网区域/国家骨干网城市/区域接入网
AS 数量几十个几百个数千个

Tier 1 运营商之间通过免费对等互联实现全球可达——谁也不向谁付费。Tier 2 向 Tier 1 购买 transit 获得全球可达性,同时也与其他 Tier 2 对等互联节省 transit 费用。Tier 3 则完全依赖上游。

Note

中国的情况比较特殊:中国电信(AS4134)、中国联通(AS4837)在国内是 Tier 1 级别的骨干运营商,但到全球路由表仍需通过国际出口与其他 Tier 1 互联。严格来说它们是 Tier 2,但体量已接近 Tier 1。

1.2 运营商网络架构#

一个大型 ISP 的网络通常分为三层:

graph TB subgraph 接入层["接入层 — Access Layer"] A1["BRAS<br/>宽带接入服务器"] A2["DSLAM<br/>铜线接入"] A3["OLT<br/>光纤接入"] A4["无线AC<br/>WiFi/5G"] end subgraph 汇聚层["汇聚层 — Aggregation Layer"] C1["汇聚交换机<br/>L2/L3"] C2["汇聚路由器<br/>策略执行点"] end subgraph 核心层["核心层 — Core Layer"] CR1["核心路由器 P<br/>MPLS转发"] CR2["核心路由器 P<br/>MPLS转发"] CR3["核心路由器 P<br/>MPLS转发"] CR4["核心路由器 P<br/>MPLS转发"] end A1 --> C1 A2 --> C1 A3 --> C2 A4 --> C2 C1 --> CR1 C2 --> CR2 C1 --> CR3 C2 --> CR4 CR1 --- CR2 CR2 --- CR3 CR3 --- CR4 CR1 --- CR4 style 接入层 fill:#e8f5e9,stroke:#2e7d32 style 汇聚层 fill:#fff3e0,stroke:#e65100 style 核心层 fill:#e3f2fd,stroke:#1565c0
  • 接入层:用户接入的第一跳设备,BRAS 负责认证计费和地址分配,OLT/DSLAM 负责物理层终结
  • 汇聚层:汇聚接入层流量,执行 QoS 策略、ACL 过滤、路由聚合
  • 核心层:纯转发,追求极致速度。核心路由器之间用 MPLS 标签交换,不做 IP 最长前缀匹配

核心层的设计原则是”快而不慢”——只做转发,不做策略。所有策略在汇聚层和边缘路由器(PE)上执行。

1.3 POP与骨干节点#

POP(Point of Presence)是运营商在城市或区域部署的网络接入点。一个 POP 通常包含:

  • 边缘路由器(PE):连接客户 CE 路由器,终结 VPN 和接入服务
  • 核心路由器(P):连接其他 POP 的骨干链路
  • 交换矩阵:POP 内部设备互联
  • 传输设备:DWDM/OTN 光传输系统

骨干链路连接不同 POP 的核心路由器,通常采用 DWDM 密集波分复用——一根光纤上跑几十到上百个波长,单波长 100G/400G,总带宽可达几十 Tbps。这些链路是运营商最昂贵的资产,也是流量工程要优化的核心目标。

二、MPLS:多协议标签交换#

2.1 为什么需要MPLS#

IP 转发的核心操作是最长前缀匹配——路由器收到一个包,提取目的 IP,在路由表中逐条比对前缀长度,找到最长匹配的条目。这个操作在软件路由器上很慢(O(W),W 是前缀长度),在硬件上虽然可以用 TCAM 加速,但 TCAM 容量有限、功耗大、成本高。

MPLS 的思路完全不同:在 IP 包前面加一个固定长度的标签,路由器根据标签值查表转发。标签是 20 位整数,查表是精确匹配(O(1)),比最长前缀匹配快得多。

# IP 转发:最长前缀匹配
# 路由表有 50 万条前缀,每个包都要比对
show ip route summary
# Total routes: 834567
# Connected: 12
# OSPF: 2345
# BGP: 832000 ← BGP 路由表巨大
# MPLS 转发:精确匹配标签
# 标签转发表只有几千条,精确匹配
show mpls forwarding-table
# Local Outgoing Prefix Outgoing Next Hop
# Label Label or Tunnel Id Interface
# 10016 20016 10.0.0.1/32 eth0 10.0.1.2
# 10017 20017 10.0.0.2/32 eth1 10.0.2.2

MPLS 的”多协议”体现在:标签交换和底层协议无关——可以承载 IPv4、IPv6、以太网帧甚至 ATM 信元。标签操作在链路层和网络层之间进行,所以 MPLS 也被称为”2.5 层”协议。

2.2 MPLS标签格式#

MPLS 标签是 4 字节(32 位)的固定长度头部,结构如下:

字段位数含义
Label20标签值,范围 0~1048575
TC3流量类别(原 EXP),用于 QoS
S1栈底标志(1=栈底,0=还有更多标签)
TTL8生存时间,每跳减 1,防止环路

几个特殊标签值:

  • 0:IPv4 显式空标签(Explicit Null),PE 发给下游表示”请保留 QoS 信息”
  • 1:路由器告警标签,路由器必须本地处理此包
  • 2:IPv6 显式空标签
  • 3:隐式空标签(Implicit Null),倒数第二跳弹出(PHP,Penultimate Hop Popping)

S 位是 MPLS 标签栈的关键——MPLS 支持标签嵌套,一个包可以携带多个标签。标签栈从栈顶开始处理,S=1 表示这是栈底标签。

2.3 LSP与标签操作#

LSP(Label Switched Path,标签交换路径)是 MPLS 转发的核心概念。一条 LSP 是从入口 LER(Label Edge Router)到出口 LER 的一条有标签的路径,中间的 LSR(Label Switching Router)只根据标签转发。

MPLS 定义了三种标签操作:

  • Push:压入一个新标签(入口 LER 执行)
  • Swap:交换标签——弹出旧标签,压入新标签(中间 LSR 执行)
  • Pop:弹出标签(出口 LER 或倒数第二跳执行)
sequenceDiagram participant IN as 入口LER<br/>PE1 participant P1 as LSR P1 participant P2 as LSR P2 participant OUT as 出口LER<br/>PE2 Note over IN: 收到纯IP包<br/>目的: 10.0.0.2 IN->>P1: Push 100<br/>[100|IP包] Note over IN: 查LFIB: 100→swap 200, eth0 P1->>P2: Swap 200<br/>[200|IP包] Note over P1: 查LFIB: 200→swap 300, eth1 P2->>OUT: Pop(PHP)<br/>[IP包] Note over P2: 倒数第二跳弹出<br/>标签3=隐式空 Note over OUT: 收到纯IP包<br/>正常IP转发

PHP(Penultimate Hop Popping,倒数第二跳弹出)是一个优化:出口 LER 如果还要弹出标签再查 IP 路由表,需要两次查表。让倒数第二跳直接弹出标签,出口 LER 只需一次 IP 查表。出口 LER 向上游通告标签 3(隐式空标签),倒数第二跳收到标签 3 的映射就知道自己该弹出。

2.4 LDP标签分发#

LDP(Label Distribution Protocol,RFC 5036)是 MPLS 最基础的标签分发协议。LDP 的工作很简单:沿着 IGP 路径逐跳分发标签映射

LDP 会话建立过程:

  1. 路由器向 224.0.0.2(All Routers)发送 LDP Hello(UDP 646)
  2. 邻居收到后建立 TCP 会话(TCP 646)
  3. 交换 LDP Initialization 消息协商参数
  4. 进入 Operational 状态,开始交换标签映射
# FRR 中配置 LDP
vtysh
configure terminal
mpls ldp
router-id 1.1.1.1
# 在接口上启用 MPLS + LDP
interface eth0
mpls enable
mpls ldp enable
# 查看 LDP 邻居与标签绑定
show mpls ldp neighbor
# Peer LDP Ident: 2.2.2.2:0; State: oper
show mpls ldp binding
# Destination Local Label Remote Label
# 1.1.1.1/32 imp-null 10016
# 2.2.2.2/32 10017 imp-null

LDP 的标签分发是下游自主分发(Downstream Unsolicited)——不需要上游请求,下游主动把标签映射发给邻居。LDP 分发的标签严格跟随 IGP 路径——IGP 说走哪,LDP 的标签就指向哪。这意味着 LDP 本身不做流量工程,它只是让 MPLS 转发跟上 IGP 的步伐。

2.5 MPLS与IP转发对比#

维度IP 转发MPLS 转发
查表方式最长前缀匹配精确匹配标签
查表复杂度O(W),W=前缀长度O(1)
硬件需求TCAM(贵、功耗大)SRAM(便宜、功耗低)
路由表规模几十万到上百万条几千到几万条
路径决定每跳独立决定入口决定,中间只查标签
流量工程困难(需修改 IGP 度量)原生支持(TE 隧道)
VPN 支持需要额外机制原生支持(L3VPN/L2VPN)
故障恢复IGP 收敛(百毫秒级)FRR(50ms 以下)

MPLS 的核心优势不是”更快”——现代 ASIC 做 IP 最长前缀匹配也很快——而是路径可控功能丰富。入口路由器决定标签,就决定了数据包的路径;标签栈可以嵌套,就能实现 VPN、流量工程等复杂功能。

三、段路由:SR-MPLS与SRv6#

3.1 段路由的设计动机#

传统 MPLS 需要 LDP 或 RSVP-TE 来分发标签——LDP 跟着 IGP 走,RSVP-TE 自己建隧道。两个协议意味着两套控制平面、两套邻居关系、两套故障检测机制。运营商维护起来很痛苦。

段路由(Segment Routing,SR)的思路是:消除独立的信令协议,把标签信息直接编码进 IGP(OSPF/IS-IS)。IGP 通告的不仅是拓扑信息,还有每台路由器的标签(SID,Segment Identifier)。这样 IGP 既是拓扑发现协议,也是标签分发协议——控制平面从两个协议简化为一个。

SR 的核心概念是(Segment):一条端到端路径被拆成若干段,每段对应一个 SID。入口路由器把 SID 列表压入标签栈,中间路由器逐个弹出——这就是源路由(Source Routing),路径由入口决定,中间不需要信令。

3.2 SR-MPLS#

SR-MPLS 用 MPLS 标签承载 SID。SID 有两种类型:

  • Prefix SID:全局唯一的标签,标识一台路由器。由 IGP 通告,所有路由器对同一个 Prefix SID 的标签值达成一致
  • Adjacency SID:本地有效的标签,标识一条链路。只在本路由器上有意义
sequenceDiagram participant HEAD as 入口PE1<br/>SID:16001 participant P1 as P1<br/>SID:16002 participant P2 as P2<br/>SID:16003 participant TAIL as 出口PE2<br/>SID:16004 Note over HEAD: 计算路径:<br/>PE1→P1→P2→PE2 Note over HEAD: 压入标签栈:<br/>[16004|16003|IP包] HEAD->>P1: 顶层标签16003<br/>[16004|16003|IP包] Note over P1: 查表: 16003→swap 16003<br/>经P2到PE2 P1->>P2: 顶层标签16003<br/>[16004|16003|IP包] Note over P2: 弹出16003<br/>露出16004 P2->>TAIL: 顶层标签16004<br/>[16004|IP包] Note over TAIL: 弹出16004<br/>正常IP转发

SR-MPLS 的标签栈操作:入口 PE 压入整个标签栈(最内层是最终目的的 SID,最外层是第一跳的 SID),中间路由器每次弹出栈顶标签,直到露出最终目的的 SID。实际部署中,倒数第二跳弹出(PHP)同样适用——P2 会直接弹出 16003,PE2 收到的是纯 IP 包。

# FRR 中配置 SR-MPLS(基于 IS-IS)
vtysh
configure terminal
# 全局配置段路由
segment-routing
global-block 16000 23999 # SRGB 范围
# 配置 Prefix SID
router isis BACKBONE
net 49.0001.0000.0000.0001.00
is-type level-1-2
segment-routing on
segment-routing prefix 1.1.1.1/32 index 1
# index 1 → 标签 = 16000 + 1 = 16001
# 配置 Adjacency SID
interface eth0
ip router isis BACKBONE
isis segment-routing adjacency-sid index 10

Prefix SID 的标签值 = SRGB 起始值 + index。所有路由器的 SRGB 必须一致(推荐使用默认范围 16000~23999),这样同一个 Prefix SID 在所有路由器上的标签值相同。

3.3 SRv6#

SRv6 用 IPv6 扩展头部承载 SID,彻底摆脱 MPLS 标签。SRv6 的 SID 是 128 位的 IPv6 地址,封装在 SRH(Segment Routing Header)中:

# SRv6 SRH 结构(简化)
# IPv6 头部: Next Header=43, Dest=SRH[0]
# SRH: Segments Left=2, First Segment=3
# Segment List[0] = fc00:0:4::1 ← 最后执行(PE2)
# Segment List[1] = fc00:0:3::1 ← 第二跳(P2)
# Segment List[2] = fc00:0:2::1 ← 第一跳(P1)

SRv6 的工作方式:入口 PE 将 SID 列表写入 SRH,IPv6 目的地址设为第一个活跃 SID。每经过一个 SRv6 节点,Segments Left 减 1,IPv6 目的地址更新为下一个 SID。当 Segments Left = 0 时,到达最终目的地。

# Linux 内核配置 SRv6(实验性)
sysctl -w net.ipv6.conf.all.seg6_enabled=1
ip -6 route add fc00:0:2::1/128 encap seg6 mode inline segs fc00:0:3::1,fc00:0:4::1 dev eth0
ip -6 route show fc00:0:2::1/128
# fc00:0:2::1 encap seg6 mode inline segs fc00:0:3::1,fc00:0:4::1 dev eth0

SRv6 的 SID 不仅是转发标识,还可以编码行为(Behavior):End 表示普通转发,End.X 表示指定出接口(等价于 Adjacency SID),End.DT4 表示解封装并查 VRF 路由表(VPN 场景)。这种”指令化”的 SID 让 SRv6 比 SR-MPLS 更灵活。

3.4 SR-MPLS vs SRv6 vs 传统MPLS#

维度传统 MPLS (LDP)SR-MPLSSRv6
控制平面LDP + IGP仅 IGP仅 IGP
信令协议LDP(需维护邻居)无(IGP 携带 SID)无(IGP 携带 SID)
标签/SID本地意义全局(Prefix SID)+ 本地(Adj SID)全局(128 位 IPv6 地址)
标签栈深度通常 2~3 层通常 2~5 层SRH 可携带任意数量 SID
封装开销4 字节/标签4 字节/标签128 位/SID + SRH 头部
IPv6 支持需 LDPv6需 IGPv6原生 IPv6
可编程性高(SID 编码行为)
硬件要求MPLS 转发面MPLS 转发面IPv6 扩展头处理
部署成熟度最成熟成熟快速发展中
Warning

SRv6 的封装开销是个实际问题:每个 SID 占 128 位(16 字节),而 MPLS 标签只占 4 字节。一条经过 5 个节点的 SRv6 路径,SRH 就要 80+ 字节。在 MTU 受限的场景(如 1500 字节以太网)中,这可能触发分片。SRv6 压缩(SRv6 uSID)将多个 SID 压缩到一个 128 位地址中,是解决这个问题的方向。

四、流量工程#

4.1 为什么需要流量工程#

IGP 选路的唯一标准是最短路径——代价最小的路径胜出。但最短路径不等于最优路径:

graph LR R1["R1<br/>PE"] -->|"10Gbps<br/>代价10"| R2["R2<br/>P"] R1 -->|"100Gbps<br/>代价20"| R3["R3<br/>P"] R2 -->|"10Gbps<br/>代价10"| R4["R4<br/>PE"] R3 -->|"100Gbps<br/>代价10"| R4 style R1 fill:#e3f2fd,stroke:#1565c0 style R2 fill:#fff3e0,stroke:#e65100 style R3 fill:#e8f5e9,stroke:#2e7d32 style R4 fill:#fce4ec,stroke:#c62828

IGP 选路:R1→R2→R4(总代价 20)。但 R1→R2 和 R2→R4 的链路只有 10Gbps,而 R1→R3→R4 的链路有 100Gbps。当 R1→R2→R4 的流量超过 10Gbps 时,链路拥塞丢包,而 R1→R3→R4 的 100Gbps 链路却几乎空闲。

流量工程解决的就是这个问题:不按最短路径走,按带宽最充足的路径走。具体来说,流量工程要实现:

  1. 避免拥塞:把流量从拥塞链路转移到空闲链路
  2. 带宽保证:为特定流量预留带宽
  3. 路径优化:全局优化链路利用率,而非局部最优
  4. 快速故障恢复:链路故障时 50ms 内切换到备用路径

4.2 RSVP-TE隧道#

RSVP-TE(Resource Reservation Protocol - Traffic Engineering,RFC 3209)是传统 MPLS 流量工程的信令协议。它在 RSVP 的基础上扩展了以下能力:

  • 显式路径:入口路由器指定数据包必须经过的节点列表
  • 带宽预留:沿路径逐跳预留带宽资源
  • 快速重路由(FRR):为隧道预先计算备份路径
# FRR 中配置 RSVP-TE 隧道
vtysh
configure terminal
mpls te
router-id 1.1.1.1
interface eth0
mpls te link metric 10
mpls te link max-bw 10000 # 最大带宽 10Mbps
# 创建 TE 隧道
interface tunnel0
ip address 10.99.0.1/30
tunnel mode mpls-te
tunnel destination 4.4.4.4
tunnel mpls te path-option 1 explicit name PATH1
tunnel mpls te bandwidth 5000 # 预留 5Mbps
# 定义显式路径
ip explicit-path name PATH1
next-address 2.2.2.2
next-address 3.3.3.3
next-address 4.4.4.4
show mpls te tunnel
# Tunnel0: dest 4.4.4.4, up, bandwidth 5000 kbps

RSVP-TE 的 FRR(Fast Reroute)机制可以做到 50ms 以内的故障切换:

FRR 有两种保护方式:
- **Facility 保护**(1:1):为每条链路预建一条绕行隧道,链路故障时把整条隧道切换到绕行路径
- **Detour 保护**(1:1):为每条 LSP 预建一条端到端备份路径
### 4.3 SR-TE策略
SR-TE(Segment Routing Traffic Engineering)用段路由替代 RSVP-TE,不需要逐跳信令,入口路由器压入标签栈即可:
```bash
SR-TE 的优势:
1. **无逐跳状态**:RSVP-TE 在每台中间路由器上维护软状态,SR-TE 只在入口维护策略
2. **无信令开销**:不需要 RSVP 的 Path/Resv 刷新消息
3. **扩展性好**:中间路由器不需要为每条隧道维护状态,支持更多隧道
4. **与 BGP 集成**:BGP 可以通告 SR-TE 策略(BGP SR-TE),实现跨域流量工程
### 4.4 流量工程度量
流量工程的核心是**度量网络状态**,然后根据度量做出决策:
| 度量指标 | 采集方式 | 用途 |
|---------|---------|------|
| 链路利用率 | SNMP/SFlow/NetFlow | 判断拥塞程度 |
| 链路可用带宽 | IGP-TE 扩展(OSPF-TE/IS-IS-TE) | CSPF 计算路径 |
| 端到端延迟 | TWAMP/STAMP | 延迟敏感业务选路 |
| 丢包率 | SNMP/PM | 路径质量评估 |
| 链路延迟变化 | PTP/NTP 时间戳 | 抖动敏感业务选路 |
IGP-TE 扩展让路由器在 LSA/LSP 中携带链路的 TE 属性(最大带宽、可用带宽、延迟等),CSPF(约束最短路径优先)算法据此计算满足约束的路径。
```bash
# 查看 IGP-TE 链路信息
show mpls te link
# Link ID: 10.0.1.2, Max BW: 1000000 kbps, Avail BW: 750000 kbps, TE Metric: 10

五、MPLS VPN#

5.1 L3VPN#

MPLS L3VPN(RFC 4364)是运营商最广泛部署的 VPN 技术。核心思想:用 VRF 隔离不同客户的路由表,用 MPLS 标签栈在骨干网中传输 VPN 数据

graph TB subgraph 客户A["客户A 站点"] CE1A["CE-A1<br/>192.168.1.0/24"] CE2A["CE-A2<br/>192.168.2.0/24"] end subgraph 客户B["客户B 站点"] CE1B["CE-B1<br/>192.168.1.0/24"] CE2B["CE-B2<br/>192.168.2.0/24"] end subgraph 运营商骨干["运营商 MPLS 骨干"] PE1["PE1<br/>VRF-A + VRF-B"] PE2["PE2<br/>VRF-A + VRF-B"] P["P 路由器<br/>只做标签转发"] end CE1A --> PE1 CE1B --> PE1 PE1 --> P --> PE2 PE2 --> CE2A PE2 --> CE2B style 客户A fill:#e3f2fd,stroke:#1565c0 style 客户B fill:#e8f5e9,stroke:#2e7d32 style 运营商骨干 fill:#fff3e0,stroke:#e65100

注意客户 A 和客户 B 都使用 192.168.1.0/24——地址空间重叠在 L3VPN 中完全合法,因为每个客户的路由表在独立的 VRF 中。

L3VPN 的三个核心概念:

  • VRF(Virtual Routing and Forwarding):每台 PE 上为每个客户维护独立的路由表
  • RD(Route Distinguisher):8 字节标识符,把重叠的 IPv4 地址变成全局唯一的 VPNv4 地址。格式:RD:IPv4,如 65001:100:192.168.1.0/24
  • RT(Route Target):BGP 扩展团体属性,控制 VPN 路由的导入导出。PE1 用 RT 导出路由,PE2 用 RT 导入路由
# FRR 中配置 L3VPN(PE1)
vtysh
configure terminal
# 配置 VRF
vrf VRF_A
vni 100
vrf VRF_B
vni 200
# 接口绑定 VRF
interface eth0
ip vrf forwarding VRF_A
ip address 192.168.1.1/24
interface eth1
ip vrf forwarding VRF_B
ip address 192.168.1.1/24
# BGP VPNv4 + VRF 路由
router bgp 65001
address-family vpnv4
neighbor 4.4.4.4 activate
neighbor 4.4.4.4 send-community extended
address-family ipv4 vrf VRF_A
redistribute connected
route-target import 65001:100
route-target export 65001:100
address-family ipv4 vrf VRF_B
redistribute connected
route-target import 65001:200
route-target export 65001:200

数据包从 CE-A1 到 CE-A2 的转发过程:

  1. CE-A1 发纯 IP 包到 PE1
  2. PE1 查 VRF-A 路由表,找到下一跳是 PE2(4.4.4.4)
  3. PE1 压入两层标签:内层是 VPN 标签(由 BGP 分配),外层是 LDP/SR 标签(到 PE2 的骨干网标签)
  4. P 路由器只看外层标签转发,不知道 VPN 的存在
  5. PE2 弹出外层标签,根据内层 VPN 标签查 VRF-A 路由表
  6. PE2 将纯 IP 包转发给 CE-A2

5.2 L2VPN#

L2VPN 在骨干网上透传二层数据帧,客户自己运行路由协议。两种主要技术:

维度L3VPNL2VPN
客户路由运营商 PE 参与(PE-CE 路由交换)运营商不参与(透传二层帧)
地址空间PE 上需要 VRF 和客户 IPPE 不需要客户 IP 信息
客户协议PE 需要支持客户的路由协议客户随意运行任何协议
典型技术BGP/MPLS L3VPNVPLS、EVPN
部署复杂度中(需配置 PE-CE 路由)低(二层透传)
扩展性好(BGP 路由聚合)一般(MAC 学习开销)

VPLS(Virtual Private LAN Service)用 MPLS 在骨干网上模拟一台交换机——所有站点像接在同一台交换机上一样。VPLS 需要全连接的伪线(Pseudowire),N 个站点需要 N×(N-1)/2 条伪线,扩展性差。

EVPN(Ethernet VPN,RFC 7432)用 BGP 传递 MAC 地址信息,取代了 VPLS 的泛洪学习。PE 只向其他 PE 通告自己学到的 MAC 地址,不需要泛洪——扩展性大幅提升。

5.3 EVPN-VXLAN融合#

现代数据中心互联(DCI)的主流方案是 EVPN + VXLAN

  • VXLAN:在 UDP 中封装二层帧,用 VNI 标识租户。支持跨三层网络的大二层
  • EVPN:作为 VXLAN 的控制平面,用 BGP 传递 MAC/IP 信息,取代泛洪学习
# EVPN-VXLAN 配置示例(FRR)
vtysh
configure terminal
interface vxlan0
vxlan vni 10010
vxlan local 1.1.1.1
vxlan remote 4.4.4.4
router bgp 65001
address-family l2vpn evpn
neighbor 4.4.4.4 activate
advertise-all-vnis
# 查看 EVPN 路由
show bgp l2vpn evpn
# [2]:[0]:[10010]:[48]:[00:11:22:33:44:55] Next: 4.4.4.4 Path: 65002 i
# ↑ Type 2 路由:MAC/IP 通告

EVPN 定义了 5 种路由类型,最常用的是 Type 2(MAC/IP 通告)和 Type 3(包容多播以太标签路由,用于 BUM 流量处理)。EVPN-VXLAN 融合了数据中心的灵活性和运营商骨干网的规模——这是当前网络虚拟化的主流方向。

六、运营商QoS#

6.1 DiffServ模型#

运营商骨干网采用 DiffServ(Differentiated Services,RFC 2475)模型——在域的边缘对流量分类和标记,在核心根据标记执行差异化转发。核心路由器不需要维护每流状态,只看 DSCP 值决定调度策略。

DSCP 值十进制PHB典型用途丢弃优先级
10111046EF(Expedited Forwarding)VoIP、实时视频低延迟、低抖动
10001034AF41视频会议高优先级,可少量丢包
10000032AF32信令流量中优先级
01000016CS2管理流量确保转发
0000000BE(Best Effort)普通数据尽力而为

DSCP 占 IPv4 头部 ToS 字段的前 6 位(RFC 2474 重定义了 ToS 为 DSCP + ECN)。MPLS 标签的 TC 字段(3 位)映射 DSCP 的前 3 位,这样 MPLS 骨干网也能区分流量等级。

# Linux 中设置 DSCP + 流量分类
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 1gbit # EF
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 200mbit ceil 1gbit # AF4x
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 500mbit ceil 1gbit # BE
# 用 iptables 标记 DSCP
iptables -t mangle -A FORWARD -p udp --dport 5060 -j DSCP --set-dscp 46 # SIP=EF
iptables -t mangle -A FORWARD -p udp --dport 5004 -j DSCP --set-dscp 34 # RTP=AF41

6.2 流量整形与监管#

流量监管(Policing)和流量整形(Shaping)都控制流量速率,但行为不同:

  • 监管:超速直接丢弃或降级(硬限制)
  • 整形:超速缓存延迟发送(软限制,平滑突发)

两者都基于令牌桶(Token Bucket)算法:

# Linux tc 配置令牌桶监管 + 流量整形
tc qdisc add dev eth0 root handle 1: htb default 30
tc class add dev eth0 parent 1: classid 1:1 htb rate 1gbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit ceil 200mbit # EF
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 300mbit ceil 500mbit # AF
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 600mbit ceil 1gbit # BE
# 监管:CIR=100Mbps, 超速丢弃
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dst 10.0.0.0/8 \
action police rate 100mbit burst 25kbit conform-action pass exceed-action drop
# 查看整形效果
tc -s class show dev eth0

令牌桶的三个参数:

  • CIR(Committed Information Rate):承诺速率,令牌生成的速度
  • CBS(Committed Burst Size):承诺突发大小,桶的容量
  • EBS(Excess Burst Size):超额突发大小,第二个桶的容量

6.3 拥塞管理#

当链路拥塞时,路由器需要决定哪些包先发、哪些包丢弃——这就是队列调度

flowchart TB PKT["入站数据包"] --> CLASS["分类器<br/>DSCP/ACL"] CLASS --> Q1["队列1<br/>EF - 严格优先"] CLASS --> Q2["队列2<br/>AF4x - 带宽保证"] CLASS --> Q3["队列3<br/>AF2x - 带宽保证"] CLASS --> Q4["队列4<br/>BE - 尽力而为"] Q1 --> SCHED["调度器<br/>PQ + WFQ"] Q2 --> SCHED Q3 --> SCHED Q4 --> SCHED SCHED --> OUT["出站链路"] style Q1 fill:#ffcdd2,stroke:#c62828 style Q2 fill:#fff9c4,stroke:#f9a825 style Q3 fill:#c8e6c9,stroke:#2e7d32 style Q4 fill:#e0e0e0,stroke:#616161

常见的队列调度算法:

算法原理优点缺点
FIFO先进先出简单无法区分流量
PQ(Priority Queuing)高优先级队列先发延迟最低低优先级可能饿死
WFQ(Weighted Fair Queuing)按权重公平分配带宽公平、不饿死计算开销大
CBWFQ按类分配带宽灵活可控配置复杂
PQ + CBWFQEF 用 PQ,其余用 CBWFQ兼顾延迟和公平配置更复杂

运营商骨干网通常采用 PQ + CBWFQ 的组合:EF 流量进严格优先队列(保证延迟),AF 流量进带宽保证队列(保证带宽),BE 流量进默认队列(尽力而为)。

Tip

队列长度的设置很关键:太短导致不必要的丢包(尾丢弃),太长导致延迟增大。现代路由器支持 WRED(Weighted Random Early Detection)——队列未满时就开始按概率随机丢弃,让 TCP 提前降速,避免全局同步导致的带宽崩溃。

七、动手实践:GNS3搭建MPLS拓扑#

7.1 实验拓扑#

用 GNS3 + FRR 搭建一个 5 路由器的 MPLS 骨干网:

graph LR PE1["PE1<br/>1.1.1.1<br/>LDP+OSPF"] -->|"10.0.12.0/24"| P1["P1<br/>2.2.2.2<br/>LDP"] P1 -->|"10.0.23.0/24"| P2["P2<br/>3.3.3.3<br/>LDP"] P2 -->|"10.0.34.0/24"| PE2["PE2<br/>4.4.4.4<br/>LDP+OSPF"] PE1 -->|"10.0.14.0/24"| PE2 CE1["CE1<br/>192.168.1.0/24"] --> PE1 PE2 --> CE2["CE2<br/>192.168.2.0/24"] style PE1 fill:#e3f2fd,stroke:#1565c0 style P1 fill:#fff3e0,stroke:#e65100 style P2 fill:#fff3e0,stroke:#e65100 style PE2 fill:#e3f2fd,stroke:#1565c0 style CE1 fill:#e8f5e9,stroke:#2e7d32 style CE2 fill:#e8f5e9,stroke:#2e7d32

PE1 和 PE2 是边缘路由器(LER),P1 和 P2 是核心路由器(LSR)。CE1 和 CE2 是客户路由器。

7.2 FRR MPLS配置#

每台路由器的配置模式相同:接口启用 MPLS + LDP,OSPF 通告直连网段和 Loopback 地址。以 PE1 和 P1 为例:

# ===== PE1 配置 =====
vtysh
configure terminal
interface eth0
ip address 10.0.12.1/24
mpls enable
mpls ldp enable
interface eth1
ip address 10.0.14.1/24
mpls enable
mpls ldp enable
interface lo
ip address 1.1.1.1/32
router ospf
ospf router-id 1.1.1.1
network 10.0.12.0/24 area 0
network 10.0.14.0/24 area 0
network 1.1.1.1/32 area 0
mpls ldp
router-id 1.1.1.1
# ===== P1 配置 =====
# 接口:eth0 10.0.12.2/24 + eth1 10.0.23.2/24,均启用 mpls + ldp
# Loopback:2.2.2.2/32
# OSPF:network 10.0.12.0/24 + 10.0.23.0/24 + 2.2.2.2/32 area 0
# LDP:router-id 2.2.2.2
# P2 和 PE2 配置模式相同,只需修改 IP 和 Router-ID
# P2: 10.0.23.3/24 + 10.0.34.3/24, router-id 3.3.3.3
# PE2: 10.0.34.4/24 + 10.0.14.4/24, router-id 4.4.4.4

7.3 观察标签交换#

# 在 PE1 上查看 MPLS 转发表
show mpls forwarding-table
# Local Outgoing Prefix Out-If Next Hop
# 10017 20017 2.2.2.2/32 eth0 10.0.12.2
# 10018 20018 3.3.3.3/32 eth0 10.0.12.2
# 10019 20019 4.4.4.4/32 eth0 10.0.12.2
# 10020 imp-null 10.0.14.0/24 eth1 10.0.14.4
# ↑ imp-null = 隐式空标签(PHP 倒数第二跳弹出)
# 在 P1 上查看标签操作
show mpls forwarding-table
# 20018 30018 3.3.3.3/32 eth1 10.0.23.3
# 20019 30019 4.4.4.4/32 eth1 10.0.23.3
# ↑ 到 4.4.4.4 的标签路径:PE1 push 10019 → P1 swap 30019 → P2 swap imp-null → PE2 收到纯IP
# 用 tcpdump 抓 MPLS 包
sudo tcpdump -i eth0 -w mpls_capture.pcap mpls
# tshark 解码 MPLS
tshark -r mpls_capture.pcap -V -Y mpls
# MPLS Label: 10019, Exp: 0, S: 1, TTL: 253
# 从 CE1 ping CE2,观察标签路径
ping 192.168.2.1
# 在 PE1 上 traceroute MPLS 路径
traceroute -m 10 4.4.4.4
# 1 10.0.12.2 (P1) 1.2ms → 2 10.0.23.3 (P2) 2.3ms → 3 10.0.34.4 (PE2) 3.4ms
# 查看 LDP 邻居
show mpls ldp neighbor
# Peer LDP Ident: 2.2.2.2:0; State: oper; Up time: 01:23:45
Note

Wireshark 默认不解析 MPLS 标签,需要在 Edit → Preferences → Protocols → MPLS 中启用。抓包时注意:MPLS 包的以太网类型是 0x8847(单播)或 0x8848(多播),不是 0x0800(IPv4)。tcpdump 的 mpls 过滤器可以直接捕获 MPLS 包。

八、本章小结#

概念要点
ISP 层次Tier 1/2/3 按互联关系分层;网络分接入/汇聚/核心三层;POP 是区域接入点
MPLS 标签4 字节固定头部(20 位标签 + 3 位 TC + 1 位 S + 8 位 TTL);标签栈支持嵌套
LSP标签交换路径;Push/Swap/Pop 三种操作;PHP 倒数第二跳弹出优化
LDP下游自主分发标签,严格跟随 IGP 路径;不做流量工程
SR-MPLSIGP 携带 SID,消除 LDP/RSVP;Prefix SID 全局,Adjacency SID 本地
SRv6IPv6 SRH 承载 128 位 SID;SID 可编码行为(End/End.X/End.DT4)
流量工程最短路径 ≠ 最优路径;RSVP-TE 显式路径+带宽预留;SR-TE 无信令源路由
MPLS FRR50ms 故障切换;Facility 保护(链路级)或 Detour 保护(LSP 级)
L3VPNVRF 隔离 + RD 唯一化 + RT 控制导入导出;两层标签(VPN+骨干)
L2VPNVPLS 全连接伪线(扩展性差);EVPN 用 BGP 传 MAC(扩展性好)
EVPN-VXLAN数据中心互联主流方案;EVPN 控制平面 + VXLAN 数据平面
DiffServ边缘标记 DSCP,核心按 PHB 调度;EF 低延迟、AF 带宽保证、BE 尽力而为
令牌桶CIR/CBS/EBS 三参数;监管超速丢弃,整形超速缓存
队列调度PQ+CBWFQ 组合;WRED 随机早检测避免 TCP 全局同步

数据包离开运营商骨干网后,接下来要经过 IXP(互联网交换中心)在不同运营商之间交换——那是 IXP与互联网交换 的内容。


参考#

  • RFC 2474 — Definition of the Differentiated Services Field (DS Field)
  • RFC 2475 — An Architecture for Differentiated Services
  • RFC 3209 — RSVP-TE: Extensions to RSVP for LSP Tunnels
  • RFC 4364 — BGP/MPLS IP Virtual Private Networks (VPNs)
  • RFC 5036 — Convergence of Forwarding and Routing in MPLS
  • RFC 7432 — BGP MPLS-Based Ethernet VPN
  • Cloudflare RPKI Dashboard

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

运营商骨干网与流量工程:ISP内部如何调度流量
https://blog.souloss.com/posts/internet-architecture/isp-backbone-and-traffic-engineering/
作者
Souloss
发布于
2022-05-13
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时