4. RRC连接建立流程:UE发起RRC连接请求、网络侧响应与配置、SRB1建立与初始上下文设置

RRC连接建立,说白了就是UE跟基站之间第一次“握手”。这个流程要是走不顺,后面什么都别谈。我刚开始做LTE协议栈那会儿,最怕的就是RRC连接建立失败——你想想看,用户手机连不上网,第一反应就是骂运营商,而运营商第一个查的就是RRC层日志。

今天咱们就掰开揉碎了讲这个流程。我会结合我实际调试中的踩坑经历,把每个关键点都说到位。

4.1 流程总览:三步走

整个RRC连接建立,可以概括为三个核心步骤:

  1. UE发起RRC连接请求——UE说“我要上网”
  2. 网络侧响应与配置——基站说“好的,给你分配资源”
  3. SRB1建立与初始上下文设置——双方正式建立信令通道,开始传正经数据

下面这张图是我自己画的,把整个信令交互和状态机变化都串起来了。建议你保存下来,调试时对照着看。

RRC连接建立流程(信令与状态机) UE(用户设备) eNB(基站) MME(核心网) RRC连接请求 (SRB0, CCCH) RRC连接建立 (SRB0, CCCH) RRC连接建立完成 (SRB1, DCCH) 初始上下文建立请求 S1-AP 初始上下文建立响应 RRC连接重配置 (SRB1, DCCH) RRC连接重配置完成 UE状态机:RRC_IDLE → RRC_CONNECTED(经过RRC_CONNECTING中间态)

4.2 UE发起RRC连接请求

UE在什么情况下会发起RRC连接?说白了就是有数据要传了——可能是用户打电话、刷网页,也可能是TAU(跟踪区更新)这类信令业务。

UE会在CCCH(公共控制信道)上通过SRB0发送RRCConnectionRequest消息。注意,这时候还没有专用资源,所以用的是公共信道。

关键点:RRC连接请求消息里携带了InitialUE-Identity,这个值可以是IMSI、TMSI或者随机值。我见过不少调试案例,问题就出在这个Identity上——比如TMSI过期了,网络侧不认,直接拒绝连接。

消息体长这样(ASN.1描述):

RRCConnectionRequest ::= SEQUENCE {
    criticalExtensions  CHOICE {
        rrcConnectionRequest-r8  RRCConnectionRequest-r8-IEs,
        criticalExtensionsFuture  SEQUENCE {}
    }
}

RRCConnectionRequest-r8-IEs ::= SEQUENCE {
    initialUE-Identity  InitialUE-Identity,
    cause               EstablishmentCause,
    spare               BIT STRING (SIZE (1))
}

EstablishmentCause有几种取值:mo-Signalling(移动发起的信令)、mo-Data(移动发起的数传)、mt-Access(网络侧触发的接入)、emergency(紧急呼叫)。

我的调试习惯:抓日志时,第一眼看cause值。如果UE上报的是mo-Data但实际是信令流程,那大概率是上层应用层传参错了。我曾经排查过一个诡异问题——手机一直发mo-Data,但核心网侧就是不给建DRB,最后发现是NAS层把信令业务类型填错了。

4.3 网络侧响应与配置

eNB收到请求后,会做两件事:

  1. 资源分配——给UE分配C-RNTI(小区无线网络临时标识)
  2. SRB1配置——在RRCConnectionSetup消息里携带SRB1的配置参数

eNB通过CCCH上的SRB0回复RRCConnectionSetup。这个消息里包含了:

  • radioResourceConfigDedicated:专用资源配置,包括SRB1的RLC、MAC、PHY参数
  • masterCellGroup:主小区组配置,包含MAC层配置、SpCell配置等

注意:RRCConnectionSetup消息是在CCCH上发的,但用的是临时C-RNTI加扰的PDCCH来调度。如果UE没收到这个调度,就会一直等,直到定时器超时重发请求。我遇到过一种情况——eNB发了Setup但UE没收到,原因是PDCCH的DCI格式配错了,UE解不出来。

这里有个容易踩坑的地方:SRB1的RLC模式。规范里SRB1必须用AM(确认模式),但有些实现里默认配成了UM。我刚开始做协议栈时就在这上面栽过跟头——UE收到Setup后,RLC层发现模式不匹配,直接丢弃了消息。

4.4 SRB1建立与初始上下文设置

UE收到RRCConnectionSetup后,会做以下动作:

  1. 配置底层(MAC、RLC、PDCP)建立SRB1
  2. 切换到RRC_CONNECTED状态
  3. 在SRB1上(DCCH信道)发送RRCConnectionSetupComplete

RRCConnectionSetupComplete消息里携带了NAS PDU,这个NAS PDU会被eNB透传给MME。NAS PDU里包含什么?通常是ATTACH REQUESTTAU REQUEST,取决于UE发起连接的原因。

核心逻辑:SRB1建立完成后,UE和eNB之间就有了一个可靠的信令通道。后续所有的RRC信令(重配置、释放等)都在SRB1上走。而NAS消息则通过SRB1透传,eNB不解析,只负责转发。

MME收到NAS PDU后,会触发初始上下文建立流程。MME通过S1-AP接口发送INITIAL CONTEXT SETUP REQUEST给eNB,里面包含了:

  • UE能力信息(如果MME有缓存)
  • 安全上下文(密钥、加密算法)
  • EPS承载列表(包括默认承载的QoS参数)

eNB收到后,会发起RRCConnectionReconfiguration,给UE配置:

  • 安全激活——启动PDCP层的加密和完整性保护
  • SRB2建立(如果需要)——用于NAS消息传输
  • DRB建立——用户面数据承载

UE完成配置后,回复RRCConnectionReconfigurationComplete。至此,整个RRC连接建立流程才算真正走完。

步骤 消息 信道/承载 关键内容
1 RRCConnectionRequest CCCH / SRB0 InitialUE-Identity, EstablishmentCause
2 RRCConnectionSetup CCCH / SRB0 C-RNTI, SRB1配置, MAC配置
3 RRCConnectionSetupComplete DCCH / SRB1 NAS PDU (ATTACH/TAU REQUEST)
4 INITIAL CONTEXT SETUP REQUEST S1-AP 安全上下文, EPS承载, UE能力
5 RRCConnectionReconfiguration DCCH / SRB1 安全激活, SRB2/DRB配置
6 RRCConnectionReconfigurationComplete DCCH / SRB1 确认配置完成

避坑指南:我曾经遇到过一个现场问题——UE发完SetupComplete后,eNB一直没收到Initial Context Setup Request。查了半天,发现是MME侧SCTP链路断了,S1-AP消息根本没发过来。所以调试时,不要只盯着空口日志,S1接口的抓包同样重要。

嗯,这里还要提一句:定时器。RRC连接建立过程中有好几个定时器在跑:

  • T300:UE侧等待RRCConnectionSetup的定时器,超时则重发请求
  • T301:UE侧等待RRCConnectionReconfiguration的定时器
  • T302:eNB侧用于拥塞控制,告诉UE“等会儿再试”

调试时,如果发现UE反复发请求,先看T300有没有超时。如果T300超时了,说明eNB的Setup消息没下来,问题大概率在eNB侧或者空口质量上。

最后总结一句:RRC连接建立是整个LTE协议栈的基石。你把这个流程吃透了,后面学移动性管理、承载建立都会轻松很多。我每次带新人,第一件事就是让他们对着日志把RRC连接建立的每一步都画出来——什么时候发什么消息、用什么信道、状态怎么变,画到滚瓜烂熟为止。

公众号:蓝海资料掘金营,微信deep3321