<!-- title: RRC重建:断链后的自愈术 -->

# RRC 重建:断链后的自愈术

> 你正打着 VoLTE 电话走进电梯,信号"啪"地断了。几秒后,电话居然自己接上了——你没察觉到的是,你的手机刚经历了一场惊心动魄的"断链自救"。这场自救的主角,就是 **RRC 连接重建(RRC Reestablishment)**。

这是移动性管理原理系列的第三轮。前两轮我们讲了"切换怎么发生、条件切换怎么防掉话"。这一轮我们反过来看:**当切换失败、当无线链路真的断了,网络靠什么把你"拉回来"?** 理解了重建,你才真正理解了移动通信里"掉话"和"不掉话"那一线之隔。

---

## 一、先讲一个反直觉的事实:重建不是"重新接入"

很多工程师的第一反应是:链路断了,那就重新发起一次随机接入、重新鉴权、重新建承载,不就好了?

理论上没问题,但工程上**致命**。一次完整的 RRC 连接建立 + 鉴权 + 安全激活 + PDU 会话恢复,在现网里通常要 **几百毫秒到数秒**。这个时延里:

- **实时业务(语音、游戏)直接断了** —— 用户感知就是"掉线"
- **核心网释放了你的承载上下文** —— 重建后所有 QoS 要重新协商
- **鉴权全套走一遍** —— 算力、空口资源全浪费

所以协议设计者做了个聪明决定:**不要把已经建立的东西全推倒重来,而是尽量"复活"那条旧连接**。

这就是 RRC 重建的本质——**它不是重新接入,而是"带着身份证回到最近的小区,要求网络把之前的会话续上"**。

> 类比:你住酒店时房卡失效了。笨办法是把行李退掉、重新办入住、重新分配房间;聪明办法是拿身份证到前台,前台核对身份后给你一张新房卡,你继续住原来的房间。RRC 重建就是后者。

它的前提条件很关键:

| 前提条件 | 为什么必须 |
|---------|------------|
| UE 此前处于 **RRC_CONNECTED** 态 | 重建是对"已有连接"的恢复,空闲态没有连接可恢复 |
| **安全已激活(AS 安全上下文存在)** | 网络必须能验证"你真的是你",否则任何 UE 都能伪造重建请求劫持会话 |
| UE 持有 **源小区的 C-RNTI 和上下文配置** | 这是你的"身份证"和"行李寄存牌" |
| 能找到一个**合适的小区** | 重建必须落在某个能服务你的小区上 |

这四个前提里,**第二个(安全已激活)** 是整个机制能成立的安全基石,后文会专门讲。

---

## 二、什么时候触发重建?—— 四种"事故现场"

重建不是 UE 想发就发,而是**出现了特定故障后**的兜底动作。协议定义了四类触发原因(5G NR 中 `ReestablishmentCause` 字段):

| 触发原因(cause) | 现场描述 | 典型根因 |
|:---:|---|---|
| **无线链路失败 (RLF)** | 信号持续太差,MAC 层判定"这条链路救不活了" | T310 定时器超时(连续 N310 次同步失败) |
| **切换失败 (handoverFailure)** | 切到目标小区没成功接入,被"晾"在半路 | T304 超时(目标侧随机接入未完成) |
| **重配失败 (reconfigFailure)** | 网络下发的配置 UE 执行不了,拒绝后请求恢复 | 网络配置错误或不兼容能力 |
| **完整性校验失败 (otherFailure)** | 收到的信令完整性被破坏,说明链路/安全出了问题 | 干扰、错包,或潜在的安全攻击 |

下图把"事故 → 重建"的因果链画清楚:

```mermaid
flowchart TD
    A["RRC_CONNECTED<br/>正常通信中"] --> B{发生故障?}

    B -->|信号持续恶化| C["T310 超时<br/>= 无线链路失败 RLF"]
    B -->|切换未按时完成| D["T304 超时<br/>= 切换失败"]
    B -->|配置无法执行| E["重配失败"]
    B -->|信令完整性被破坏| F["完整性校验失败"]

    C --> G["UE 挂起业务<br/>发起小区选择"]
    D --> G
    E --> G
    F --> G

    G --> H{找到合适小区?}
    H -->|否| I["回到 RRC_IDLE<br/>重新接入(掉话)"]
    H -->|是| J["发起<br/>RRCReestablishmentRequest"]
```

