5G NR 在 FR2(毫米波,24.25–52.6 GHz)频段普遍采用模拟波束成形(Analog Beamforming),下行通过 SS/PBCH Block(SSB)或 CSI-RS 形成窄波束轮询覆盖,UE 与 gNB 之间依赖一个"最优波束对(Beam Pair Link, BPL)"维持控制面和数据面连接。与 LTE 全向/宽波束覆盖截然不同,毫米波波束宽度通常只有 5°–15°,一旦 UE 高速移动、人体遮挡(body blockage)、旋转手柄,或对面反射体环境突变,原有 BPL 的能量可能在毫秒级时间内衰减 20–40 dB,导致 UE 完全收不到 PDCCH。
在 LTE 时代,这种链路质量突变只能依赖无线链路失败(RLF)+ RRC 重建立来兜底,整个过程涉及 T310/T311 计时器、小区重选,端到端时延可达数百毫秒甚至秒级,对 eMBB 体验已是伤害,对 URLLC 更是不可接受。3GPP 在 TS 38.213 第 6 章和 TS 38.321 第 5.17 节专门定义了一套亚层间、不触发 RRC 重建立的快速恢复机制——Beam Failure Detection & Recovery(BFD/BFR),让 UE 在检测到波束失败的瞬间,直接在一条候选波束上发起无竞争随机接入(CFRA),在数毫秒内把"波束对"切换到新方向,而 RRC 连接、安全上下文、PDU 会话状态全部保持不变。这就是 BFR 的设计本源:把"波束级"的链路中断,从 RRC 层下沉到 MAC/PHY 层来愈合。
本文按"检测 → 候选识别 → 恢复请求(BFRQ)→ 恢复响应 → MAC CE 确认 → 完成"六个阶段,逐 IE 拆解 TS 38.213/38.321/38.331 中定义的完整机制,并补充 Rel-16/17 引入的 SCell BFR 增强。
BFR 是一个跨 PHY/MAC/RRC 三层的协作过程,需要先建立宏观状态视图,再进入逐消息拆解。
stateDiagram-v2
[*] --> 正常波束通信: 初始激活BPL
正常波束通信 --> BFD计数累加: 所有BFD-RS质量 < Qout
BFD计数累加 --> 正常波束通信: 任一BFD-RS质量恢复(计数清零)
BFD计数累加 --> 波束失败声明: 连续计数 = beamFailureInstanceMaxCount
波束失败声明 --> 候选波束识别: 测量candidateBeamRSList
候选波束识别 --> BFRQ发送: 找到RSRP >= 阈值的候选
候选波束识别 --> RLF重建立: 无合格候选波束
BFRQ发送 --> 等待BFR响应: CFRA(Msg1)或CBRA
等待BFR响应 --> BFR成功: 收到C-RNTI加扰PDCCH
等待BFR响应 --> RLF重建立: preambleTransMax耗尽
BFR成功 --> 正常波束通信: 新BPL接管
RLF重建立 --> [*]: T310/T311流程
这里的关键设计哲学是双重保险:BFR 是 RLF 之前的一道"快速止血带"。只有当 BFR 也失败(候选波束全无、或 PRACH 攀升到 preambleTransMax 仍未获响应),UE 才回退到传统 RLF 流程。两者之间通过 MAC 计数器隔离,互不干扰。
BFD 的核心难点在于:UE 此时已经收不到 PDCCH 了,它怎么知道是"波束坏了"而不是"没被调度"?3GPP 给出的答案是基于参考信号的假想 PDCCH BLER。
UE 被 RRC 配置一个或多个 BFD-RS 集合(failureDetectionResources),通常包含与 PDCCH DMRS 具有准共址(QCL)关系的 CSI-RS 或 SSB 资源。UE 在这些资源上估计能量,映射到一个假想的 PDCCH(聚合等级 AL、TBS 固定)上计算 BLER:
收到一个 BFI 后,MAC 实体按 TS 38.321 §5.17 执行:
beamFailureDetectionTimer;BFI_COUNTER 加 1;BFI_COUNTER >= beamFailureInstanceMaxCount,则声明波束失败(Beam Failure),立即触发阶段二。beamFailureInstanceMaxCount 由 RRC 配置(典型取值 2/3/4/5/6/8/10/20),它本质是一个时间去抖动窗口——避免一次瞬时阴影(如车辆驶过)就误判失败。计数器在收到任一 in-sync 指示、或高层重配时清零。
设计意图:把"链路质量"判定从绝对的 RSRP 绝对值,转换为相对的"PDCCH 可解调概率",使其天然适配任意频段、任意波束宽度、任意 MCS,无需为每条链路单独标定能量门限。
flowchart TD
A[PHY测量BFD-RS集合] --> B{所有BPL < Qout?}
B -- 否 --> C[可能上报in-sync,计数清零]
B -- 是 --> D[PHY上报BFI实例]
D --> E[MAC: 启动/重启beamFailureDetectionTimer]
E --> F[BFI_COUNTER + 1]
F --> G{BFI_COUNTER >= MaxCount?}
G -- 否 --> A
G -- 是 --> H[声明波束失败 → 进入候选识别]
C --> A
声明失败后,UE 并非盲目发起随机接入,而是要先自检是否有一条可用的新波束,否则发起 BFRQ 也是浪费。
UE 测量 RRC 配置的 candidateBeamRSList(同样由 CSI-RS 和/或 SSB 组成),对每个资源计算 RSRP,并与 rsrp-ThresholdBFR(CSI-RS 和 SSB 可分别配置)比较:
候选波束识别的成功与否,决定了后续使用 CFRA(无竞争) 还是 CBRA(基于竞争):
| 候选波束状态 | 是否配置专用前导码 | 采用的随机接入类型 | 说明 |
|---|---|---|---|
| 找到候选波束 | 该波束有 dedicated preamble | CFRA | 1:1 映射,Msg1 仅发一次,最快 |
| 找到候选波束 | 无 dedicated preamble | CBRA | 回退到竞争接入,需 Msg3 冲突解决 |
| 无候选波束 | — | 不发起 BFRQ | 直接 RLF |
这种"先自检、再动手"的设计,避免了在完全无覆盖区域发起无意义的 PRACH,节省 UE 功耗和上行干扰。
BFRQ 本质是一次 PRACH 随机接入过程,但接入的目的不再是"初始接入网络",而是"声明我换了波束,请在新波束上调度我"。
网络通过 BeamFailureRecoveryConfig 为每个候选波束(用其 SSB/CSI-RS 索引标识)预先分配一个专用前导码(dedicated preamble)和对应的 PRACH 时机(RO, RACH Occasion)。UE 在选定的候选波束对应的 RO 上发送该前导码,gNB 一看到这个特定前导码,就同时知道了"是哪个 UE(C-RNTI)"+"UE 想换到哪个波束",因为映射是 1:1 的。
CFRA 仅发送一次 Msg1(preambleTransMax 不适用),不进行功率攀升。
若候选波束没有专用前导码,UE 在该波束的 RO 上随机选择一个竞争前导码发送,流程退化为标准 4-step RACH:Msg1(前导码)→ Msg2(RAR,分配 TC-RNTI 与 UL grant)→ Msg3(携带 BFR MAC CE + C-RNTI MAC CE) → Msg4(用 C-RNTI 加扰的 PDCCH 解决冲突)。
sequenceDiagram
participant UE
participant PHY_UE as UE PHY
participant MAC_UE as UE MAC
participant gNB
participant gNB_MAC as gNB MAC
Note over UE,gNB: 阶段一:BFD检测
MAC_UE->>PHY_UE: 已配置BFD-RS集合(failureDetectionResources)
PHY_UE->>MAC_UE: BFI实例(所有BPL<Qout, BLER=10%)
MAC_UE->>MAC_UE: BFI_COUNTER++, 重启beamFailureDetectionTimer
PHY_UE->>MAC_UE: BFI实例(连续第N次)
MAC_UE->>MAC_UE: BFI_COUNTER=MaxCount → 声明波束失败
Note over UE,gNB: 阶段二:候选识别
MAC_UE->>PHY_UE: 测量candidateBeamRSList
PHY_UE->>MAC_UE: 候选波束X的RSRP >= rsrp-ThresholdBFR
MAC_UE->>MAC_UE: 选中波束X(有dedicated preamble → CFRA)
Note over UE,gNB: 阶段三:BFRQ(CFRA Msg1)
MAC_UE->>gNB: PRACH Msg1: 专用前导码(映射波束X), 单次, 不攀升功率
Note over UE,gNB: 阶段四:BFR响应监测
gNB->>UE: PDCCH: RA-RNTI加扰 → RAR(含TC-RNTI/Timing Advance)
Note over UE: UE在recoverySearchSpaceId搜索空间监听<br/>而非普通RA搜索空间
Note over UE,gNB: 阶段五:MAC CE确认(Msg3)
MAC_UE->>gNB: Msg3: BFR MAC CE(16bit) + C-RNTI MAC CE<br/>指示已恢复到波束X
Note over UE,gNB: 阶段六:完成
gNB->>UE: PDCCH: C-RNTI加扰(非TC-RNTI)
Note over UE,gNB: BFR成功! 新BPL接管, RRC连接不变
BeamFailureRecoveryConfig该 IE 在 TS 38.331 中定义,通过 RadioLinkMonitoringConfig 的兄弟字段、或直接挂在 ServingCellConfig 下,承载全部 BFR 参数:
| IE 字段 | 取值/类型 | 作用 |
|---|---|---|
beamFailureInstanceMaxCount |
enum: n1/n2/n3/.../n20 | BFI 计数上限,触发失败声明 |
beamFailureDetectionTimer |
ms | BFI 计数去抖计时器 |
rsrp-ThresholdBFR |
RSRP 索引 | 候选波束合格门限 |
candidateBeamRSList |
SSB/CSI-RS ID 列表 | 候选波束测量资源集 |
ssb-ResourceRSRP / csirs-ResourceRSRP |
对应测量量 | 分别针对 SSB/CSI-RS 的 RSRP 上报 |
recoverySearchSpaceId |
SearchSpace ID | BFR 响应专用搜索空间(区别于普通 RACH 搜索空间) |
ra-Prioritization |
struct | BFR RACH 的优先级/功率提升 |
msg1-SubcarrierSpacing |
SCS | BFR Msg1 子载波间隔 |
BFR MAC CE 是一个固定 16 比特的控制元素,通过 Msg3 上报,逻辑上紧跟一个 C-RNTI MAC CE(用于让 gNB 用旧 C-RNTI 定位 UE,而非 RAR 分配的临时 TC-RNTI):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| SP / SI 域 | 候选波束索引域 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| C-RNTI (隐式, 单独MAC CE) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
为什么用 MAC CE 而非 RRC 信令? 因为 BFR 必须在毫秒级完成,RRC 过程涉及 ASN.1 编解码、确认重传,时延不可控;MAC CE 走 MAC 子头复用,一条 Msg3 即可携带,是"快路径"的正确载体。
一个极易被忽视但极其关键的细节:BFR 响应(RAR)的监听,不使用普通 RACH 配置的搜索空间,而使用 RRC 单独配置的 recoverySearchSpaceId。这样设计有两个好处:
BFR 完成的唯一判据是:UE 在 recoverySearchSpaceId 上收到一个用其 C-RNTI 加扰的 PDCCH(而非 RA-RNTI 或 TC-RNTI)。一旦收到,意味着 gNB 已经接受新波束、并开始在它上面正常调度该 UE,BFR 流程正式结束,MAC 计数器清零,RRC 层全程无感知。
若 preambleTransMax(CBRA 场景)或 CFRA 响应超时仍未收到任何 PDCCH,UE 放弃 BFR,置起 RLF 标志,进入 T310→T311 的 RRC 重建立流程——此时才真正动到 RRC 层。
Rel-15 的 BFR 只覆盖 SpCell(主小区组的主小区),因为只有 SpCell 承载 PDCCH 命令链路。
随着 CA(Carrier Aggregation)在毫米波广泛部署,一个 SCell 的波束也可能因遮挡失效。Rel-16(TR 38.812 立项,落地于 TS 38.213/38.321)引入 SCell BFR:
| 维度 | SpCell BFR | SCell BFR |
|---|---|---|
| 适用小区 | PCell / PSCell | 辅载波 SCell |
| 恢复信令 | CFRA/CBRA 随机接入 | MAC CE 上报(在 SpCell 发送) |
| 触发条件 | BFD-RS 全部 < Qout | 同 BFD 逻辑 |
| 候选波束指示 | PRACH 专用前导码 1:1 | BFR MAC CE 中的位图 + 候选 ID |
| 是否影响 RRC | 否 | 否 |
| 引入版本 | Rel-15 | Rel-16 |
BFR 主要发生在 Uu 口(空口),在 UE 侧 log(如 Qualcomm QXDM、Mediatek Elayne、srsUE log)中的识别特征:
BFI_IND / beam failure instance,且 BFI_COUNTER 累加到 beamFailureInstanceMaxCount;RA purpose = BFR;ra-SearchSpace 切到 recoverySearchSpaceId;在 gNB 侧(如 O-RAN O-DU log / 厂家基带日志),可看到:专用前导码接收 → TC-RNTI 分配 → C-RNTI 加扰 PDCCH 下发。
| 现象 | 可能根因 | 排查方向 |
|---|---|---|
| BFI 频繁触发但始终未到 MaxCount | 边缘覆盖波动 | 检查 beamFailureInstanceMaxCount 是否过小,或 BFD-RS 配置是否合理 |
| BFRQ 发出但无 RAR | 候选波束实际不可用 / RO 配置错误 | 核验 candidateBeamRSList 与 RO-SSB 映射;检查 UE 功率余量 |
| RAR 收到但后续 PDCCH 无 C-RNTI | gNB 未识别 BFR MAC CE / 厂家兼容 | 检查 Msg3 LCID;查 gNB MAC CE 解析 |
| 频繁 BFR 后仍 RLF | 候选波束全部低于阈值 | 整体覆盖问题,需 RF 优化而非参数调优 |
| ## 十、常见问题 |
Q1:BFR 失败和 RLF 是什么关系? A:BFR 是 RLF 的"前置快速止血"机制。BFD 声明失败后先尝试 BFR(亚层间恢复,不动 RRC);只有 BFR 也失败(无候选波束或 PRACH 攀升耗尽),才升级为 RLF,触发 RRC 重建立。两者通过 MAC 计数器与时序隔离,BFR 成功则 RLF 流程完全不启动。
Q2:CFRA 和 CBRA 在 BFR 中如何选择?
A:取决于候选波束是否被预分配了专用前导码。有则 CFRA(Msg1 单次、无竞争、最快);无则回退 CBRA(标准 4 步接入,需 Msg3 冲突解决)。运营商/厂商通过 BeamFailureRecoveryConfig 中的专用前导码分配范围决定路径。
Q3:为什么 BFR 响应要用单独的搜索空间 recoverySearchSpaceId?
A:因为波束失败时 UE 处于最差接收条件下,专用搜索空间允许 gNB 用更高聚合等级、更密监听周期下发 RAR,并与普通数据/RA 调度解耦,确保恢复信令在最差波束下也可解。
Q4:SCell BFR 为什么不发起随机接入? A:SCell 通常不配置 PRACH 资源(PRACH 主要在 SpCell),且 SCell 失效时 UE 仍可通过 SpCell 与网络通信。因此 SCell BFR 改用"在 SpCell 上发送 BFR MAC CE(带失败 SCell 位图 + 候选波束)"的方式上报,gNB 据此重配 TCI 状态,省去空口随机接入开销。
Q5:BFR MAC CE 携带的 C-RNTI 起什么作用? A:Msg3 中的 C-RNTI MAC CE 让 gNB 用 UE 的永久 C-RNTI 定位它(而非 RAR 临时分配的 TC-RNTI),随后 gNB 直接用 C-RNTI 加扰 PDCCH 完成冲突解决与调度,这是 BFR 与初始接入在 Msg3/Msg4 阶段的关键差异。
BeamFailureRecoveryConfig 等 IE 定义本文由「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 等场景全覆盖。
