简介:面向LTE/4G网络学习与日常优化的一份信令流程梳理材料,重点解决协议层级多、信令流程分散带来的理解门槛。文档先建立协议层与概念基础,依次拆解NAS、RRC、PDCP、RLC、MAC、PHY等协议职责,并说明控制面/用户面、空闲态/连接态、网络标识及承载概念;随后按照实际网络行为主线,详细展开开机附着、随机接入、Service Request、寻呼、切换与CSFB等核心流程,每类流程均交代触发条件、主要信令消息与状态变化,便于对照现网消息抓取和参数理解,形成从原理到流程的完整认知。压缩包内为单个docx文档,大小1.83MB,目录按章节渐进、条理清晰,既可以作为通信专业学生对LTE信令体系的入门导图,也适合网络优化人员在日常排障时按图索骥、快速定位流程节点。目前已有1935人浏览/学习。
1. 4G信令全流程:一条投诉电话背后的信令链路,远比满格信号重要
我有一次处理用户投诉「手机显示满格信号,但打开网页就是转圈」,现场蹲了一天,RF报告没有任何弱覆盖迹象。最后调出核心网跟踪,发现Attach流程根本没走到默认承载激活,MME回的是Attach Reject,cause #15。满格只是下行接收好,信令链路没完成,业务自然起不来。这就是4G信令全流程的价值:从UE开机、小区选择、附着、TAU到业务请求与切换,一套信令交互能把用户感知问题精确锁到一个网元或一条配置上。这篇笔记适合网优、核心网测试和刚转信令分析的人,目标不是背协议栈,而是拿着跟踪就能看懂信令在说什么、卡在哪。
2. 先把信令面拆开:协议栈分层、网元接口与消息清单长什么样
2.1 控制面不是一根线:Uu口、S1-MME口与S11口各传递什么
4G信令并不只在网元间单向传递。一次附着,同时穿过多条接口,每条接口上跑的协议不同、职责也不同。UE和eNodeB之间跑的Uu口信令是RRC(Radio Resource Control),它负责建立、重配置和释放空口资源;UE和MME之间的NAS(Non-Access Stratum)消息,则承载在RRC之上,由eNodeB透明转发,不做解析。eNodeB和MME之间是S1-MME接口,跑S1AP协议,负责把NAS消息封装成Initial UE Message、Uplink/Downlink NAS Transport这类信令,并管理UE在基站侧的上下文。MME往核心网侧走,还有S11接口的GTP-C信令链路,用于EPS承载的创建、修改和删除。
这三层链路在Wireshark里同一条抓包里经常交叠出现。我在分析时有个习惯:先把抓包按接口分开理解。空口抓包往往包含RRC和NAS两层,但如果没有同时抓S1-MME,就只能看到eNodeB的出入口,看不到MME侧的响应逻辑;反过来,只抓核心网侧S1-MME或S11口,可以看清MME和SGW的行为,但空口重配是否下发又要靠路测日志补全。所以做全流程信令分析,最理想的是把Uu口和S1-MME口时间对齐一起看,否则很容易把「空口已经下发重配,核心网还没收到响应」这类问题误判成对端网元不响应。
2.2 NAS消息是业务意图,RRC、S1AP是搬运通道:双层结构怎么区分
很多新手看信令最大的障碍,是分不清NAS和RRC/S1AP。NAS消息表达的是UE和MME之间的业务意图,比如我要附着、我要做TAU、我要请求服务;RRC消息表达的则是UE和eNodeB之间空口资源的分配,比如我要建立连接、我配置了哪些无线承载。S1AP消息又是eNodeB和MME之间的交换行为对应物,比如初始UE上下文建立、UE上下文释放请求。同一个流程里,NAS消息会被封装在RRC和S1AP消息内部,形成一层套一层的结构。
举个例子,UE发起附着时,先看到RRC Connection Request、RRC Connection Setup,随后UE发的RRC Connection Setup Complete里就携带了Attach Request这条NAS消息;这条NAS消息到了eNodeB,再被封装进S1AP的Initial UE Message里送给MME。如果分析时只在过滤器里输入nas_eps,是看不到RRC层在发声的;但如果只盯RRC,又看不出用户到底是附着还是TAU。我一般会在Wireshark里同时保留rrc || s1ap || nas_eps,用Time列做时间轴,按消息先后关系还原整个流程,比单看某一层容易定位得多。
2.3 一张表看清常用信令消息的触发场景与关键参数
| 消息层 | 消息名称 | 触发场景 | 关键字段 |
|---|---|---|---|
| NAS(EMM) | Attach Request | UE开机、从无服务到有服务 | IMSI或old GUTI、attach类型、T3410相关定时器 |
| NAS(EMM) | Attach Accept | MME接受附着 | T3412周期TAU定时器、T3402、EPS附着结果 |
| NAS(EMM) | TAU Request | 跨TA边界、周期TAU | old GUTI、last visited TAI |
| NAS(ESM) | PDN Connectivity Request | 附着时建立默认承载 | APN、PDN type、用户面协议参数 |
| NAS(ESM) | Activate Default EPS Bearer Context Request | MME准备激活默认承载 | 分配的IP地址、QCI、APN-AMBR |
| RRC | RRC Connection Setup Complete | 空口连接建立完成 | 携带初始NAS消息 |
| RRC | RRC Connection Reconfiguration | eNodeB下发专用配置 | DRB配置、测量配置、NAS透传 |
| S1AP | Initial UE Message | eNodeB上送NAS消息给MME | eNB UE S1AP ID、NAS消息载荷 |
| S1AP | UE Context Release Command | MME释放UE上下文 | S1AP Cause、释放原因 |
表格里最容易被忽略的是ESM消息。很多人只要看到Attach Accept就认为成功,但真正决定「能不能上网」的是后面那条Activate Default EPS Bearer Context Request。它带了分配的IP地址和QCI,QCI决定用户面数据走哪条承载、优先级和丢包预算。如果Attach Accept正常但这条ESM消息没出来,大概率是PDN Connectivity Request里APN解析出问题,或PGW侧会话建立失败。
3. 从开机到可用的完整流程拆解:附着、TAU、业务请求与切换
3.1 Attach流程逐条递进:从RRC Connection Setup到默认承载激活
Attach是4G信令里最完整、也最能锻炼读包能力的流程。从UE开机到能上网,通常经过十几步信令交互。我用一张简化的消息序列来描述:
| 序号 | 传输方向 | 消息 | 作用与关键信息 |
|---|---|---|---|
| 1 | UE → eNodeB | RRC Connection Request | 发起空口连接,携带初始UE标识 |
| 2 | eNodeB → UE | RRC Connection Setup | 分配SRB1资源,配置信令承载 |
| 3 | UE → eNodeB | RRC Connection Setup Complete | 携带NAS Attach Request,含IMSI或old GUTI |
| 4 | eNodeB → MME | S1AP Initial UE Message | 透传Attach Request到MME |
| 5 | MME → HSS | Diameter AIR/UIA | 鉴权矢量请求与用户订阅数据获取 |
| 6 | MME → UE | NAS Authentication Request | 下发随机数和鉴权令牌 |
| 7 | UE → MME | NAS Authentication Response | 回传鉴权应答,验证网络合法性 |
| 8 | MME → UE | NAS Security Mode Command | 启动完整性保护和加密算法协商 |
| 9 | UE → MME | NAS Security Mode Complete | 确认安全上下文激活 |
| 10 | UE → MME | NAS PDN Connectivity Request | ESM层请求建立默认PDN连接,携带APN |
| 11 | MME → SGW/PGW | GTP-C Create Session Request/Response | 核心网侧建立默认承载 |
| 12 | MME → UE | NAS Attach Accept | 携带GUTI、T3412、T3402、EPS附着结果 |
| 13 | UE → MME | NAS Attach Complete | 确认附着完成,T3410停止 |
| 14 | MME → eNodeB | S1AP Initial Context Setup Request | 请求eNodeB建立UE上下文与DRB |
| 15 | eNodeB → UE | RRC Connection Reconfiguration | 下发DRB配置与测量配置 |
| 16 | UE → eNodeB | RRC Connection Reconfiguration Complete | 空口承载建立完成 |
| 17 | eNodeB → MME | S1AP Initial Context Setup Response | 通知MME上下文建立成功 |
第12步Attach Accept里面的T3412就是周期TAU定时器,默认值常见的是30分钟到60分钟,运营商可按需求调整;T3402则是附着或TAU被拒绝之后,UE需要等待多久才能再发起流程。很多「手机莫名其妙从4G掉到无法注册」的投诉,追根究底就是T3402太长或太短。第14步到第17步容易和Attach流程混淆,注意上下文建立完成之后,用户面数据才开始真正能跑。若遇到第4步Initial UE Message之后MME不回鉴权请求,多半要查HSS侧是否能查到USIM信息;若在第10步之后卡住,则优先看APN设置和PGW可达性。
3.2 TAU流程里的「为什么换小区会卡」:TAC边界与定时器
TAU,全称是Tracking Area Update,UE发现当前所在的跟踪区不在注册的TA List里,就会发起请求。触发场景有三类:跨TA边界、周期TAU(由T3412控制)、以及从旧小区回到可注册区域。TAU流程在信令里最常见的问题是「UE发TAU Request,但MME回了TAU Reject,cause #12或#13」。#12表示该跟踪区不被允许,#13表示该跟踪区不允许漫游。处理思路完全不同:#12是TA规划问题,通常需要核对运营商TA List配置和MME Pool边界;#13则涉及漫游白名单和运营商间协议。
周期TAU也是一类高发问题。如果T3412设置过短,UE频繁发起TAU,会显著增加MME信令负荷,小区掉线率和呼叫建立时延都会被拉高;如果T3412设置过长,MME和SGW容易认为UE不可达,导致下行寻呼失败。通常做法是在MME上按「寻呼响应率」反向调参,寻呼成功率低于阈值时适当缩短T3412,否则调长。我在分析抓包时,会特别对比TAU Request里的last visited TAI和当前小区广播的TAC——两者一致但MME还回TAU Accept,并重新分配GUTI,说明是老GUTI关联不上旧MME,变成了「类似初始附着的TAU」;这是MME Pool过大导致上下文丢失的典型信号。
3.3 Service Request和S1释放:小流量状态下的信令节省机制
UE完成附着后并不会一直占用空口资源。当UE处于RRC Connected态且无数据时,eNodeB会通过S1AP UE Context Release来释放空口连接,但保留核心网PDN连接,这叫RRC Idle态。之后一旦UE有上行数据或收到寻呼,就通过Service Request流程恢复连接。Service Request和Attach最大的区别是:它不重建PDN连接,只是空口和用户面承载恢复,所以信令步骤明显更少。
| 序号 | 方向 | 消息 | 作用 |
|---|---|---|---|
| 1 | UE → eNodeB | RRC Connection Request/Setup | 空口恢复SRB |
| 2 | UE → MME | NAS Service Request | 携带P-TMSI或GUTI、请求的业务类型 |
| 3 | MME → eNodeB | S1AP Initial Context Setup Request | 请求恢复建立UE上下文与DRB |
| 4 | eNodeB → UE | RRC Connection Reconfiguration | 恢复DRB配置 |
| 5 | eNodeB → MME | S1AP Initial Context Setup Response | 用户面恢复成功 |
Service Request最容易遇到的坑是UE在空口侧连发多次请求,但核心网没有响应。原因通常有两个:一是MME侧的UE上下文已被释放(比如T3412周期TAU超时,核心网认为UE失联),需要先做TAU再发起Service Request;二是eNodeB配置的上行非连续接收参数和MME的寻呼参数不匹配,导致下行寻呼消息发给了错误的小区。信令分析里有一种典型场景:手机上显示4G但有下行流量时页面转圈,打开S1-MME跟踪发现MME发出Paging后,空口侧完全没有RRC连接建立请求,这时基本可以断定是寻呼消息没有正确下发到UE驻留小区。
3.4 切换流程的分类:X2切换和S1切换的判断路口
切换按接口分为X2切换和S1切换。X2切换是源eNodeB和目标eNodeB之间通过X2接口直接协商,MME只负责事后做Path Switch;S1切换则由MME全程参与,适用于跨MME或X2不可用的场景。从信令上判断切换类型很直观:X2切换里,源eNodeB直接发Handover Request给目标eNodeB,随后UE收到RRC Connection Reconfiguration,里面带新的C-RNTI和无线资源配置,目标eNodeB直接发送SN Status Transfer给核心网,最后通过Path Switch Request通知MME更新承载路径。
S1切换则在源eNodeB处多了一条S1AP Handover Required,MME收到后向目标eNodeB发Handover Request,完成资源准备后再下发Handover Command。两者对应的排查思路不同:X2切换失败优先查X2接口链路、目标小区的负荷准入策略和邻区关系;S1切换失败则要查MME到目标eNodeB的SCTP链路、目标eNodeB覆盖异常或MME配置的切换白名单。分析切换信令时,还有一个容易被忽略的点:RRC Connection Reconfiguration里携带的measConfig,如果切换目标小区频点不在测量配置里,UE根本不会上报测量报告,再完美的邻区关系也白搭。
4. 抓包与解码:怎么让一张信令跟踪数据「开口说话」
4.1 常见采集方式:网管侧跟踪、路测软件与核心网信令监测屏的取数差异
市面上能拿到信令数据的途径不少,但出问题也各有各的难处。网管侧跟踪(比如基站OMC的UE信令跟踪)可以拿到Uu口RRC和部分NAS,适合做单用户问题回溯;路测软件一般是路测小哥手里那套工具和测试终端配合,可以拿到空口AS和NAS解码,但需要厂家授权解密,而且如果用的不是内置基带上报,某些加密NAS消息会显示成密文;核心网信令监测屏(或抓包工具挂S1-MME)能拿到S1AP和NAS明文,但看不到空口Radio Resource配置细节。
我在实际项目中常做的做法是「双端对齐」:Uu口侧用路测软件的log,S1-MME侧用核心网跟踪或分流探针抓包。两边分别导出原始日志,再用同一时刻的GUTI或IMEI做关联。否则只取一端,经常会遇到「RRC层显示成功、S1MME没有对应消息」或反之,非常容易出现误判。如果你是在实验室搭环境,直接用模拟基站加一台普通抓包电脑就能拿到较理想的双端数据,完全不需要上商用网。
4.2 用tshark和Python在离线抓包里统计信令时序
拿到pcap后,第一步是把信令按时间顺序过滤出来。我习惯用Wireshark自带的tshark做批处理,把NAS、S1AP和RRC消息导成CSV,再交给Python做聚合统计。下面这个命令适合在拿到离线抓包后快速评估整段信令的时间分布:
tshark -r attach.pcapng -Y "rrc || s1ap || nas_eps" -T fields \ -e frame.time_relative \ -e frame.protocols \ -e rrc.messageName \ -e s1ap.ProcedureCode \ -e nas_eps.nas_msg_emm_type \ -E header=y -E separator=, > attach_msgs.csv这里-Y做了三层协议过滤器,-T fields指定输出自定义字段,frame.time_relative是相对时间戳,便于后续计算消息间隔。rrc.messageName在空口抓包里能看到RRC层具体的消息名,s1ap.ProcedureCode会显示S1AP的流程码,nas_eps.nas_msg_emm_type则是NAS EMM消息类型。如果你的抓包工具在S1-MME口抓的,RRC层就没有数据,此时rrc.messageName为空,属正常现象。
后续用Python做流程统计,可以直接把这个CSV读进来,按消息类型做时序还原:
import csv from collections import Counter with open("attach_msgs.csv", "r", encoding="utf-8") as f: reader = list(csv.DictReader(f)) # 按时间排序,保证流程顺序正确 reader.sort(key=lambda r: float(r["frame.time_relative"])) # 统计NAS EMM消息类型 emm_counter = Counter(r["nas_eps.nas_msg_emm_type"] for r in reader if r["nas_eps.nas_msg_emm_type"]) for msg_type, cnt in emm_counter.most_common(): print(msg_type, cnt)这段脚本只做了一件事:把NAS消息类型按出现次数归并输出。真正有价值的用法是把EMM类型和S1AP ProcedureCode结合起来看。比如Attach Request之后,如果S1AP里同时出现Initial Context Setup Request,说明MME已经完成了默认承载建立并开始请求空口资源;反之如果只有Initial UE Message没有后续,则说明认证或订阅数据环节出了问题。此时再在CSV里搜Authentication Request和Security Mode Command,就能快速定位卡在哪一环节。
4.3 从IMEI、GUTI、TAC还原一次完整流程的标注技巧
同一段抓包里可能混杂多台UE的信令,直接按消息名过滤会非常混乱。我的做法是先在抓包时按IMEI或IMSI建立纵向线索,再辅助GUTI做横向关联,最后再按时间轴把该用户的RRC Setup、Attach、TAU、Service Request、Handover逐条串起来。大多数商用终端在Attach Request里会携带IMEI或IMEISV,GUTI则在附着成功后的Attach Accept里重新分配。所以如果只有整段抓包没有终端日志,通常做法是先找到Attach Accept,拿到新GUTI后再用GUTI字段反向过滤这个用户的后续信令。
抓包软件里保存一份表格会使整个过程清晰很多:| 关联维度 | 典型字段 | 用途 | |---|---|---| | 硬件标识 | IMEI/IMEISV | 终端级唯一标识 | | 用户标识 | IMSI | 对应SIM卡身份 | | 临时标识 | old GUTI / new GUTI | 跨节点关联用户上下文 | | 位置标识 | TAI/TAC | 判断是否跨TA或跨MME Pool | | 承载标识 | EPS Bearer ID | 关联默认承载与专用承载 |
另一个实用技巧是同时查看UE发起的源IP。Attach成功后,SGW分配的IP会出现在Activate Default EPS Bearer Context Request消息里,这个IP在后端日志里往往能直接对应到用户面流量。如果抓包里同时有SGi接口镜像,用这个IP做关联,用户面和信令面就全部打通了,定位问题时能直接看到「信令完成但用户面没流量」还是「信令就没成功」。
5. 避坑与排查:信令分析里最常见的5个翻车现场
5.1 现象:Attach Request反复重发,MME始终不响应
UE在空口侧发出Attach Request后,迟迟没有收到任何NAS层回应,随后会因T3410超时重发。T3410定时器控制UE等待Attach Accept/Reject的时间,默认15秒可配置。
原因:最常见的是MME到HSS的Diameter链路不通,或HSS返回签约数据错误。MME在收到Initial UE Message后,会先向HSS发送鉴权信息请求,如果这个环节失败,MME既不会回复UE也不会拒绝,唯一的结果就是等待。
解决:先看S6a接口抓包,确认AIR/AIA消息是否返回,正常返回内容是鉴权五元组;再在MME侧看用户签约数据是否为空或APN配置缺失。经验是:把S6a信令和空口RRC时间戳对齐,只要看到AIR没有对应AIA,问题就锁定在HSS或传输链路,省得反复抓空口。
5.2 现象:TAU Request里的GUTI对不上,被MME当成非法UE
一次跨MME Pool的TAU过程中,UE在TAU Request里携带了旧GUTI,但MME向旧MME请求上下文时拿到失败,随后MME直接回TAU Reject,cause #9(UE identity cannot be derived by network)。
原因:通常是旧MME侧保留的UE上下文已经被清除,或MME Pool内的GUMMEI解析配置错误。
解决:对比GUTI里的GUMMEI和当前MME所服务的映象组,确认旧MME和新MME是否属于同一个MME Pool;然后检查MME间的S10接口链路,如果S10不可达,跨MME的TAU必然失败。这类问题不是无线问题,别让网优同事白跑一趟。
5.3 现象:Wireshark里NAS消息全是密文,看不到bearer建立细节
在路测软件或终端侧日志里经常看到,安全模式激活之后NAS消息就变成一串不可读的字节。
原因:Security Mode Command激活完整性保护后,NAS消息本体在空口加密传输,如果没有加载K_eNB和密钥,普通抓包软件很难解码。
解决:如果只关心流程完整性,可以直接看核心网S1-MME侧抓包,因为NAS在S1-MME口上依然以明文或可解格式传输;如果必须看空口,就用终端厂家路测软件的解密功能,并确保在log配置里勾选安全参数输出。注意:即使不解密,EMM消息类型字段很多时候仍然可以识别,别因为内容不可读就判断信令异常,先确认是不是解码问题再下结论。
5.4 现象:S1AP显示Initial Context Setup Request已下发,空口却没有任何RRC重配
在分析S1-MME抓包时看到MME确实发出了Initial Context Setup Request,但路测日志里没有对应的RRC Connection Reconfiguration,随后S1AP收到的是Setup Failure。
原因:eNodeB空口侧或承载建立失败,比如目标小区发生了RLF、UE失步,或eNodeB的内部DRB配置出现冲突。还有一种常见情况:eNodeB配置的PRACH前导格式或随机接入参数不合理,导致空口RACH过程一直失败。
解决:把S1AP Failure消息中的Cause值摘出来,S1AP的Cause通常区分Radio Network、Transport和Protocol三类,Radio Network类原因对应的就是空口或UE失步问题;再在eNodeB侧告警里查是否有RRU异常、小区高负荷导致的准入拒绝。信令分析可以定位区间,但无法代替基站侧最终告警判断。
5.5 现象:Attach成功了,但用户面流量仍然不通
信令完整走到RRC Connection Reconfiguration Complete,核心网创建会话成功,但网页打开还是失败。
原因:有可能是建立默认承载的QCI或APN-AMBR参数过小,导致吞吐被限;也可能是S1-U接口的GTP-U隧道建好,但eNodeB到SGW的路由不通。
解决:先看Activate Default EPS Bearer Context Request中的QCI、APN-AMBR和BR值,再检查S1-U口抓包看GTP Echo是否正常、是否有ICMP不可达回包。最直接的办法是同一时刻抓S1-MME和S1-U两侧数据,S1-U只要看到GTP-U下行数据开始传,就说明MME信令链路没毛病,问题在无线侧或承载配置速率上。
6. 进阶:用「指标-消息-流程」三段式,快速从整段信令集收敛到具体病根
先看指标:把整段跟踪里的EMM Cause、S1AP Cause、RRC建立成功率、切换成功率做成分布,不看具体某条消息,先从宏观判断是哪一类失败特征。EMM Cause里出现#15、#12、#13相对高频,会引导我直接去查跟踪区规划、TA List配置和漫游签约;S1AP Cause集中在Radio Network时,优先查基站侧资源与RF问题。
再看消息:选一条关键消息看关键参数,而不是把十几条消息全部展开读。比如选Attach Accept,重点看T3412、T3402、EPS Attach Result这3个字段;选Security Mode Command,则直接看选定的算法和密钥长度;选RRC Connection Reconfiguration,关注measConfig里是否包含当前服务小区的同频邻区频点。很多黑匣子问题,靠的是关键参数比对而不是消息数量。
最后走流程:把这条用户的信令按时间轴完整串起来,确认每一步是否「该出现时出现、该结束时结束」。如果遇到中间缺少某条响应,那就是问题区间;如果出现重复发送某条请求,优先怀疑定时器超时或对端处理延迟。这套方法我用过很多年,最深的体会是:信令分析不要一上来就扎进单条消息里反复看,同一段抓包里先做指标分布,再挑典型消息,最后补完流程,比靠直觉直接看图高效得多。还有一个养成很久的习惯:每次分析完,都会把最终定位的原因记录在表格里,避免下一次在同类cause上跳进同一个坑。希望这套步骤对和你一样的信令分析和优化工程师也有帮助。
本文还有配套的精品资源,点击获取