注意一条很容易被忽略的关键细节:**发生 RLF 后,UE 并不会立刻发重建请求**。它会先做"小区选择"——找一个新的落脚点。这是因为你现在所在的小区链路已经坏了,在坏小区上发请求是发不出去的。UE 必须先逃到一个信号尚可的小区,才能开口求救。这个"找落脚点"的时间由定时器 **T311** 控制。

---

## 三、信令时序图:四条消息救回一条命

这是本文最核心的一张图。一次成功的重建,核心就是 **UE → gNB → UE → gNB** 这四条消息:

```mermaid
sequenceDiagram
    autonumber
    participant UE as UE(终端)
    participant TgNB as 目标 gNB<br/>(UE 选中的小区)
    participant SgNB as 源 gNB<br/>(原服务小区)

    Note over UE: RLF/切换失败,挂起业务,<br/>小区选择,选中目标小区

    UE->>TgNB: RRCReestablishmentRequest<br/>(SRB0/CCCH)<br/>携带: C-RNTI + PCI + shortMAC-I + cause

    Note over TgNB: 1. 校验 shortMAC-I<br/>2. 自己没有 UE 上下文,<br/>   通过 PCI 找到源 gNB

    TgNB->>SgNB: XnAP: Retrieve UE Context<br/>(检索 UE 上下文)

    SgNB-->>TgNB: UE Context + 未确认的 PDCP 包<br/>(用于数据转发)

    Note over TgNB: 重算 KgNB*<br/>配置新 SRB1/C-RNTI

    TgNB-->>UE: RRCReestablishment<br/>(SRB1/DCCH)<br/>携带: newC-RNTI + nextHopChainingCount

    Note over UE: 应用新密钥,<br/>重建 PDCP 实体

    UE->>TgNB: RRCReestablishmentComplete<br/>(SRB1/DCCH)

    Note over TgNB: SRB2/DRB 恢复,<br/>路径切换 Path Switch

    TgNB-->>UE: RRCReconfiguration<br/>(恢复 DRB、测量等)
```

我们逐条拆解这四条消息背后的"设计心思":

### 第①条:RRCReestablishmentRequest —— 为什么走 SRB0?

**关键反常识点:重建请求用的是 SRB0(CCCH,公共控制信道),而不是 SRB1。**

为什么?因为故障发生时,**SRB1 上的安全上下文可能已经不可靠了**(完整性校验失败恰恰就是触发原因之一)。在一条可能被破坏的承载上发请求,网络无法验证。所以 UE 退回到最底层的、**未加密、未完整性保护**的 SRB0 上喊救命。

那不加密,岂不是谁都能伪造请求?这里就引出了重建的"身份凭证"——**shortMAC-I**。

请求消息里携带的四样东西,每一样都有用:

| 字段 | 作用 | 类比 |
|------|------|------|
| **C-RNTI** | UE 在源小区的无线身份 | 你的房卡号 |
| **PhysCellId (PCI)** | 源小区物理标识 | 你住的那家酒店(让目标基站知道去哪查你) |
| **shortMAC-I** | 16 bit 安全凭证 | 你的身份证号(证明你真住过) |
| **ReestablishmentCause** | 触发原因 | 你为什么来找前台 |

### 第②条:目标 gNB 的核心动作 —— 找上下文

目标 gNB 收到请求后,第一件事是**校验 shortMAC-I**(下节详述)。校验通过后,它发现自己手上并没有这个 UE 的完整上下文(UE 是从别的小区跑过来的),于是通过 PCI 确定源 gNB,发起 **XnAP Retrieve UE Context** 流程,把源 gNB 那边的 UE 上下文"搬"过来。

