想象你走进一家繁忙的餐厅。你不知道服务员是谁,也不知道座位在哪里。你需要做的第一件事是什么?——举手示意,引起注意,然后被领到座位上。
5G网络中的随机接入(Random Access)就是这个"举手示意"的过程。手机(UE)从沉默状态需要和基站(gNB)建立通信时,第一步就是发起随机接入——在没有任何上行资源的情况下,用一套精心设计的信令流程,让基站知道"我在这里,我要接入"。
这个过程看似简单,实则暗藏玄机:多个手机可能同时"举手",如何区分?信号经过不同距离传播后到达时间不同,如何同步?前导码如何设计才能让基站高效检测?本文将逐一拆解这些问题。
随机接入并不是一个"锦上添花"的功能,它是移动通信系统运转的基础枢纽。以下场景都必须触发随机接入:
| 触发场景 | 说明 | RA类型 |
|---|---|---|
| 初始接入 | 手机开机或从无覆盖区恢复,需要建立RRC连接 | CBRA |
| RRC重建 | 连接中断后尝试恢复 | CBRA |
| 切换 | 从源基站切换到目标基站,需要在目标基站快速同步 | CFRA(通常) |
| 下行数据到达 | 手机处于RRC_INACTIVE/IDLE态,基站收到下行数据需寻呼手机 | CBRA |
| 上行数据到达 | 手机有数据要发但处于非连接态,或没有PUCCH资源发调度请求 | CBRA |
| 上行失步 | 连接态下上行定时失步,需重新获取TA(Timing Advance) | CFRA |
| 波束失败恢复 | FR2毫米波场景下,当前波束失效需切换到新波束 | CFRA |
| SI请求 | 需要按需获取系统信息(Other SI) | CBRA |
核心共性:只要手机还没有上行同步(不知道该在什么时刻发送信号),就必须通过随机接入来获取同步。
随机接入的第一步是手机发送一个PRACH前导码(Preamble)。这个前导码的结构非常讲究:
┌──────────┬────────────────────────────┬──────────┐
│ CP │ Preamble Sequence │ GT │
│ 循环前缀 │ (ZC序列,通常839点) │ 保护间隔 │
└──────────┴────────────────────────────┴──────────┘
↑ ↑ ↑
抵抗多径延迟 携带身份信息 防止溢出到下一个符号
前导码序列不是随便选的。5G选择了Zadoff-Chu(ZC)序列,这是一个在通信领域被广泛使用的数学序列。它的核心优势可以用一个词概括:CAZAC——恒包络零自相关(Constant Amplitude Zero AutoCorrelation)。
用通俗的话来说:
恒包络:序列的每个样点幅度都相同,意味着发射信号的峰均比(PAPR)很低,功放效率高——手机省电。
完美的自相关性:序列和自己做相关运算,只有完全对齐时才产生一个尖锐的峰值,偏移哪怕一个采样点,相关值就迅速降到接近零。这使得基站能精确测量信号的到达时间,从而估算出定时提前量(TA)。
低互相关性:不同根序列索引产生的ZC序列之间相关值很低,使得基站能同时检测多个不同手机发出的前导码。
ZC序列的数学定义如下:
$$x_u[n] = e^{-j\frac{\pi u n(n+1)}{N_{ZC}}}$$
其中 $u$ 是根序列索引(root sequence index),$N_{ZC}$ 是序列长度(FR1通常为839,FR2为139)。$n = 0, 1, 2, ..., N_{ZC}-1$。
一个小区需要提供64个前导码供手机选择。但根序列索引不需要64个——通过对一个根序列做循环移位(Cyclic Shift),就可以衍生出多个正交的前导码:
$$x_{u,v}[n] = x_u[(n + C_v) \mod N_{ZC}]$$
其中 $C_v$ 是第 $v$ 个循环移位量,由参数 $N_{CS}$(零相关区配置)决定。
flowchart TD
A["根序列 u\n(rootSequenceIndex)"] --> B["循环移位 0×Ncs"]
A --> C["循环移位 1×Ncs"]
A --> D["循环移位 2×Ncs"]
A --> E["循环移位 ...×Ncs"]
A --> F["循环移位 (L-1)×Ncs"]
B --> G["前导码 #0"]
C --> H["前导码 #1"]
D --> I["前导码 #2"]
E --> J["前导码 ..."]
F --> K["前导码 #L-1"]
G & H & I & J & K --> L["一个根序列\n可生成 L 个前导码"]
L --> M["若 L < 64\n继续用下一个根序列\nu+1, u+2, ..."]
M --> N["直到凑齐\n64个前导码"]
关键设计哲学:$N_{CS}$ 越大,一个根序列能生成的前导码越少,但每个前导码之间的"安全距离"越大,抗多径干扰能力越强。网络规划时需要在前导码容量和覆盖性能之间做权衡:
| NCS配置 | 小区半径影响 | 前导码容量 |
|---|---|---|
| NCS小(如0) | 仅适用于极小小区 | 一个根序列可生成更多前导码 |
| NCS大(如大覆盖) | 适用于大覆盖小区 | 一个根序列生成的前导码少,需更多根序列 |
5G定义了多种前导码格式,核心区别在于CP长度和序列重复次数:
| 格式 | 适用频段 | 序列长度 | 特点 |
|---|---|---|---|
| Format 0 | FR1 | 839 | 类似LTE,标准覆盖 |
| Format 1 | FR1 | 839 | 长CP+长序列,大覆盖(~100km) |
| Format 2 | FR1 | 839 | 序列重复4次,增强覆盖可靠性 |
| Format 3 | FR1 | 839 | 更长CP,超大覆盖(SUL场景) |
| Format A1/A2/A3 | FR2 | 139 | 短序列,小覆盖毫米波 |
| Format B1/B4 | FR2 | 139 | 不同CP/GT组合 |
| Format C0/C2 | FR2 | 139 | 极短,超低时延场景 |
设计直觉:覆盖距离越远,信号传播时间越长,就需要越长的CP来"吸收"时延差。而序列重复发送可以提升检测概率——好比敲门敲得越久,里面的人越容易听到。
基于竞争的随机接入(Contention-Based Random Access, CBRA)是最常见的随机接入方式。完整信令流程如下:
sequenceDiagram
participant UE as 手机(UE)
participant gNB as 基站(gNB)
Note over UE: 选择随机前导码<br/>计算发送功率
UE->>gNB: Msg1: PRACH前导码<br/>(RA-RNTI标识RO位置)
Note over gNB: 检测前导码<br/>估计TA值
gNB->>UE: Msg2: RAR(随机接入响应)<br/>PDCCH(RA-RNTI) → PDSCH<br/>含: TA, TC-RNTI, UL Grant
Note over UE: 应用TA调整上行定时<br/>使用TC-RNTI作为临时身份
UE->>gNB: Msg3: 调度传输<br/>PUSCH(TC-RNTI)<br/>携带UE身份(RRCSetupRequest)
Note over gNB: 记录UE身份<br/>分配C-RNTI
gNB->>UE: Msg4: 竞争解决<br/>PDSCH(TC-RNTI→C-RNTI)<br/>含: 竞争解决ID + RRCSetup
Note over UE: 比对竞争解决ID<br/>匹配→接入成功
手机从SIB1广播消息中获取PRACH配置参数后,会:
prach-ConfigurationIndex确定PRACH时机(RACH Occasion, RO)的时频位置。$$P_{PRACH} = \min{P_{CMAX}, P_{target} + PL}$$
其中 $P_{target}$ 是基站期望接收的前导码目标功率(由参数preambleReceivedTargetPower配置),$PL$ 是手机估算的路径损耗。
如果没收到RAR怎么办? 手机会执行功率爬升(Power Ramping):每次重发前导码时,功率增加powerRampingStep(通常2dB或4dB),最多重发preambleTransMax次。好比敲门没人应,就一次比一次敲得大声。
RA-RNTI的计算:Msg1本身不携带UE身份,但基站通过前导码发送的时频位置(RO)来标识这次接入请求。RA-RNTI的计算公式为:
$$RA\text{-}RNTI = 1 + s_{id} + 14 \times t_{id} + 14 \times 80 \times f_{id} + 14 \times 80 \times 8 \times ul_{carrier_id}$$
其中 $s_{id}$ 是PRACH时机的第一个OFDM符号索引(0~13),$t_{id}$ 是时隙索引(0~79),$f_{id}$ 是频域RO索引(0~7),$ul_{carrier_id}$ 是上行载波标识(NUL=0, SUL=1)。
基站检测到前导码后,会在一个RAR时间窗口内回复随机接入响应(RAR)。RAR的调度流程是:
RAR消息中包含的关键信息:
| 字段 | 作用 | 类比 |
|---|---|---|
| TA(Timing Advance) | 上行定时提前量,校准手机发送时间 | 告诉你"你说话晚了多少,提前一点" |
| TC-RNTI | 临时C-RNTI,作为手机的临时身份 | 发给你一张临时工牌 |
| UL Grant | 为Msg3分配的上行资源(时频位置、MCS) | 给你安排一个发言时段 |
| RAPID | 前导码ID,确认基站检测到的是哪个前导码 | 确认"我听到了你敲的那下门" |
TA的物理含义:电磁波从手机到基站有传播时延。如果不补偿,不同距离的手机发送的上行信号到达基站时就不对齐,会造成符号间干扰。TA命令告诉手机需要提前多少微秒发送信号,使得所有手机的上行信号同时到达基站。
手机收到Msg2后,知道了该用什么时间频率发送,也获得了临时身份TC-RNTI。现在需要告诉基站"我是谁":
RRCSetupRequest消息,包含UE的身份(5G-S-TMSI或随机数)。RRCReestablishmentRequest。Msg3的关键作用是参与竞争解决。因为多个手机可能恰好在同一个RO上选了同一个前导码(碰撞!),基站需要通过Msg3中的UE身份来区分到底是谁在接入。
基站在Msg4中回传竞争解决身份(Contention Resolution Identity),其实就是把Msg3中UE发送的身份信息原封不动或经处理后回传。
flowchart TD
A["UE发送Msg1: 选择前导码#23"] --> B["gNB检测到前导码#23"]
B --> C["但此时UE-A和UE-B<br/>都选了前导码#23!"]
C --> D["gNB发送Msg2: RAR<br/>UE-A和UE-B都以为在叫自己"]
D --> E["UE-A发送Msg3: 身份A<br/>UE-B发送Msg3: 身份B"]
E --> F["gNB收到Msg3<br/>选择其中一个(如UE-A)"]
F --> G["gNB发送Msg4: 竞争解决<br/>携带UE-A的身份"]
G --> H{"UE-A检查Msg4身份"}
H -->|"匹配!"| I["UE-A接入成功 ✅"]
G --> J{"UE-B检查Msg4身份"}
J -->|"不匹配"| K["UE-B竞争失败 ❌<br/>退避后重新发起RA"]
竞争失败的UE不会立刻再次尝试,而是等待一个退避时间(Backoff Indicator),这个时间由基站在Msg2中可选下发,目的是错开多个失败UE的重试时机,避免再次碰撞。
并非所有随机接入都需要竞争。在某些场景下,基站可以给手机分配一个专用前导码,确保不会和其他手机碰撞:
sequenceDiagram
participant UE as 手机(UE)
participant gNB as 基站(gNB)
Note over gNB: 通过RRC重配或PDCCH order<br/>分配专用前导码
gNB->>UE: Msg0: 专用前导码分配<br/>(含: preamble index + RO)
Note over UE: 使用指定前导码<br/>在指定RO发送
UE->>gNB: Msg1: 专用前导码(无碰撞)
Note over gNB: 检测到专用前导码<br/>直接确定UE身份
gNB->>UE: Msg2: RAR(含TA, UL Grant)
Note over UE: 获得上行同步<br/>接入完成!
CFRA省掉了Msg3和Msg4,因为专用前导码本身就标识了UE身份——就像VIP号码牌,不存在认错人的可能。
CFRA的典型应用场景:
| 场景 | 专用前导码如何下发 |
|---|---|
| 切换 | 源基站通过Xn/F1接口向目标基站请求专用前导码,目标基站通过HO Command转给UE |
| 下行数据到达(RRC_INACTIVE) | 基站通过PDCCH order触发UE发起CFRA |
| 波束失败恢复 | 基站在新波束上为UE分配专用前导码 |
| 上行失步恢复 | 基站通过PDCCH order指定专用前导码 |
3GPP Release 16引入了两步随机接入,将四步合并为两步:
| 4-Step RACH | 2-Step RACH | |
|---|---|---|
| Msg1 | 前导码 | MsgA = 前导码 + PUSCH payload |
| Msg2 | RAR | — |
| Msg3 | 调度传输 | — |
| Msg4 | 竞争解决 | MsgB = RAR + 竞争解决 |
| 延迟 | ~4次往返 | ~2次往返 |
| 信令开销 | 高 | 低 |
| 适用场景 | 通用场景 | 小包、IoT、URLLC、FR2波束恢复 |
MsgA的结构:手机在PRACH上发送前导码的同时,在紧随其后的PUSCH上发送负载(如RRCSetupRequest)。这要求网络预先配置好PRACH和PUSCH之间的映射关系。
MsgB的三种响应:
2-Step RACH的设计哲学:在网络负载较低、信道条件较好的场景下,一次联合传输的成功概率很高,没必要分四步走。但在负载高、干扰大的场景下,四步流程更稳健。因此2-Step RACH通常需要具备回退到4-Step的能力。
基站通过SIB1中的RACH-ConfigCommon和RACH-ConfigGeneric向所有手机广播PRACH配置参数:
| 参数 | 含义 |
|---|---|
prach-ConfigurationIndex |
查表确定前导码格式、发送周期、子帧/符号位置 |
msg1-FrequencyStart |
PRACH在频域的起始位置(PRB偏移) |
msg1-SubcarrierSpacing |
PRACH的子载波间隔(1.25kHz或5kHz for FR1) |
zeroCorrelationZoneConfig |
查表得到NCS值,决定循环移位间隔 |
rootSequenceIndex |
起始根序列索引 |
numberOfRA-Preambles |
用于CBRA的前导码数量(≤64) |
powerRampingStep |
功率爬升步长(0/2/4/6 dB) |
preambleReceivedTargetPower |
基站期望接收的前导码功率 |
preambleTransMax |
最大前导码重发次数 |
ra-ResponseWindow |
RAR接收窗口长度(slot数) |
RACH Occasion(RO) 是手机可以发送PRACH的时频资源格子。网络通过prach-ConfigurationIndex查表来确定每个帧中哪些子帧/时隙/符号包含RO。频域上,RO占6个连续PRB。
SSB与RO的关联:手机在选择RO时,会根据测量到的SSB信号质量(RSRP),选择一个波束方向对应的RO发送前导码。这样基站收到前导码时,就知道手机在哪个波束方向上——便于后续的波束赋形通信。这个映射关系由参数ssb-perRACH-OccasionAndCB-PreamblesPerSSB配置。
手机第一次发送PRACH前导码时使用基准功率。如果没收到Msg2(RAR超时),就提高功率重试:
$$P_{PRACH}^{(n)} = \min{P_{CMAX},\ P_{target} + PL + (n-1) \times \Delta P}$$
其中 $n$ 是前导码发送次数,$\Delta P$ 是功率爬升步长。
工程启示:如果手机反复功率爬升到最大仍无法接入,可能原因包括:
竞争失败后,手机在重试前需要等待一个随机退避时间:
$$T_{backoff} = rand(0, BI)$$
BI(Backoff Indicator)由基站在Msg2中可选下发,取值范围为0~960ms。退避的目的是避免多台手机在同一时刻再次碰撞——就像餐厅门口多位顾客同时被叫号失败后,各自随机等待不同时间再排队。
在网络规划中,相邻小区不能使用相同的根序列索引(否则会导致前导码混淆)。根序列索引需要按照一定的复用距离进行分配——类似PCI规划,需要避免冲突和混淆。
调试要点: - 检查根序列索引分配是否满足复用距离 - 检查NCS配置是否匹配小区半径(覆盖大的小区需要更大的NCS) - 检查前导码池是否足够(高负载场景下64个前导码可能不够)
如果大量UE报告"随机接入失败,RAR超时",可能原因: - 基站PRACH检测能力不足(硬件问题) - 上行干扰导致前导码检测失败 - RAR窗口配置过短 - PDCCH拥塞(无法调度RAR)
在密集城区或大规模IoT部署场景,前导码碰撞概率会显著上升: - 监控指标:PRACH尝试次数/成功率、Msg3/Msg4交互延迟 - 优化手段:增加RO密度、扩大前导码池(减少每SSB的前导码数以增加SSB-RO映射)、启用2-Step RACH
2-Step RACH并非总是优于4-Step。在以下情况下2-Step更优: - 小数据包传输(IoT上报、URLLC) - 良好信道条件(RSRP高) - 中低负载场景
在高负载、高干扰场景下,2-Step的MsgA成功率下降,频繁回退到4-Step反而增加开销。
| 维度 | CBRA(4-Step) | CFRA | 2-Step RACH |
|---|---|---|---|
| 步数 | 4步 | 3步(含Msg0) | 2步 |
| 前导码选择 | UE随机选择 | gNB专用分配 | UE随机选择 |
| 碰撞可能性 | 有 | 无 | 有(但概率可降低) |
| 延迟 | 中 | 低 | 最低 |
| 信令开销 | 高 | 低 | 最低 |
| 适用场景 | 初始接入、RRC重建 | 切换、波束恢复 | IoT、URLLC、小包 |
| 引入版本 | Rel-15 | Rel-15 | Rel-16 |
| 回退能力 | 向高层报告失败 | N/A | 回退到4-Step |
Q: PRACH前导码和DM-RS有什么区别?不都是"参考信号"吗?
A: 它们的本质区别在于目的和发送时机。PRACH前导码是在没有上行同步的情况下发送的,目的是让基站检测到UE的存在并估算TA;DM-RS是在已经同步的PUSCH/PUCCH中嵌入的,目的是让基站做信道估计以解调数据。打个比方,PRACH是"敲门",DM-RS是"说话时的背景音"帮助对方听清你的话。
Q: 一个小区最多能同时接入多少手机?
A: 这取决于前导码池大小(最多64个)和RO的密度。每个RO在同一时刻最多支持64个不同的前导码。如果网络配置了密集的RO(例如每5ms一个),理论上每秒可以支持数千次随机接入尝试。但实际容量受限于碰撞概率和基站处理能力。在IoT密集场景下,可能需要通过2-Step RACH或扩展前导码资源来提升容量。
Q: 为什么Msg3已经发了UE身份,还需要Msg4做竞争解决?
A: 因为Msg3可能在基站侧发生碰撞(多个UE在同一个UL Grant上发送,基站只解码出其中一个)。Msg4的目的是让每个参与竞争的UE都能明确知道自己是否"中奖"——没中奖的UE可以尽快退避重试,而不是傻等。这是一种"广播式确认"的设计,比"逐个通知"更高效。
Q: 2-Step RACH会完全替代4-Step RACH吗?
A: 不会。两者是互补关系。2-Step RACH在小包、低负载、好信道条件下优势明显;但在高负载、干扰复杂的场景下,4-Step RACH的渐进式流程更稳健。3GPP标准要求2-Step RACH必须支持回退到4-Step,说明两者将长期共存。
Q: PRACH的功率爬升会一直增加功率吗?
A: 不会。功率爬升受两个约束:一是preambleTransMax限制了最大重发次数(通常4~8次);二是手机最大发射功率 $P_{CMAX}$ 封顶。到达任一限制后,如果仍然接入失败,MAC层会向上层报告随机接入问题,可能触发RRC重建或进入空闲态。
本文由「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 等场景全覆盖。
