做LTE协议分析的人,十有八九会被系统信息块SIB这套东西绕晕。刚入行的时候,我盯着wireshark里的BCCH消息,满屏的ASN.1树,SIB1、SIB2、SIB3一直到SIB17,每一步都是信息,但每一步又不像想象中那么好读。后来啃完TS36.331,又在eNodeB日志和UE侧log里反复比对,才算把SIB这条线彻底理顺。今天这篇就把4G LTE里系统信息块SIB的核心机制、关键字段、实际获取流程和排查经验一次性讲清楚,适合正在做协议分析、无线网优、终端测试或者刚接触4G模块开发的同行。
1. SIB到底是什么:从“小区广播”说起
1.1 MIB与SIB的分层逻辑
LTE的系统信息被刻意拆成了“一主多从”的结构:一个主系统信息块MIB,加上多个系统信息块SIB。MIB只有24比特,内容很简单,就是下行带宽、PHICH配置、系统帧号的高位。UE开机后必须第一个拿到MIB,因为MIB里才能找到后续读取SIB的“抓手”——尤其是系统帧号SFN和PHICH配置,没有PHICH参数,UE连PDSCH上的SIB都解不了。
为什么不能把所有信息塞进一个块里?原因很朴素:SIB变化频率完全不同,有的几秒一变,有的几年不变。如果把小区选择参数、频段编号、告警消息全放一起,那每次改一个字段都要重新广播一整套,空口开销不可接受。所以LTE把它拆成“MIB + SIB1 + 其他SIB”的树状结构,MIB是小区门口的总平面图,SIB1是楼层索引,其他SIB是各楼层的施工图纸。这样设计还有个好处:UE在不同状态只需要读它关心的那一层。IDLE下最关心的是小区选择和重选参数,CONNECTED下需要的是随机接入和公共信道配置,不需要的SIB可以完全不读,省电也省资源。
1.2 SIB的传输通道与调度机制
MIB走的是BCH,实际映射到PBCH,周期40毫秒,40毫秒内重复4次,UE在PSS/SSS同步之后直接盲解。SIB1和其余SIB走BCCH-DL-SCH,最终映射到PDSCH上,物理层用SI-RNTI加扰PDCCH来调度。这里很多人会混淆:SIB1也是动态调度的,但它的时间位置是固定的——周期80毫秒,80毫秒内每20毫秒重复一次。对于FDD,SIB1通常落在偶数无线帧的子帧5,UE不需要任何额外调度信息就能去那个固定位置尝试解码。
其余SIB被封装在SI消息里,每个SI消息有一个调度周期和调度窗口,这些信息都放在SIB1的schedulingInfoList里告诉UE。SI窗口长度用si-WindowLength表示,可以从1毫秒到40毫秒;SI周期从8个无线帧一直到512个无线帧不等。UE拿到调度表之后,会在每个SI消息对应的窗口范围内,用SI-RNTI监听PDCCH,收到调度指令后去PDSCH上解出对应的SIB。这就是SIB1被称为“调度总表”的原因,没有它,后面所有SIB都是空中阁楼。
提示:分析SIB时,别只盯着字段值。遇到“读不到SIB2”的情况,第一件事不是检查覆盖,而是先回到SIB1,看schedulingInfoList里到底有没有把SIB2映射出来,映射的周期和窗口是否合理。现场至少两回,我因为没查这个,白白在弱场测试上耗了半天。
2. SIB1:小区级“身份证”与调度总表
2.1 SIB1核心字段逐项拆解
SIB1里最核心的一块叫cellAccessRelatedInfo,里面装的是UE能否驻留这个小区的最基本判决条件。
- plmn-IdentityList:公共陆地移动网标识列表。UE拿到自己SIM卡里的PLMN和这个列表比对,如果匹配不上,这个小区直接就不能驻留。所以多PLMN共享小区场景下,这个列表尤其重要,少配一个PLMN,对应运营商的用户就会在这个小区上显示无服务。
- trackingAreaCode:跟踪区码,16比特。它和PLMN合在一起就是完整的TAI,UE做位置更新和寻呼时全靠它。我在现场看日志时有个习惯:从SIB1里解出TAC后,马上用16进制和LMT网管配置对比,很多“有信号但LTE附着失败”的问题,根子就是TAC配置错了或者和相邻小区冲突。
- cellIdentity:小区标识,28比特。MCC+MNC+TAC+CellID合起来就是ECI/CGI,这是全网唯一识别一个小区的关键。注意不同工具显示格式不一样,有的按十进制展示,有的按十六进制展示,比对时先确认进制,不然很容易看错。
- cellBarred:小区是否被禁止接入。这个字段为barred时,普通UE是不允许驻留的,只有紧急呼叫的终端能继续待着。翻日志时看到终端反复选择该小区又立刻被拒,先怀疑这个字段。
- intraFreqReselection:当小区处于barred状态时,这个字段决定UE能不能重选到其他同频小区。它只在cellBarred时才有实际意义。
- csg-Indication:标记这是不是CSG小区,也就是家庭基站或封闭用户组小区。如果是true,普通非成员UE不能驻留,只有CSG成员能接入。
- cellSelectionInfo:包含q-RxLevMin,也就是小区最小接收电平。这个参数直接参与S准则计算,现场一般配成-120dBm到-140dBm之间。配高了会把小区“藏”起来,UE明明测到RSRP不差,但Srxlev算出来为负,就是不肯选这个小区。
- freqBandIndicator:频段编号,比如配成1就是Band 1,配成40就是Band 40。终端支持哪些频段、SIB1里广播哪个频段,两者匹配不上就会终端搜到网但发不起业务。
- ue-TimersAndConstants:包括T300、T301、T310、T311这一堆定时器。它们不放在RRC信令里逐UE下发,而是直接广播给所有UE,好处是保证全网行为一致。出问题时如果T310/N310配置太小,弱场下很容易RLF。
这些字段我建议死记下来,协议分析中90%的“疑难杂症”最后都能归到其中几个字段上。特别是TAC和CellID,很多4G模块日志里能通过AT+CEREG?直接读到,能和SIB1解码结果互相印证。
2.2 schedulingInfoList与SI消息调度
SIB1的另一块核心是调度表。它由一组SchedulingInfo构成,每个SchedulingInfo包含:
- si-Periodicity:SI消息的周期,取值包括rf8、rf16、rf32、rf64、rf128、rf256、rf512。
- sib-MappingInfo:这个SI消息里具体装了哪些SIB。可以只装一个,也可以装多个。
网络中通常会把SIB2单独放在一个SI消息里,因为SIB2是UE建立RRC连接前必须完整拿到的,周期最短。SIB3、SIB4、SIB5可以共用一个稍长的周期,因为移动性参数的时效性没那么强。SIB6、SIB7、SIB8这类异系统邻区,周期往往更长,毕竟异系统信息变化更慢。
窗口计算也值得说清楚。SI窗口对所有SI消息使用同一个si-WindowLength,这个长度配在SIB1里。UE计算某个SI消息的监听起始点,根据该SI消息的周期和窗口长度推导出目标SFN,然后在窗口内每个子帧都用SI-RNTI尝试解PDCCH。如果你在抓包里看到UE反复收SI消息,不要以为网络发多了,这很可能只是space节能机制按窗口内的重复调度接收。
2.3 实际解码示例:从抓包工具里看SIB1
用wireshark解LTE RRC时,SIB1会以类似这样的树结构展示出来:
SystemInformationBlockType1: cellAccessRelatedInfo: plmn-IdentityList: plmn-Identity: mcc: 460 mnc: 00 cellReservedForOperatorUse: notReserved trackingAreaCode: 0x2A31 cellIdentity: 0x00A1B3C cellBarred: notBarred intraFreqReselection: allowed cellSelectionInfo: q-RxLevMin: -124 dBm freqBandIndicator: 40 schedulingInfoList: SchedulingInfo: si-Periodicity: rf16 sib-MappingInfo: sib2 SchedulingInfo: si-Periodicity: rf32 sib-MappingInfo: sib3, sib4 si-WindowLength: ms20 systemInfoValueTag: 4看到这个结构,我心里一般先做四件事:第一,确认PLMN和手里的测试卡一致;第二,把TAC和CellID记下来,等下和模块日志或网管配置对照;第三,看q-RxLevMin是否符合现场预期;第四,确认调度表里SIB2周期,如果周期太长,终端入网时间会被拉得很慢。这个“四查”习惯帮我减少了很多无效排查。
3. SIB2-SIB5:无线资源配置与移动性参数
3.1 SIB2里的随机接入与公共信道配置
SIB2是整个SIB家族里信息量最大、也最容易被忽略的一个。它里面装的是radioResourceConfigCommon,即公共无线资源配置。没有SIB2,UE即使完成了小区选择和驻留,也发不起随机接入,更不可能完成RRC连接建立。
SIB2里我重点关心的字段有以下几组:
- rach-ConfigCommon:随机接入公共参数。包括前导个数numberOfRA-Preambles、前导初始接收目标功率preambleInitialReceivedTargetPower、功率爬升步长powerRampingStep、前导最大发送次数preambleTransMax、竞争解决定时器mac-ContentionResolutionTimer,以及最大HARQ重传次数maxHARQ-Msg3Tx。这些参数直接决定UE在PRACH上怎么发消息1。如果初始功率配太大,会带来干扰;配太小,UE要反复爬升功率,接入时延被拉长。
- prach-Config:PRACH配置,包括prach-ConfigIndex(决定前导格式和子帧配置)、rootSequenceIndex(根序列)、zeroCorrelationZoneConfig(循环移位配置)、prach-FreqOffset(频域位置)。现场做RACH优化时,参数基本都在这块里。
- pdsch-ConfigCommon / pusch-ConfigCommon / pucch-ConfigCommon:公共下行和上行信道功率及资源映射。其中pdsch参考信号功率referenceSignalPower直接和RSRP测量挂钩,配错会影响覆盖判断。
- uplinkPowerControlCommon:开环功率控制参数,p0-NominalPUSCH和alpha是上行功控公式里的两个关键系数。
- timeAlignmentTimerCommon:公共时间对齐定时器。这个值太短,UE频繁丢上行同步,随后要重新发起随机接入,业务体验会明显变差。
现场看SIB2有个技巧:抓完空口log后,把SIB2里的preambleInitialReceivedTargetPower、powerRampingStep和preambleTransMax三个值抄出来,结合终端发起的PRACH次数,立刻能判断接入问题是“网络侧参数不合适”还是“真实弱覆盖”。有一次客户反映某小区经常“接入失败”,我一看SIB2,preambleTransMax配的是4,PRACH重发次数上限很小,弱场里爬不了几级就放弃了。把参数放宽后,接入成功率很快就回来了。
3.2 SIB3-SIB5的重选参数与邻区列表
IDLE态终端的小区重选,主要由SIB3、SIB4、SIB5控制。
- SIB3:小区重选公共参数。包含同频重选滞后量q-Hyst、同频异频统一的EUTRA重选时间t-ReselectionEUTRA、小区重选优先级cellReselectionPriority,还有高速场景下的频度状态缩放参数。q-Hyst相当于给服务小区加了一个“保护带”,避免信号临界时来回乒乓重选。
- SIB4:同频邻区信息。包含intraFreqNeighCellList,里面是物理小区标识PCI和对应的q-OffsetCell偏置。终端做同频测量时,会结合SIB4给的邻区PCI列表和偏置,决定是否触发对某个邻区的重选。PCI规划乱掉时,SIB4里的列表很容易和实际邻区对不上。
- SIB5:异频邻区信息,块头最大。里面是interFreqCarrierFreqList,每个频点条目都包含下行载频dl-CarrierFreq、q-RxLevMin、重选优先级cellReselectionPriority、高门限threshX-High、低门限threshX-Low、允许测量带宽allowedMeasBandwidth等。多频点组网时,SIB5的配置决定了终端在空闲态会不会去异频小区,优先级和门限缺一不可。
看到这一堆参数不要慌,理解IDLE重选的核心逻辑就够了:服务小区质量满足一定条件时,先做同频测量;异频/异系统测量则取决于当前是否有更高优先级的频点。所有判断最终都落到S准则和R准则计算上。
3.3 频率优先级和重选阈值怎么算
很多网优出身的朋友对重选公式很熟,但协议分析里看抓包时,更需要的是把公式和SIB里的实际字段对应起来。以高优先级频点为例,UE开机后会对最高优先级的异频频点做测量,只要目标频点的RSRP大于门限threshX-High,就立刻重选过去,不要求服务小区变差。
低优先级频点重选则有三个前提:目标频点优先级低于当前服务频点、服务小区的Srxlev小于等于S_intraSearch开始测量、目标频点RSRP大于threshX-Low。这里的S_intraSearch就是SIB3里放的参数,而Srxlev计算用到SIB1里的q-RxLevMin。
举个例子,SIB1里q-RxLevMin配的是-124dBm,终端实测服务小区RSRP是-110dBm,那么Srxlev约等于14dB。如果SIB3里S_intraSearch配的是10dB,那么Srxlev为14时还没触发异频测量,终端会一直待在服务小区。等RSRP掉到-117dBm,Srxlev变成7dB,低于10dB,才开始做低优先级异频测量。这个小例子可以帮助你理解为什么“有邻区但终端不重选”——先别怀疑邻区漏配,算算Srxlev阈值和S_intraSearch的关系。
4. 其他重要SIB:SIB6-SIB17的用途速查
4.1 异系统邻区与家庭基站
除了EUTRA本身的配置,LTE还要支持和其他制式系统互操作,于是有了异系统邻区SIB:
- SIB6:UTRA邻区列表。包含频率、小区选择优先级、异系统重选门限等参数,给2G/3G回落使用。
- SIB7:GERAN邻区列表。包含GERAN载频组、网络颜色代码NCC和基站颜色代码BCC,主要服务于GPRS/EDGE网络互操作。
- SIB8:CDMA2000邻区列表。国内用得少,但海外网络经常有,CDMA重选参数全在这个块里。
- SIB9:家庭基站标识和网络名称。实现CSG小区时,SIB9里会广播Home eNB ID和h-NetName。
- SIB14:扩展接入禁止参数。用于网络过载时限制普通终端发起MO呼叫或MO数据,在网络拥堵治理里很常见。
这些SIB在wireshark里如果解码出来,字段往往很少,但用失误更大。曾经有个项目频繁反馈“LTE起呼后被拒”,我抓包后看到SIB14里ab-Category表把所有MO都设为barred,毫秒级就把问题定位了。
4.2 告警广播与MBMS
- SIB10:ETWS主通知,内容很短,通常是一场地震或海啸的紧急告警。
- SIB11:ETWS辅通知,携带更完整的告警信息和可选的触发消息。
- SIB12:CMAS商业移动告警服务,也就是更多商用紧急消息的载体。
- SIB13:MBMS控制信道配置,包括MBSFN区域和MCCH相关信息。
- SIB15:MBMS业务区域标识列表,告诉UE当前小区属于哪些MBMS业务区。
- SIB16:GPS时间和UTC参数,部分终端同步和定位增强功能会用到。
这些SIB平时抓包很难遇到,因为大部分网络默认不开ETWS/CMAS/MBMS。一旦需要在测试中验证告警下发,就要特别关注网络侧是否在SIB1的schedulingInfoList里临时加挂了SIB10/11/12,同时还要看系统信息更新标记systemInfoValueTag是否变化。UE通过paging消息里的systemInfoModification标识感知到SI变更,然后重新读取SIB,这个联动过程是我遇到过最容易出bug的环节。
4.3 关于SIB的变化和扩展
SIB家族在LTE演进中还在增加:比如为了支持增强覆盖,出现了新的SIB配置;在NB-IoT体系里,系统信息又被重新设计,SIB2-NB、SIB3-NB等和LTE版本不完全一样。到了NR,MIB和SIB1的结构虽然延续了LTE的思路,但SIB2到SIB9的划分方式和字段定义都变了。建议做协议分析的人把LTE SIB基础打牢,不要只看576.331的表格,要理解“为什么这样分”和“谁依赖谁”,这样以后切到5G协议栈,迁移成本会低很多。
5. UE侧SIB获取流程与常见问题排查
5.1 从开机入网到读取SIB的完整时序
把SIB获取串成一个完整时序,真正理解LTE终端入网过程:
- 小区搜索:终端先解PSS/SSS,获得PCI和帧同步,然后解PBCH上的MIB,得到带宽、PHICH配置和SFN高位。
- 读取SIB1:按SIB1固定调度规则,在预期子帧上用SI-RNTI解PDSCH,拿到小区接入相关信息和SI调度表。
- 小区选择判决:用SIB1里的PLMN列表、cellBarred、cellSelectionInfo做初步判断,允许驻留才继续读其他SIB。
- 读取SIB2:拿到随机接入和公共信道配置,此时已经具备发起RRC连接建立的能力。
- 按需读取SIB3-SIB8:根据终端状态和网络部署,读取移动性相关SIB。
- 定期更新:UE按调度表周期监听SI消息,同时监听paging里的systemInfoModification来感知系统信息变更,触发重新获取。
在RRC_CONNECTED状态下,UE不主动周期性读取SIB,除非网络侧通过专用信令指示,或者UE收到与系统信息变更相关的paging。这也是为什么有些测试人员改完SIB参数后,长时间看不到终端行为变化,因为那个终端恰好处于连接态,根本没去重读广播信息。挂掉重连或者让它重新选小区,往往就能看到新参数生效。
5.2 常见问题:SIB缺失、调度窗口重叠、参数不一致
我在SIB排查中遇到最多的问题可以总结成三类:
第一类是SIB缺失。不是信号覆盖问题,而是SIB1的schedulingInfoList里压根没把某个SIB映射出来。常见原因:网管配置不一致、版本升级后SIB映射丢失、多小区广播数据配置错误。遇到终端驻留正常但无法发起位置更新或者随机接入失败,先检查SIB2有没有正常广播。
第二类是调度窗口重叠/周期过长。SI窗口长度配得很大,比如40ms,同时SIB周期又很短,例如rf8,那多个SI消息的监听窗口可能会在时间上重叠,终端在同一个SI-RNTI调度周期内收到多个MI消息,处理不及时就会“漏读”其中的SIB。另一类问题正好相反,有些SIB周期太长(比如rf512),导致终端入网后很长时间拿不到移动性邻区,重选和切换表现都会异常。
第三类是参数不一致,包括SIB1里的TAC/CellID与核心网配置不一致、PLMN列表漏配、q-RxLevMin过高、CSG小区未允许接入,以及SIB3/SIB5里的重选优先级彼此矛盾。这类问题需要把空口解码结果和网管配置两本账一起对,单看哪一边都发现不了问题。
5.3 排查工具与思路:wireshark、模组日志、现场参数核查
排查SIB问题,我常规武器是三件套:
- wireshark + 空口抓包:在wireshark里过滤
lte_rrc.bcch_dl_sch_message.system_information,能直接看到SIB。打开树形解析后,重点盯SIB1的调度表和SIB2的随机接入参数。如果用的是商用终端抓log,通常要配合QC、MTK或展锐的抓包工具先导出RRC消息,再用wireshark解。 - 4G模块AT命令:开发时最常用的是AT+CEREG?查询注册状态和TAC/CellID。注意CEREG的返回值里第二位就是注册状态,后续字段是TAC和E-CI,很多模块返回的是十六进制,和从SIB1里解出来的trackingAreaCode、cellIdentity做对照,能快速确认广播数据对不对。比如AT+CEREG?返回
+CEREG: 0,1,"2A31","00A1B3C",看到这个TAC就知道终端确实收到了某个TAC的SIB1广播。 - 网管/LMT配置导出:如果条件允许,拿到小区的SIB配置原始文件,和空口解码一条条比对。重点比PLMN、TAC、CellID、q-RxLevMin、schedulingInfoList、si-WindowLength。
排查思路按“从下往上、先物理后协议”来:先确认RSRP/SNR正常,再确认MIB解出无误,再确认SIB1固定调度位置是否有系统消息,然后逐层展开其他SIB。不要一上来就翻SIB5里的邻区频点,那样容易被无关信息带偏。
提示:在做4G模块开发时,若终端显示“有信号但无服务”,先用AT+CEREG?和AT+COPS?确认注册状态,再抓SIB1解码。很多情况下,PLMN列表里没有对应运营商的MCC/MNC,终端当然不会注册。这不是射频问题,是广播配置问题。
6. 实操中的一些经验与习惯
6.1 协议分析时怎样快速定位SIB
wireshark里的RRC解码很友好,但前提是你得知道过滤器写什么。一般我会用lte_rrc或rrc作为过滤基础,然后对着“SystemInformation”消息逐块看。实际操作中,我更推荐别只看解析结果,还要看原始位串。因为解析树会把单位、偏移量隐藏起来,比如q-RxLevMin在wireshark里可能显示成-124,但ASN.1编码里是一个带符号整数,理解编码能帮你判断是“网络配错”还是“工具显示Bug”。
另外,抓包时尽量抓MIB和SIB1在同一个时间段。SIB1里的systemInfoValueTag很关键,如果发现相邻两次抓包中它变了,说明网络侧确实改了系统信息,这时需要把前后两个SIB的差异拉出来对比。我用这个方法抓到过不止一次“漏配导致SIB2不再广播”的现行案。
6.2 我的几个“教训”和习惯
第一个教训是:不要只信解析器,要信协议文本。有一回我根据wireshark显示的q-RxLevMin=-124,直接当成dBm写进报告,后来查TS36.331才知道不同字段单位可能不同,有的还要乘2。从那以后,关键字段我都会回原文确认。
第二个教训是:TAC和CellID的显示进制要统一。wireshark里trackingAreaCode默认显示十六进制,但很多厂家的LMT、网管界面显示十进制,4G模块AT返回又有可能加不同前缀。对比时先换算成同一个进制,否则很容易把0x2A31当成27313,和网管的10745对不上,白折腾几小时。
第三个习惯是:改完系统信息后,先在UE侧抓一次SIB再来验证功能。因为SIB的变更不一定是即时的,即使网管上显示“配置成功”,UE可能还是拿着旧SIB。这时候看systemInfoValueTag有没有递增、paging里有没有systemInfoModification指示,比直接跑业务更快判断参数是否真的广播出去了。
做协议分析这个行当,SIB可以说是最基础也最绕的一块。但只要把SIB1的调度逻辑、SIB2的接入参数、SIB3-SIB5的移动性参数这三层串成一条线,再加上一套固定的排查思路,市面上大部分“无服务”“无法接入”“重选异常”的问题都能在半小时内定位。最后再分享一个小技巧:每次开新项目,先把目标小区的SIB1完整导出一份存档,后面无论做什么对比,都拿这个“基准SIB”当参照,能省下大量重复抓包时间。