> 这就是为什么**重建比重新建立快**:它复用了源 gNB 上已经协商好的承载配置、密钥、QoS,不必重新鉴权、不必重新建承载。

### 第③条:RRCReestablishment —— 换发新房卡

目标 gNB 给 UE 一个**新的 C-RNTI**(因为换了小区,旧 C-RNTI 可能已用),并带上 `nextHopChainingCount` 用于密钥推演。此时 SRB1 被重新配置,**新的安全密钥激活**。

### 第④条:Complete + 后续重配

UE 确认后,SRB2 和数据承载(DRB)恢复。通常 gNB 还会再发一条 RRCReconfiguration 把测量、DRB 参数补全,并触发到核心网的**路径切换(Path Switch)**,让下行数据走新的路由。

---

## 四、三个"为什么这样设计"的硬核原理

### 原理 1:shortMAC-I —— 用 16 bit 完成身份核验

这是整个重建机制最精妙的安全设计。问题是:**请求在未保护的 SRB0 上发,网络怎么相信"你"就是你?**

答案不是重新做一次完整鉴权(太慢),而是用一个**基于已有密钥派生出的短凭证**。shortMAC-I 的本质是:用 UE 和源 gNB 之间共享的 AS 安全密钥,对"UE 身份 + 小区信息"做一次 MAC 运算,截取 16 bit。

概念性地表示为:

$$
\text{shortMAC-I} = \text{MAC}_{K_{\text{RRCint}}} \big( \text{C-RNTI} \,\|\, \text{PCI} \,\|\, \text{目标小区载频} \big) \;[\text{截取低16位}]
$$

其中 $K_{\text{RRCint}}$ 是 RRC 完整性保护密钥。**只有同时拥有正确密钥和正确上下文的 UE,才能算出这 16 bit**。攻击者即便能伪造 C-RNTI 和 PCI,没有密钥也算不出正确的 shortMAC-I。

> 工程意义:如果抓包看到 UE 发了 Request 但 gNB 没有任何响应(连 Reject 都没有),大概率是 **shortMAC-I 校验失败** —— 目标 gNB 算不出相同的 16 bit,判定这不是合法 UE,直接丢弃。

### 原理 2:密钥推演 —— nextHopChainingCount 的"链式换锁"

重建成功后,安全密钥必须更新——因为旧密钥可能在故障期间暴露了。但完整重新跑鉴权流程(AKA)太重。协议用了一个聪明的**密钥水平推导(horizontal key derivation)**机制。

新的 gNB 密钥 $K_{\text{gNB}}^*$ 由源密钥推演:

$$
K_{\text{gNB}}^* = \text{KDF}\big( K_{\text{gNB}},\; \text{PCI}_{\text{target}} \,\|\, \text{ARFCN}_{\text{target}} \,\|\, \text{NH} \big)
$$

其中 **NH(Next Hop)参数**配合 `nextHopChainingCount` 控制"换锁"的深度——它是前向安全(forward secrecy)的关键:即使旧 $K_{\text{gNB}}$ 泄露,没有正确的 NH 链也推不出新密钥。这就像酒店换了门锁,新锁的钥匙必须从总台的一串"链式母钥匙"里按特定步数推导,而不是简单地复制旧钥匙。

### 原理 3:PDCP 重建 —— 数据不丢的秘密

重建最怕的是**业务数据丢失**。协议用 **PDCP(Packet Data Convergence Protocol)实体重建** 解决:

- **AM(确认模式)DRB**:PDCP 保留未确认的包计数(SN),重建后重传,实现**无损切换**
- **UM(非确认模式)DRB**:不重传,但保持 PDCP SN 连续,避免上层乱序

源 gNB 在 Retrieve UE Context 时,还会把**缓存里未发送/未确认的 PDCP PDU 转发给目标 gNB**(data forwarding),由目标 gNB 续发。这就是为什么语音通话重建后,你最多感觉到短暂的卡顿,而不会听到断句。

---

## 五、重建也可能失败 —— 失败后的两条退路

