1. 简述
无论是3G,4G还是现在的5G都需要随机接入过程,随机接入过程主要是为了让基站和UE之间做好上行同步以及初始接入。此文章仅仅帮助大家了解此过程,更加具体的用途及其场景需要参考具体的3GPP协议(38.211,38.212,38.213).主要帮助理解如下几个问题:
- PRACH序列, 时域,频率上怎么产生的?由哪些因素决定?
- 基站怎么检测PRACH,MSG2包含哪些信息?
- MSG3的发送
- MSG4解决冲突
- MSG5完成接入过程
1.1 RACH的目的
a) 达到基站和UE之间的上行同步
b)冲突检测
c)UE能够获取无线空口资源与基站进行初始的RRC交互(i.g RRC connection request)
1.2 触发RACH的场景
触发RACH场景很多,具体的场景可以参考38.300. 此文章主要适用于初学者,在此只是列举最典型的场景:UE处于IDLE下的初始接入。
1.3 RACH的类型:基于冲突检测和非冲突检测
想象一下,一个基站覆盖范围内有很多手机用户,这些用户相互不知道对方是谁,手机和基站此刻上行还没有同步或者说UE还不能和基站通信,但是UE可以收到基站的广播信息(或者说下行已经同步),没有一个机制约束哪个手机应该用哪个空口资源发第一条上行消息(PRACH),手机从广播信息得到的发送PRACH的资源都是一样的资源池,冲突不可避免,两个手机用了同样一个资源同时发送给基站请求,基站下发一个资源,这种情况下就需要解决冲突,哪一个手机是最终获得资源且被基站认可的手机呢,这个过程即基于冲突检测的类型
但是凡事无绝对,有些场景和配置,基站和UE本身相互知道对方的唯一身份ID(即C-RNTI,初学这可以认为这个就是基站测L2的一个和UE交互通信的唯一标识),比如NSA的架构,UE有双连接,在UE初始接入到5G基站之前,UE已经和LTE基站有连接,而LTE基站把UE的这个C-RNTI实现已经传递给了5G基站,UE在发起初始接入前和基站已经认识,所以他们不需要冲突检测,即基于非冲突检测类型
2. RACH流程
预备知识: gNB和UE之间的信令消息传递分为三层. 在RACH的流程中,重要介绍相关的physical layer , MAC 调度层和RRC层。 RLC/PDCP和RACH本身关系不大。
1. Physical layer. 参考38.211
2. L2 (PDCP, RLC, MAC). 参考38.321,38.322,38.323
3. L3(RRC). 参考38.331
2.1 Standalone Arch下的RACH 流程
整个RACH 接入流程分为6个步骤A~F, 下图的括号表示消息发送的协议栈
2.1.1 Step A:广播RACH配置
gNB 基站发送广播信息SIB1给UE,此SIB1信息包括RACH如何接入的参数。RRC层参数包括:
- Prach-ConfigurationIndex:决定时域及prach format的参数
- msg1-FDM:决定频率 FDM方式
- msg1-FrequencyStart:决定频率起始位置
- prach-RootSequencyIndex:决定premable根序列
- zeroCorrelationZoneConfig:决定premable的Cyclic shift及set类型
- preambleRecieivedTargetWindow决定功率门限
- totalNumberOfRA-premables决定小区总的PREAMBLE个数
- ssb-perRACH-OccasionAndCB-PreamblePerSSB决定PRAMBLE和SSB的对应关系
- numberOfRA-PreamablesGroupA:决定做contention based preambles的GROUP的范围
- msg1-SubcarrierSpacing: SCS的大小
2.1.2 step B:MSG1
UE 解析RRC的消息,发送 preamble给BTS 通过PRACH物理信道。物理信道最重要的是premable 的正交序列的产生以及承载序列的时频资源(参考38.211),对于初学者来说,这几个步骤比较难懂,公式很复杂。基本原理就是利用数学上的Zadoff Chu序列产生正交序列,利用傅里叶变化产生symbol
1、Preamble 正交序列的产生:
prach-RootSequencyIndex: 决定了这个公式里面的u
zeroCorrelationZoneConfig: 决定了这个公式里面的Cv
Prach-ConfigurationIndex: 根据38.211协议里面的Table 6.3.3.2-2,可以推导出preamble的format, 这个就决定了公式里面的LRA
原理是每个时域上的RACH occasion都可以参数64个premables,而每个premable都最终产生一个长为LRA的码序列。那么区分不同premable的其实就是两个变量:Cv 和 u. 实际在做网络规划的时候,要考高速移动的场景下多普勒频移,基站侧接收的最大相关峰会移动,为了避免这种情况,我们尽量的把选择的Cv能够错开,使得这64个premables尽量的分散,把LRA分成多个组 Ncs,使用“restricted”类型,否则慢速选择“unrestricted”类型。具体算法:根序列u先不变,Cv 依次递增,如果不够生产64个preamble的根,则依次增加u. 参考38.211 6.3.3.1章节。
举个例子:
rootSequenceindex = 22 --> physical rootSequenceIndex=1
type = unrestricted
zeroCorrelationZoneConfig = 5 -> Ncs = 26
LRA = 839
PRACH Sequence[0] = base sequence I.g[1*(0*1)/839, 1*(1*2)/839.........]
PRACH Sequence[1] = do cyclic shift to base sequence by 1 * 26 samples I.g
[1*(26*27)/839,1*(27*28)/839,]
PRACH Sequence[2] = do cyclic shift to base sequence by 2 * 26 samples
....
PRACH Sequence[31] = do cyclic shift to base sequence by 31 * 26 samples
PRACH Sequence[32] = do cyclic shift to base sequence +1 <generate the new root sequence, see 38.211 6.3.3.1>
PRACH Sequence[33] = do cyclic shift to base sequence +1 by 1 * 26 samples
PRACH Sequence[34] = do cyclic shift to base sequence +1 by 2 * 26 samples
….
PRACH Sequence[63] = do cyclic shift to base sequence+1 by 31 * 26 samples
2、Preamble 频率序列的产生:
根据上面产生的频率上的序列,通过IFFT产生时域上的序列。公式十分复杂,很难一次看懂,建议懂原理就可以,如果是这方面的工程师,建议理解它,毕竟这个是4G,5G甚至可能是6G的物理层的基石,除非有一天无线通信的本质发生了变化。
zeroCorrelationZoneConfig:决定这个公式里面的NCS
举个例子:
3、Preamble时域上序列的产生:
Premable时域位置受影响的有两部分:
- 根据 PRACH configuration index来觉得可选的PRACH occasions.
- 根据SSB beams选择用其中哪个PRACH occasion.
在NR里面,SSB beams和PRACH occasion是有对应关系的,保证UE所在的每一个beam方向都有对应的PRACH occasion可以接入
为了更加清楚,举个例子:TDD FR1 RachConfig = 78, SCS = 30 Khz
"PRACH configuration index"就是RRC配置下来变量,这个参数决定了下面这个表格的所有其他变量的值
此例中包含有3个prach occasions 可以用。UE选择PRACH OCCASION的流程
a. 选择最好的beam
b. 根据beam选择PRACH occasion
RRC 配置参数:Ssb-perRACH-OccasionAndCB-PreamblesPerSSB (NbrOfSsbPerRachOccasion, CbraPreamblesPerSsb)
例如:
SSB0-> Prach occasion0, SSB1-> Prach occasion1, SSB2-> Prach occasion2...
如果UE探测beam1信号质量最好, 就会选择SSB1,也就会选择prach occasion1.
上面三步后,就产生了频率和时域上的数据。
2.1.3 step C:MSG2
BTS发送RAR给UE, RAR承载在下行的物理信道PDCCH/PDSCH上. 可以参考 38.213-8.2 Random Access Response)这个章节。内容包括:
UE发送PRAMBLE的配置参数,在BTS测同样存在,所以BTS是可以容易的解析出来PRAMBLE. 方法就是一个一个位置上的搜索。因为上行,UE和BTS不同步,所以BTS会在理论的时域起始点两端来搜索,如果搜索到了,就可以知道实际的头的位置和理论配置的头的位置的时间差,这个时间差TA(Time advance)就当作上行同步的参考。
发送流程如下:
a. 基站通过PDCCH发送DCI,因为PDCCH是用的TYPE1 common search space, 所以UE是可以事先知道如何去解析PDCCH, PDCCH用RA-RNTI来加扰。
物理层都需要用特别的因子对数据进行加扰,目的在接收端可以很容易识别数据。PRACH数据用RA-RNTI来加扰。特别指出:在这个阶段,BTS还没有和UE通信,加扰的RA-RNTI是一个UE和基站都认识的ID,这个ID和时间,频率的位置有关系
RA-RNTI = RA-RNTI= 1 + s_id + 14 × t_id + 14 × 80 × f_id + 14 × 80 × 8 × ul_carrier_id
,s_id : the index of the first OFDM symbol of the specified PRACH (0 <= s_id < 14)
,t_id : the index of the first slot symbol of the specified PRACH in a system frame (0 <= t_id < 80)
,f_id : the index of the the specified PRACH in the frequency domain(0 <= s_id < 8)
,ul_carrier_id : UL carrier used for Msg1 transmission (0 = normal carrier, 1 = SUL carrier
b. 基站分配下行PDSCH时域和频率资源
c. 基站物理层发送 PDCCH/PDSCH
注意:UE不需要发送HARQ ACK/NACK 给基站
2.1.4 step D: MSG3
UE接收到了UL GRANT信息和TA的信息,UE 就可以调整上行的发送时间,而且根据UL GRANT的信息,构造MSG3. 在这个例子里面,MSG3也包含了RRC connection request消息(注意,这个RRC消息里面有个UE Identity 字段非常重要,用来作为RACH 冲突解除的主要输入)
MSG3发送时间:
MSG3 内容:
L3: RRC connection request msg (UE identitiy,......)
L1:PUSCH, PUSCH 用TC-RNTI来加扰, 时域和频率资源由基站在MSG2的UL GRANT中指示
2.1.5 step E: MSG4
冲突检测及发送 MSG4 RRC connection setup 给UE.
基站可能收到两个UE过来的MSG3,它们用相同的TC-RNTI,但是基站会选择其中一个下发MSG4,且在MAC层会用对应UE的UE Identity构造MAC-CE包。只有对应的那个UE才会在MAC层识别那个数据,这样冲突就解除了。并且设置C-RNTI = TC-RNTI.
UE在物理层,如果数据包没有问题,回HARQ ACK给基站
2.1.6 step F: MSG5
UE发送MSG5 RRC Connection complete msg 给BTS。
3. 相关的消息接口
Followings are based on 38.331 v15.3.0
RACH-ConfigCommon ::= SEQUENCE {
rach-ConfigGeneric RACH-ConfigGeneric,
totalNumberOfRA-Preambles INTEGER (1..63) OPTIONAL, -- Need S
ssb-perRACH-OccasionAndCB-PreamblesPerSSB CHOICE {
oneEighth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
oneFourth ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
oneHalf ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
one ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32,n36,n40,n44,n48,n52,n56,n60,n64},
two ENUMERATED {n4,n8,n12,n16,n20,n24,n28,n32},
four INTEGER (1..16),
eight INTEGER (1..8),
sixteen INTEGER (1..4)
} OPTIONAL, - Need M
groupBconfigured SEQUENCE {
ra-Msg3SizeGroupA ENUMERATED {b56, b144, b208, b256, b282, b480,
b640, b800, b1000, spare7, spare6, spare5,
spare4, spare3, spare2, spare1},
messagePowerOffsetGroupB ENUMERATED { minusinfinity, dB0, dB5, dB8, dB10,
dB12, dB15, dB18},
numberOfRA-PreamblesGroupA INTEGER (1..64)
} OPTIONAL, -- Need R
ra-ContentionResolutionTimer ENUMERATED { sf8, sf16, sf24, sf32, sf40, sf48,
sf56, sf64},
rsrp-ThresholdSSB RSRP-Range OPTIONAL, -- Need R
rsrp-ThresholdSSB-SUL RSRP-Range OPTIONAL, -- Need R
prach-RootSequenceIndex CHOICE {
l839 INTEGER (0..837),
l139 INTEGER (0..137)
},
msg1-SubcarrierSpacing SubcarrierSpacing,
msg3-transformPrecoding ENUMERATED {enabled} OPTIONAL, -- Need R
...
}
RACH-ConfigGeneric ::= SEQUENCE {
prach-ConfigurationIndex INTEGER (0..255),
msg1-FDM ENUMERATED {one, two, four, eight},
msg1-FrequencyStart INTEGER (0..maxNrofPhysicalResourceBlocks-1),
zeroCorrelationZoneConfig INTEGER(0..15),
preambleReceivedTargetPower INTEGER (-200..-74),
preambleTransMax ENUMERATED {n3,n4,n5,n6,n7,n8,n10,n20,n50,n100,n200},
powerRampingStep ENUMERATED {dB0, dB2, dB4, dB6},
ra-ResponseWindow ENUMERATED {sl1, sl2, sl4, sl8, sl10, sl20, sl40, sl80}
}
RACH-ConfigDedicated ::= SEQUENCE {
cfra CFRA OPTIONAL,
ra-Prioritization RA-Prioritization OPTIONAL,
...
}
CFRA ::= SEQUENCE {
occasions SEQUENCE {
rach-ConfigGeneric RACH-ConfigGeneric,
ssb-perRACH-Occasion ENUMERATED {
oneEighth, oneFourth, oneHalf, one, two, four,
eight, sixteen
} OPTIONAL -- Cond SSB-CFRA
} OPTIONAL, -- Need S
resources CHOICE {
ssb SEQUENCE {
ssb-ResourceList SEQUENCE (SIZE(1..maxRA-SSB-Resources))
OF CFRA-SSB-Resource,
ra-ssb-OccasionMaskIndex INTEGER (0..15)
},
csirs SEQUENCE {
csirs-ResourceList SEQUENCE (SIZE(1..maxRA-CSIRS-Resources))
OF CFRA-CSIRS-Resource,
rsrp-ThresholdCSI-RS RSRP-Range
}
},
...,
[[
totalNumberOfRA-Preambles-v1530 INTEGER (1..63) OPTIONAL -- Cond Occasions
]]
}
CFRA-SSB-Resource ::= SEQUENCE {
ssb SSB-Index,
ra-PreambleIndex INTEGER (0..63),
...
}
CFRA-CSIRS-Resource ::= SEQUENCE {
csi-RS CSI-RS-Index,
ra-OccasionList SEQUENCE (SIZE(1..maxRA-OccasionsPerCSIRS))
OF INTEGER (0..maxRA-Occasions-1),
ra-PreambleIndex INTEGER (0..63),
...
}
参考
cfra : Resources for contention free random access to a given target cell
ra-ssb-OccasionMaskIndex : Explicitly signalled PRACH Mask Index for RA Resource selection. The mask is valid for all SSB resources signalled in ssb-ResourceList
ssb : The ID of an SSB transmitted by this serving cell.
ra-PreambleIndex : The preamble index that the UE shall use when performing CF-RA upon selecting the candidate beams identified by this SSB.
csi-RS : The ID of a CSI-RS resource defined in the measurement object associated with this serving cell.
ra-OccasionList : RA occasions that the UE shall use when performing CF-RA upon selecting the candidate beam identified by this CSI-RS.
ra-PreambleIndex : The RA preamble index to use in the RA occasions assoicated with this CSI-RS.