设想你第一次走进一家没有前台、没有门铃的巨型写字楼,想找某一间办公室谈一笔生意。你不知道里面的人在不在,不知道该找谁,甚至不知道自己站的位置信号能不能传进去。你能做的只有一件事:先制造一个响动,等里面的人回应你。
这个"先制造一个响动、再被回应"的过程,就是移动通信里最基础、也最精妙的一环——随机接入(Random Access)。无论你的手机是刚开机要注册、还是正坐着高铁从一个基站飞奔到下一个基站,它在能正常收发数据之前,都必须先完成随机接入。
今天这篇,我们就把"敲门"这件事从头到尾拆开来看:为什么必须设计这样一套流程?那个叫 preamble 的"暗号"为什么非得用一种叫 Zadoff-Chu 的数学序列?两个人同时敲门撞车了系统怎么仲裁?文章最后,我们还会聊聊 5G 在 R16 里引入的"2 步法"到底省了什么。
很多人学随机接入,一上来就背 Msg1、Msg2、Msg3、Msg4,却没想清楚一个根本性的矛盾:
终端在真正接入之前,和基站之间是"各说各的"——上行时钟不同步、没有身份、没有专用资源。那它怎么让基站"听见"自己?
这就是著名的"鸡生蛋"难题。在正常的上下行数据传输里,终端用的是被基站精确调度过的时频资源,发什么、什么时候发、用多大功率,都是基站一条条指令安排好的。但在接入这一刻,这套调度机制还完全没建立起来。终端就像一个还没拿到入场券的人,连站哪块地砖都被规定了。
随机接入要同时解决三个目标:
| 目标 | 通俗说法 | 技术含义 |
|---|---|---|
| 上行同步 | 对齐"手表" | 让终端的上行发送时刻对准基站的接收窗口(通过 Timing Advance) |
| 身份建立 | 拿到工牌 | 给终端分配一个临时身份(TC-RNTI),后续升级为正式 C-RNTI |
| 资源申请 | 申请工位 | 给终端分配上行传输资源(UL Grant),让它能继续发真正的信令 |
理解了这三个目标,你就会明白后面每一步"为什么这样设计"——它们都是奔着这三个目标去的。
随机接入分两类,对应不同的场景:
竞争型随机接入(CBRA,Contention-Based):终端自己随机挑一个 preamble 暗号去敲门。好处是谁都能用、无需预约;坏处是万一两个人挑到同一个暗号,就会"撞车",需要后续仲裁。开机注册、RRC 连接建立、上行失步恢复都用它。
非竞争型随机接入(CFRA,Contention-Free):基站指定一个专用 preamble 给某个终端用,别人不许碰,所以不会撞车。切换、下行数据到达等场景用它,因为基站已经知道这个终端要来了,提前打招呼。
一个直觉:竞争型像食堂排队抢位置(可能撞),非竞争型像预约挂号(不会撞,但得先有预约资格)。
竞争型随机接入的标准流程是"四步舞",我们先用一张时序图把全局看清楚,再逐个拆。
sequenceDiagram
participant UE as 终端 (UE)
participant gNB as 基站 (gNB)
Note over UE: 还没上行同步、没身份、没资源
UE->>gNB: Msg1: 随机选一个 Preamble (ZC序列)<br/>在某个 PRACH 时机(RO)上发送
Note over gNB: 检测preamble + 估算TA
gNB->>UE: Msg2: RAR 随机接入响应<br/>(TA, TC-RNTI, UL Grant)
Note over UE: 拿到TA→上行同步<br/>拿到UL Grant→有资源发Msg3
UE->>gNB: Msg3: RRC连接请求<br/>(UE身份/建立原因)
Note over gNB: 知道你是谁了
gNB->>UE: Msg4: 竞争解决<br/>(回显UE身份)
Note over UE: 身份比对成功→TC-RNTI升级为C-RNTI<br/>接入完成!
终端从 64 个可用 preamble 里随机挑一个,在预先配置好的 PRACH 资源(叫 RO,RACH Occasion)上发出去。注意这个信号不需要被精确调度,因为它用的是"预留出来给所有人敲门用的公共资源区"。
这一步发送的 preamble,就是后文要重点讲的 Zadoff-Chu 序列。
基站收到 preamble 后,要在一段响应窗口(ra-ResponseWindow)内回一个 RAR(Random Access Response)。这条消息用 RA-RNTI 加扰(RA-RNTI 是根据 UE 用的 RO 时频位置算出来的,下文细讲)。RAR 里塞了三样关键东西:
终端拿到 UL Grant 后,第一次在被调度的资源上发正式信令(通常是 RRC 连接请求),里面带上自己的身份(比如 S-TMSI,或一个随机数)。这一步之所以重要,是因为 Msg1 只是"喊了一嗓子",基站并不知道是谁喊的——要等到 Msg3,基站才真正"认人"。
如果两个人在 Msg1 撞了车(选了同一个 preamble),Msg3 就成了决胜负的关键。基站在 Msg4 里回显它在 Msg3 里成功解码的那个 UE 的身份,终端拿自己 Msg3 发的身份去比对:
这是整篇文章最值得琢磨的地方。终端敲门时发的这个信号,为什么不能随便发一段正弦波、或者一段随机噪声?为什么全世界的移动通信标准(LTE、NR)都选了 Zadoff-Chu(ZC)序列?
ZC 序列属于 CAZAC(Constant Amplitude Zero Auto-Correlation) 序列,学名"恒模零自相关序列"。长度为 $L_{\mathrm{RA}}$、根索引为 $u$ 的 ZC 序列定义为:
$$x_u(n) = e^{-j\pi u \dfrac{n(n+1)}{L_{\mathrm{RA}}}}, \quad n = 0,1,\dots,L_{\mathrm{RA}}-1$$
别被公式吓到,关键在于它的几条"超能力",这些超能力完美匹配了基站检测 preamble 的需求:
| 特性 | 数学含义 | 工程价值(为什么这样设计) |
|---|---|---|
| 恒定包络 | 时域幅值恒为 1 | 功放效率高,PAPR 低,省电——上行对终端电池极友好 |
| 理想自相关 | 自相关是冲激函数(仅零点有峰) | 基站用"相关峰"精确锁定 preamble 到达时刻,从而精确算出传播时延和 TA |
| 理想互相关 | 不同根序列互相关近于零 | 多个终端同时敲门、用不同 preamble,互不干扰,基站能区分 |
| 循环移位正交 | 同一根序列做不同循环移位得到正交序列 | 一个根序列能派生多个 preamble,省资源 |
这是 ZC 序列最经济的设计。一个小区要给终端准备 64 个 preamble 备选,难道要存 64 条不同的根序列吗?不需要。
利用循环移位(Cyclic Shift, $N_{\mathrm{CS}}$),把同一条 ZC 根序列整体"循环挪动"不同位数,就能得到一组相互正交的 preamble:
$$x_{u,v}(n) = x_u\big((n + vN_{\mathrm{CS}}) \bmod L_{\mathrm{RA}}\big)$$
挪动一位就是一个新暗号,挪动 $v$ 位得到第 $v$ 个暗号。一条根序列能挤出多少个正交 preamble,取决于 $N_{\mathrm{CS}}$(循环移位步长)。小区通过 prach-RootSequenceIndex 告诉终端从哪条根序列开始,终端按表自动生成 64 个;不够 64 个再用下一条根序列补。
直觉:就像一条彩带,你把它剪开成等长的若干段,每段起点的"花纹相位"不同,但都来自同一条带子。基站只要拿着原版花纹去和收到的信号做相关运算,峰值出现在哪个相位偏移上,就知道你用的是第几号暗号。
基站这边其实不需要一个个试。因为 ZC 序列的 DFT 还是 ZC 序列(这个性质很妙),基站可以用 FFT/IFFT 一次性完成相关运算:
flowchart TD
A["接收到的上行信号"] --> B["去 CP + FFT<br/>变到频域"]
B --> C["乘以本地 ZC 根序列的<br/>共轭(频域相乘=时域相关)"]
C --> D["IFFT 变回时域"]
D --> E{"找峰值"}
E -->|"峰值位置"| F["→ 得到循环移位<br/>= 哪个 preamble index"]
E -->|"峰值位置<br/>偏移量"| G["→ 得到 TA<br/>= 传播时延"]
E -->|"峰值高度"| H["→ 信号质量判断"]
F --> I["完整识别了敲门者"]
G --> I
H --> I
一次 IFFT 同时干完了三件事:识别你用了哪个暗号、算出你的 TA、评估信号质量。这就是为什么随机接入能"便宜地"被检测——它把一个多目标检测问题,转化成了一次高效的频域相关运算。
preamble 的物理结构是固定的三段式:
flowchart LR
subgraph Preamble["一个 PRACH Preamble 的结构"]
direction LR
CP["循环前缀 CP"] --> SEQ["Preamble 序列<br/>(1个或多个重复的ZC序列)"] --> GT["保护间隔 GT<br/>(Guard Time)"]
end
为什么非要这三段?这是覆盖范围(小区半径)与时延之间的工程权衡:
为什么 GT 要是"往返两倍"?因为终端发 preamble 时还没有 TA,它不知道自己该提前多久发。结果就是:远处终端的信号会比基站预期晚到,这个"晚到"会"溢出"到下一个子帧,污染别人的资源。GT 就是故意留出来吸收这个溢出的"缓冲垫"。GT 越长,能容忍的小区半径越大。
$$\text{可支持的小区半径} \approx \frac{c \cdot T_{\mathrm{GT}}}{2}, \quad c = 3\times10^8 \text{ m/s}$$
这就解释了一个常被问到的设计点:为什么不同场景配不同的 PRACH format? 因为短格式(如 format 0,约 1ms)适合小小区、低时延;长格式(如 format 3,序列重复多次)适合大覆盖、卫星场景。一张表就是不同的"CP/序列/GT 时间分配"配方。
| 场景需求 | 倾向选择 | 原因 |
|---|---|---|
| 室内/密集城区(小小区、低时延) | 短格式(A1/B1 等) | GT 短没关系,小区半径小;省时间 |
| 宏覆盖(大小区) | 长格式(0/1/3) | GT 和序列都长,撑得住远距离 |
| 海事/卫星(超大覆盖) | format 3(最长) | 往返时延巨大,必须超长 GT |
| 高速移动 | restricted set preamble | 防止多普勒频移破坏循环移位正交性 |
5G 的随机接入比 4G 多了两层精巧设计,都藏在 Msg1 的"发送方式"里。
Msg1 发出去后,终端怎么知道 Msg2 是回给"我"的?答案是 RA-RNTI。它不是基站分配的,而是终端根据自己发送 Msg1 时占用的 RO 时频位置自己算出来的:
$$\mathrm{RA\text{-}RNTI} = 1 + s_id + 14 \cdot t_id + 14 \cdot 80 \cdot f_id + 14 \cdot 80 \cdot 8 \cdot ul_carrier_id$$
其中 $s_id$(符号索引)、$t_id$(时隙索引)、$f_id$(频域 RO 索引)正好刻画了"你在哪个 RO 上敲的门"。基站收 preamble 时就知道它来自哪个 RO,于是用同样的公式算出 RA-RNTI 去 scramble RAR。终端用自己的 RA-RNTI 去 descramble,能解开就说明这条 RAR 是回给我的。
设计精髓:用"位置"当身份临时令牌,省去了任何预先协商——你在哪敲门,回执就发到哪。
这是 5G 相对 4G 最大的不同之一。5G 基站用波束扫描(SSB 突发集)向不同方向广播同步信号。终端测量后,会锁定一个最好的下行波束(对应某个 SSB index)。
那么问题来了:终端敲门时,怎么让基站知道自己希望用哪个上行波束来回应?
答案是把 SSB index 和 RO 绑死。系统预先规定好一种映射:第 0 号 SSB 对应某几个 RO,第 1 号 SSB 对应另几个 RO……终端只要在"自己锁定的那个 SSB 对应的 RO"上发 Msg1,基站一看"你是从这个 RO 来的",就反推出"你想要的上行波束是第 N 个",于是在 Msg2/Msg4 里用对应的下行波束回你。
flowchart TD
UE["终端测量<br/>锁定最好的下行波束<br/>= SSB #2"] -->|"选择 SSB#2 对应的 RO"| RO["在该 RO 上发 Msg1"]
RO --> gNB["基站: '你从这个RO来<br/>= 你要上行波束#2'"]
gNB -->|"用波束#2回 Msg2/Msg4"| UE2["波束对齐成功"]
这就是为什么 5G 随机接入能天然支持波束——RO 的位置本身就携带了波束选择信息,不需要额外的信令开销。这块在调试波束问题时极常用:如果终端接入困难,工程师会第一时间查 SSB-to-RO 映射配置对不对得上。
随机接入是开环的(终端此时还没和基站建立闭环功率控制),所以终端不知道自己该用多大功率。怎么保证远处的弱信号也能被听见?
5G 用的是功率攀升(Power Ramping):第一次用一个保守的初始功率发 preamble;如果在这段时间内(ra-ResponseWindow)没收到 RAR,就加大一档功率(默认 +2dB 或 +4dB)再发,如此往复,直到收到响应或达到最大次数。
$$P_{\mathrm{PRACH}} = \min\big(P_{\mathrm{CMAX}},\ \mathrm{PREAMBLE_RECEIVED_TARGET_POWER} + \mathrm{PL}\big)$$
其中目标接收功率每次重传递增:
$$\mathrm{PREAMBLE_RECEIVED_TARGET_POWER}(n) = \mathrm{preambleReceivedTargetPower} + (n-1)\cdot \Delta_{\mathrm{ramp}}$$
直觉:像你在嘈杂的商场里喊朋友名字——第一遍小声喊,没人应就提高一档嗓门,再没人就再提高一档,直到他听见。这种"试探式加码"比一上来就用最大功率要省电得多,也减少了对邻区的干扰。
功率攀升次数(preambleTransMax)和步长是工程师调覆盖时的关键参数:步长太小,弱信号区接入慢;步长太大,干扰和耗电都上去了。
竞争型接入最戏剧性的一幕是冲突(collision):两个终端恰好选了同一个 preamble、在同一个 RO 上发 Msg1。基站的相关检测只会看到一个峰值(它们叠加了),根本分不清是两个人。
怎么破?关键在 Msg3 + Msg4 的"对暗号"机制:
flowchart TD
M1["Msg1: UE-A 和 UE-B 都选了 preamble#7<br/>在同一个 RO 发送 → 撞车"] --> M2["Msg2: 基站只回一个 RAR<br/>(都以为是回给自己的)"]
M2 --> M3["Msg3: A 发身份 ID_A, B 发身份 ID_B<br/>(抢着用 grant 发消息)"]
M3 --> M4["Msg4: 基站回显成功解码者的身份<br/>假设是 ID_A"]
M4 --> J1{"UE-A 比对"}
J1 -->|"ID_A == 自己的 ID_A"| W1["A: 我赢了! TC-RNTI→C-RNTI"]
M4 --> J2{"UE-B 比对"}
J2 -->|"ID_A != 自己的 ID_B"| L1["B: 我输了<br/>退避后重新 Msg1"]
设计上的精妙之处:冲突不是被"检测"出来的,而是被通过 Msg4 回显身份"自然仲裁"的。基站只挑一个成功解码的 UE 回应,其他人在比对身份那一刻就知道自己输了,自动退避。无需基站专门发"冲突通知",干净利落。
一个常被忽视的点:Msg3 用 HARQ 重传机制发送,如果两个 UE 的 Msg3 在物理层撞了,基站可能两个都解不出来,那就谁都收不到 Msg4,双双退避重来。所以 Msg3 的功率/调度也会影响接入成功率。
到了 R16,3GPP 引入了 2-step RACH,把四步压成两步:
flowchart LR
subgraph 四步法["4-Step RACH"]
direction LR
A1["Msg1<br/>preamble"] --> A2["Msg2<br/>RAR"] --> A3["Msg3<br/>身份"] --> A4["Msg4<br/>仲裁"]
end
subgraph 两步法["2-Step RACH"]
direction LR
B1["MsgA<br/>= Msg1 + Msg3<br/>(preamble + payload 一起发)"] --> B2["MsgB<br/>= Msg2 + Msg4<br/>(success/backoff 二选一)"]
end
为什么 R16 要搞两步? 核心动机是降低时延和信令开销,特别针对两类场景:
但 2-step 并非银弹:它要求终端在还不确定基站能不能听见自己时就把 payload 发出去(盲发),如果信号不好就白白浪费了这股能量。所以标准里设计了 fallback 机制——2-step 接不进去就自动回退到 4-step。这也回答了一个常见疑问:2-step 不会完全取代 4-step,两者会长期共存,按场景选择。
| 维度 | 4-Step RACH | 2-Step RACH |
|---|---|---|
| 信令往返 | 2 次往返 | 1 次往返 |
| 时延 | 较高 | 更低 |
| 适合场景 | 通用、各种覆盖 | 好覆盖、小数据、低时延 |
| 弱信号表现 | 稳健(preamble 简单) | 较差(payload 盲发浪费能量) |
| 冲突处理 | Msg4 回显仲裁 | MsgB success/backoff |
| 引入版本 | R15 | R16 |
这套原理在现网排障里非常实在,举几个常见陷阱:
"接不上网"首先看 RACH 失败:路测里如果看到终端反复发 Msg1 却收不到 Msg2(RAR 超时),优先排查:覆盖是否太差(功率攀升到顶都喊不应)、PRACH 资源配置(prach-ConfigurationIndex)是否正确、是否有上行干扰把 preamble 淹没了。
接入慢 = 功率攀升次数过多:如果每次接入都要 ramp 好几次才成功,说明初始功率偏低或覆盖边缘。调 preambleReceivedTargetPower 和 powerRampingStep 是网优常用手段。
5G 波束接入异常查 SSB-to-RO 映射:终端在某个方向接入困难,但信号其实不弱,往往是 SSB 到 RO 的映射配置或波束对应出了问题,导致基站回错了波束。
高速场景接入失败:多普勒频移会破坏 ZC 序列的循环移位正交性,导致相关峰错位、TA 估计错。这时要用 restricted set(限制循环移位集合)的 preamble 配置来规避。
切换失败回退到非竞争:切换时基站会给终端专用 preamble(CFRA),如果它检测到目标基站,就用专用码接入不撞车;切不过去则回退竞争型。
Q1:preamble 只有 64 个,要是 64 个终端同时接入,岂不是必然撞车?
A:理论上 64 个 preamble 同时被 65 个以上终端选时必有冲突。但实际上:一是 RO 不止一个(时域周期性 + 频域可配多个 RO),终端分散在不同 RO;二是接入是稀疏事件,同时撞概率低;三是即便撞了,Msg4 仲裁 + 退避重传能兜底。所以 64 个够用,系统是用"概率 + 重传"而非"绝对无冲突"来保证可靠性的。
Q2:竞争型和非竞争型,终端怎么知道该用哪个?
A:看触发场景和基站的指示。开机、RRC 建立、上行失步这些终端"自发起"的场景,没有专用码,只能竞争型;而切换、寻呼响应、基站有下行数据要发等场景,基站会通过信令(如切换命令里的 ra-PreambleIndex)给终端指定一个专用 preamble,走非竞争型,避免冲突。
Q3:TA(Timing Advance)为什么这么重要?没有它会怎样?
A:不同距离的终端,信号到达基站的时刻不同。如果没有 TA 提前补偿,远处终端的信号会"溢出"到下一个子帧,造成严重的符号间干扰,破坏 OFDM 的正交性。基站通过 Msg1 测出时延,在 Msg2 里下发 TA,让终端"提前"发送,使所有终端的信号整齐划一地到达基站接收窗。这是上行同步的灵魂。
Q4:2-step RACH 一定比 4-step 快吗?
A:不一定,分场景。在好覆盖、低时延需求下,2-step 省了一次往返,确实更快;但在弱覆盖下,MsgA 的 payload 盲发可能失败,反而浪费能量和时间,此时回退到 4-step 反而更稳。标准规定 2-step 失败可 fallback 到 4-step,所以是"好上加好",不是无条件替代。
Q5:Zadoff-Chu 序列为什么不怕多普勒频移?它真的完全不怕吗?
A:它不是"完全不怕"。ZC 序列的恒包络和理想相关特性是在无频偏前提下成立的。多普勒频移会让相关峰的位置和幅度都发生偏移,甚至让本该正交的两个循环移位序列"串扰"。解决办法是:低速场景用 unrestricted set(最大化 preamble 数量),高速场景用 restricted set(牺牲部分 preamble 数量,换取抗多普勒的鲁棒性)。所以是"用配置去适配",序列本身并不是万能的。
本文由「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 等场景全覆盖。