不是所有重建都能成功。下图区分了两种失败路径:

```mermaid
flowchart TD
    UE["UE 发起<br/>重建请求"] --> A{gNB 能服务?}

    A -->|是,找到上下文| OK["重建成功<br/>业务恢复"]
    A -->|否,找不到上下文/<br/>shortMAC-I 失败| REJ["gNB 回<br/>RRCReestablishmentReject"]
    A -->|无任何响应| T311["T311 超时"]

    REJ --> IDLE["UE → RRC_IDLE"]
    T311 --> IDLE

    IDLE --> REATTACH["重新发起<br/>RRC Setup / 初始接入<br/>(真掉线)"]
```

**重建失败的两种情况:**

1. **显式拒绝(Reject)**:gNB 收到了请求,但找不到 UE 上下文(比如源 gNB 已经把上下文删了),或 shortMAC-I 校验失败,返回 Reject。
2. **隐式失败**:gNB 根本没收到/没响应,UE 等到 **T311 超时**。

无论哪种,UE 都会退回 **RRC_IDLE**,走完整重新接入——**此时用户感知到的就是真正的"掉线"**。

---

## 六、关键定时器与参数:调优的旋钮

重建涉及一整套定时器,这是网优和研发调试时最常打交道的参数:

| 定时器/参数 | 触发/作用 | 超时后果 | 调优方向 |
|:---:|---|---|---|
| **N310** | 连续收到 N310 次"失步(out-of-sync)"指示 | 启动 T310 | 调小→更早发现链路恶化 |
| **T310** | 检测到物理层问题时启动 | 超时→判定 **RLF** | 调大→给链路更多自愈机会;调小→更快触发重建 |
| **N311** | 连续收到 N311 次"同步(in-sync)"指示 | 停止 T310(链路恢复) | 调小→链路短暂好转即认为恢复 |
| **T311** | RLF 后开始,覆盖"小区选择+重建"全过程 | 超时→**回 IDLE(掉话)** | 调大→给 UE 更多时间找小区重建成功 |
| **T304** | 切换时启动,等目标小区随机接入完成 | 超时→**切换失败** → 触发重建 | 与目标侧接入时延强相关 |

这套定时器的数学关系可以串成一条"生命线":

$$
\underbrace{N310 \text{ 次失步}}_{\text{觉察异常}} \rightarrow \underbrace{T310 \text{ 计时}}_{\text{尝试自救}} \xrightarrow{\text{超时}} \underbrace{\text{RLF}}_{\text{判定死亡}} \rightarrow \underbrace{T311 \text{ 计时}}_{\text{寻找新家并重建}} \xrightarrow{\text{超时}} \underbrace{\text{IDLE / 掉话}}_{\text{放弃}}
$$

> 调试陷阱:**T310 和 T311 是一把双刃剑**。调大它们,重建成功率提升(UE 有更多时间脱困),但失败时的中断时延也变长;调小则相反。现网通常根据业务类型(VoNR 对时延敏感、对短卡顿容忍)做差异化配置。

---

## 七、实战连接:工程师在哪里用到这些知识?

### 场景 1:掉话分析(Drop Call Analysis)

现网最常见的 KPI 任务。一条掉话信令要回答三个问题:

- **是重建失败导致的掉话,还是根本没机会重建?** → 看有没有 `RRCReestablishmentRequest`
- **重建为什么失败?** → 看是 Reject 还是 T311 超时;若 Reject,查 shortMAC-I / 上下文
- **根因是覆盖、干扰还是参数?** → 倒查 T310 是否频繁超时、N310 计数情况

### 场景 2:切换成功率优化

很多"切换失败"其实是被重建"救回来"的——表面切换成功率不高,但重建成功,用户没掉话。分析时要区分**切换失败率**和**最终掉话率**,后者才是用户真实感知。优化时,提升 T311 给重建留时间,往往比死磕切换参数更有效。

### 场景 3:5G 与 4G 的差异

- **5G NR** 多了 **RRC_INACTIVE** 第三态。从 INACTIVE 恢复走的是 `RRCResume`,与重建是两套机制——别混淆。
- **5G** 重建消息名去掉了 "Connection"(叫 `RRCReestablishmentRequest` 而非 `RRCConnectionReestablishmentRequest`),但流程本质一致。
- **SA vs NSA**:NSA(非独立组网)下,SN(辅节点)的失败处理涉及 MR-DC 的 SN Change,比纯 SA 复杂。

### 常见误解澄清

| 误解 | 正解 |
|------|------|
| "重建就是重新接入" | 重建是**复用已有上下文**的快速恢复,不重新鉴权 |
| "链路一断就发重建请求" | 先做**小区选择**,找到落脚点才发请求 |
| "重建请求是加密的" | 走 **SRB0 未保护**,靠 shortMAC-I 做身份核验 |
| "重建一定成功" | 失败会**回 IDLE**,这才是用户感知的"掉线" |

---

## 常见问题

**Q1:RRC 重建和 RRC 恢复(RRCResume)有什么区别?**

A:这是最容易混淆的一对。**重建**是"连接坏了之后的急救",前提是 UE 在 CONNECTED 态出了故障(RLF/切换失败),目标是续上**旧的连接上下文**;**恢复**是"UE 主动从浅睡眠 INACTIVE 态醒来",目标是把之前挂起的连接**重新激活**。一个被动救火,一个主动唤醒。

**Q2:为什么重建请求不加密?不怕被攻击吗?**

A:恰恰相反,正因为 SRB0 不加密,协议用 **shortMAC-I** 这 16 bit 凭证来证明合法性。它由源 gNB 和 UE 共享的密钥派生,攻击者没有密钥就无法伪造。这是"用密码学凭证替代完整鉴权"的精妙折中——既快又安全。

**Q3:重建成功后,之前没发完的数据会丢吗?**

A:**AM 模式的 DRB 不会丢**。PDCP 重建后,源 gNB 把未确认的包转发给目标 gNB 重传,实现无损恢复。UM 模式不重传,但保持序号连续,避免上层乱序。所以语音通话重建后通常是短暂卡顿而非断句。

**Q4:T310 和 T311 到底怎么配才能减少掉话?**

A:没有标准答案,取决于业务。VoNR 等时延敏感业务,T310 可适当调小(快速转入重建,避免长时间卡死),T311 调大(给重建更多机会);对数据业务,可更宽松。核心是**避免 T310+T311 都超时导致的 IDLE 退路**——那才是真掉话。

**Q5:如果源 gNB 已经把 UE 上下文删了,重建还能成功吗?**

A:不能。目标 gNB 发起 XnAP Retrieve UE Context 时,若源 gNB 已无该上下文(比如已超时释放),会返回失败,目标 gNB 随即下发 **RRCReestablishmentReject**,UE 回 IDLE。这也是现网"重建成功率"受限的一个真实瓶颈。

---

## 参考来源

1. [NR RRC 协议(5)---RRC 连接重建立流程 — CSDN](https://blog.csdn.net/crg2046/article/details/134696798) — 5G NR 重建流程与 Xn 上下文检索的中文图解
2. [5G NR RRC Reestablishment Procedure — 3glteinfo](https://www.3glteinfo.com/call-flows/5g/rrc-reestablishment/) — 经典信令时序与失败恢复英文教程
3. [5G NR 的 RRC 连接重建机制与流程 — 阿里云开发者社区](https://developer.aliyun.com/article/980897) — 触发时机、密钥推演与完整信令解析
4. [RRC re-establishment 重建流程 — 知乎](https://zhuanlan.zhihu.com/p/259211491) — 重建原因分类与网络响应逻辑
5. [5G 中 RRC 重建及信令解析 — 百度文库](https://wenku.baidu.com/view/fdaa789c740bf78a6529647d27284b73f24236a4.html) — AS 安全激活前提与 shortMAC-I 验证说明

---

> 本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵**爱卫生**(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。
> 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
