简介:一份围绕5G信令流程解析的入门资料,适合移动通信初学者、网络运维人员及相关专业学生,用以理解5G网络中关键信令过程并掌握系统学习方法。压缩包仅含1个docx文档,大小11KB,内容结构清晰、篇幅精炼,便于通读与速览;目前已有402人学习。文档从5G背景知识切入,说明高速率、低时延、大连接特性如何使信令流程更复杂,进而介绍用户终端(UE)、基站(gNB)、核心网(Core Network)等基本概念,并把信令分为控制信令与用户数据信令两类。之后围绕接入过程、鉴权与安全、移动性管理、资源分配与调度、服务质量保障等环节展开,逐项解析各自作用;学习技巧部分给出系统学习、深入理解、实践操作、案例分析、持续跟进五条路径,强调通过仿真与真实案例提升实操能力。读者可借此快速搭建5G信令流程的知识框架,理清各环节逻辑关系,为后续工程实践或技术研究提供参考。
1. 5G信令流程解析:为什么流程图背熟了,现网日志还是看不动
前阵子帮一个转5G核心网的朋友看日志,他在网管平台拉了一段注册失败的信令:UE一连发了三次带相同5G-GUTI的Registration Request,AMF那边就像没收到一样,最后UE自己放弃,屏幕上只剩一串看不懂的NAS cause。他流程图背得很熟,单看每条消息也认识,就是拼不出“谁在等谁、为什么重发、该查哪个网元”。这其实是大多数人学5G信令流程解析的真实状态:知道“是什么”,但离“能排障”还差一层。下面我按“先搭骨架、再拆注册、后上工具、最后避坑”的路径把这个方向讲透,适合网优转核心网、协议栈测试以及刚入行的通信新人。
2. 搭知识骨架:5G信令涉及的接口、协议栈与学习顺序
一个很常见的误区,是以为5G信令就是NGAP一条线。实际抓包时,UE与核心网之间的NAS对话、基站与核心网之间的NGAP对话、核心网内部服务化接口的HTTP/2消息,经常叠加在同一条时间轴上。脑子里没有一张分层地图,看再多信令流程图都是散的。
2.1 一张表读懂5G信令面:N1/N2/NG接口和协议栈分层
5G控制面可以按“接口”切成三块:空口Uu上的RRC、N2口上的NGAP、以及核心网内部的SBA服务化接口。NAS消息比较特殊,它不从属于某个物理接口,而是“搭车”走:在空口装在RRC消息里,在N2口装在NGAP的NAS-PDU字段里。先记住这一点,后面看Wireshark时不会迷路。
| 接口/场景 | 协议栈 | 主要承载内容 | 新手常犯的错 |
|---|---|---|---|
| Uu控制面 | RRC / PDCP / RLC / MAC / PHY | RRC连接管理、测量报告、NAS透传 | 把RRC当作NAS |
| N1(NAS) | 5GMM + 5GSM | 注册、鉴权、身份识别、PDU会话管理 | 忽略NAS消息是“搭车”的 |
| N2(NG-C) | NGAP / SCTP / IP | Initial UE Message、UE Context Setup等 | 只看NGAP不看里面的NAS-PDU |
| NG-U(用户面) | GTP-U / UDP / IP | 用户数据包 | 拿GTP-U报文分析信令 |
| Xn-C | XnAP / SCTP / IP | 切换准备、SN状态传输 | 混淆Xn切换和N2切换 |
| 核心网内部 | HTTP/2 + JSON | Nudr、Numf、Nsmf等服务化调用 | 以为SBI只有一种调用模型 |
从这表能看出一个关键结论:5G信令流程从来不是“一条消息走到底”,而是每到一个网元,信令就从一种协议换成另一种协议。比如UE发出注册请求,空口先走RRC,gNB收到后解掉RRC,把NAS-PDU原封不动塞进NGAP的Initial UE Message发给AMF;AMF又通过SBI向UDM查签约数据。同一个用户意图,在三层协议里分别表达。
2.2 信令流程的四个大家族:注册、会话、移动性、去注册
5G信令流程看着多,按触发场景能收敛成四个大家族。第一是注册流程,包含开机初始注册、移动注册更新、周期注册更新、紧急注册,它是身份的建立。第二是PDU会话流程,负责建、改、删数据通道。第三是移动性流程,分Xn切换和N2切换。第四是去注册,分为UE发起的和网络侧发起的。另外还有切片相关流程,但本质是挂在注册和PDU会话里的子流程。
| 流程族 | 典型触发 | 核心网参与网元 | 最常见的故障点 |
|---|---|---|---|
| 注册 | 开机、跨TA移动、周期定时器 | AMF、UDM、AUSF | 鉴权失败、切片不被允许 |
| PDU会话建立 | 应用请求、IMS注册 | AMF、SMF、UPF | UPF选择失败、DNN配置不匹配 |
| 切换 | 信号变差、负载均衡 | AMF、SMF、UPF、目标gNB | 路径切换失败、Xn口不通 |
| 去注册 | 关机、显示关闭5G | AMF、UDM、SMF | NAS消息未加完整性保护被拒 |
学习中我建议按“注册 + PDU会话建立”先入手。5G里这两个流程经常嵌套:注册请求里可能带着PDU会话建立请求,注册接受里也可能带着PDU会话建立接受。把这两个连起来跑通,就覆盖了日常排障里至少七成的信令场景。
2.3 先NAS后AS、先注册后会话:为什么这个顺序能少走弯路
学习顺序上,我一般会推荐“先NAS后AS”。NAS是UE和AMF之间的语义层,决定“你是什么身份、能不能接入、要什么样的网络切片”;而AS层像一条运输通道,gNB在这条通道里干活,但真正做决策的是NAS。直接啃NGAP容易陷在传输细节里,丢了业务语义。还有个顺序是“先注册后会话”,因为注册流程里能看到完整的鉴权、安全上下文、策略下发,而这些上下文正是PDU会话建立的前提。
注意:别一上来就啃TS 23.501或TS 24.501全文,先拿一张注册流程图配合抓包看,遇到不懂的消息再回去翻规范。规范是字典,不是入门书。
3. 把注册流程拆开看:从UE到AMF的消息封装、鉴权与状态落地
注册是5G信令里最值得精读的流程,因为它几乎把NAS、NGAP、SBI三种协议都串了一遍。下面按一条“开机初始注册”来拆,所有步骤都是现网信令跟踪平台里能直接拉到的消息名。
3.1 注册请求从哪里来:RRC连接建立与NGAP Initial UE Message
UE要发注册请求,第一步不是直接吐NAS消息,而是先在空口做RRC连接建立。UE发RRC Setup Request,gNB回RRC Setup,UE再回RRC Setup Complete。注意,这时“RRC Setup Complete”里已经带上了第一条NAS消息——Registration Request。gNB解出NAS-PDU后,向AMF发NGAP的Initial UE Message,把这条NAS-PDU作为其中的一个IE装进去。
这个阶段需要关注的关键IE,在现网页面上常看到这三个:
| IE名 | 方向 | 含义 | 排障时看什么 |
|---|---|---|---|
| RAN-UE-NGAP-ID | gNB → AMF | 基站侧UE编号 | 后续所有该UE消息都带它 |
| NAS-PDU | gNB → AMF | 透传的NAS消息 | 消息类型是否为Registration Request |
| TAI | gNB → AMF | 当前跟踪区 | 跟签约数据里的TAI List比对 |
| PLMN ID | gNB → AMF | 选择的公共陆地移动网 | 有没有选错运营商 |
初学者容易在这里翻车:把“Initial UE Message”理解成“核心网给UE的第一条消息”。其实它的意思是“gNB第一次为这个UE向AMF发消息”,方向是从基站到核心网,别搞反。
3.2 鉴权与安全上下文:AMF如何确认“你是谁、你该不该接入”
AMF收到Initial UE Message后,先看NAS消息里的5G-GUTI或SUCI。如果只有一个SUCI,就需要回Identity Request让UE上报永久身份。随后进入鉴权流程:AMF向AUSF/UDM取鉴权向量,AUSF返回RAND和AUTN;AMF把Authentication Request发给UE,UE侧用USIM里的密钥和OPc验证网络侧AUTN,合法后回Authentication Response,网络比对XRES和RES*一致,才算“你是谁”得到确认。
紧接着是NAS安全上下文建立:AMF发Security Mode Command,指定加密算法和完整性保护算法;UE回Security Mode Complete。从这之后,NAS消息就有了加密和完整性保护,抓包里再看到的NAS消息头还在,但内容已经是密文。这个现象在现网跟踪里非常常见——前面几条消息还能看到明文关键IE,SMC之后只剩消息类型,中间字段变成一串十六进制。
注意:鉴权失败大部分不是算法问题,而是USIM里的OPc或Ki和UDM签约数据不一致。实验室里改错一个OPc,表现就是UE反复在Authentication Request和Authentication Failure之间循环。看到这个循环,先查HLR/HSS侧密钥。
3.3 注册接受之后:5GMM状态、切片列表与PDU会话的关系
鉴权通过后,AMF向gNB发Initial Context Setup Request,把UE上下文、Allowed NSSAI、PDU会话列表一起给gNB。gNB建完UE上下文后回Initial Context Setup Response。最后AMF向UE发Registration Accept,里面带着新分配的5G-GUTI、TAI List、Allowed NSSAI和默认切片信息。如果AMF拒绝,回的是Registration Reject,根因要看5GMM cause,而不是NGAP cause——这是新手最容易查错层的地方。
从状态机角度看,注册流程结束时,UE和AMF侧都进入5GMM-REGISTERED。但这里有个大坑:REGISTERED不代表能上网。注册只是打通了控制面,用户面还差一个PDU会话建立流程。所以网优平台上看到UE状态是“已注册”,但业务不通,下一步不是查RRU,而是去查PDU会话建立流程有没有跑起来。
| 状态 | 含义 | 和PDU会话的关系 |
|---|---|---|
| 5GMM-DEREGISTERED | 未注册 | 不能发起会话 |
| 5GMM-REGISTERED-INITIATED | 注册中 | 网络侧暂不处理会话 |
| 5GMM-REGISTERED | 已注册 | 可发起会话建立 |
| 5GSM会话已激活 | 数据面就绪 | 依赖PDU会话建立成功 |
4. PDU会话建立实操:用开源5G核心网加Wireshark把信令跑出来
只靠看图和背消息名,很难建立“信令时序感”。我一般建议动手搭一套实验环境,把开源5G核心网和模拟基站、模拟UE跑起来,再用Wireshark抓NGAP和NAS消息,对照规范一步一步看。这个环境能完整复现注册、鉴权、PDU会话建立和去注册,是学习性价比最高的路径。
4.1 抓5G信令的三条路:实验室模拟、现网跟踪与接口镜像
常见做法有三种。第一种是实验室自建,用开源核心网加模拟基站,可控性强,能随意构造失败场景,也是下文要展示的。第二种是用现网网管平台的信令跟踪功能,能看真实业务但通常只有消息名和IE,拿不到原始码流,适合验证学习结论,不适合做细节分析。第三种是在N2口或N3口做流量镜像,能拿到完整pcap,但涉及现网数据合规,普通学习环境不建议碰。对学习这件事,我强烈建议从第一种开始,跑通后再对照第二种的现网日志找差异。
4.2 用Open5GS加UERANSIM跑通一次完整注册和PDU会话
常见做法是选Open5GS充当核心网,UERANSIM模拟gNB和UE,两者都支持Docker或裸机部署。先准备一台Ubuntu服务器,装好Docker和docker-compose,然后把核心网和模拟接入网拉下来。
# 拉取开源核心网项目并以docker方式启动 git clone https://github.com/open5gs/open5gs cd open5gs/docker cp docker-compose.yml.example docker-compose.yml docker compose up -d docker compose ps这个步骤做完,AMF、SMF、UPF、UDM、AUSF等网元容器会陆续起来。docker compose ps看到所有网元状态为Up后再继续,其中任何一个起不来,后面模拟基站一接入就会报NGAP建立失败。启动完成后先不要急着配UERANSIM,去改核心网的配置,把UE的IMSI、Ki和OPc对应上。
# UERANSIM的gNB配置片段:告诉模拟基站去找哪个AMF mcc: '001' mnc: '01' linkIp: 127.0.0.1 ngapIp: 127.0.0.1 gtpIp: 127.0.0.1 amf: - address: 127.0.0.1 port: 38412这段配置里mcc/mnc要和核心网一致,ngapIp填写本机IP。38412是AMF默认的NGAP监听端口,改了核心网端口就要同步改这里。接下来是UE配置,模拟UE要在gNB搜索列表里找到模拟基站。
# UERANSIM的UE配置片段:决定鉴权能否通过的密钥参数 supi: 'imsi-001010000000001' mcc: '001' mnc: '01' key: '0C0A34601D4F07677303652C25325321' opc: '63BF0A30FF67F5655F85B0C5F2B3DF3E' amf: '8000' gnbSearchList: - 127.0.0.1这里key和opc是USIM侧参数,必须和核心网里预设的一致,否则鉴权一定失败。amf是5G网络侧的AMF标识,改成别的值不影响注册,但会影响后续某些网元对UE上下文的识别。配置完成后,先启动模拟gNB,再启动模拟UE,正常情况下能看到UE打印出注册成功和PDU会话建立成功的日志。
4.3 Wireshark里看信令:NGAP、NAS-5GS和HTTP/2的过滤技巧
跑通之后,关键的功夫在抓包分析上。抓包时可以在模拟gNB所在机器上执行下面的命令,把NGAP和NAS消息一起抓下来。
# 抓取38412端口的NGAP消息,并显示过滤出NGAP和NAS层 sudo tshark -i any -f "sctp port 38412" -Y "ngap || nas_5gs" \ -T fields -e frame.time -e ngap.ProcedureCode -e nas_5gs.message_type-f是抓包前的粗过滤,只抓SCTP 38412端口,避免无关流量刷屏;-Y是显示过滤,ngap || nas_5gs表示里层和外层同时显示。ngap.ProcedureCode能看到NGAP层在跑哪个过程,比如InitialContextSetup是15,nas_5gs.message_type能看到NAS层消息类型。如果看到两个过滤条件结果都对,说明NGAP和NAS的嵌套关系已经被拆开。
注意:NAS消息在Security Mode Command之后变成密文,
nas_5gs.message_type还能解析出“这是某条消息”,但里面的IE已经看不到明文。验证加密后的行为,要看的是长度和完整性保护字段,而不是具体IE内容。
想要更深入理解NAS消息结构,可以自己写一个极简解析脚本,照着TS 24.501里5GMM消息头的定义去读消息类型。下面这个例子能解析未加密的注册请求:
# 最简5G NAS消息类型解析:只读头部,适合理解消息结构 def parse_nas_5gs(data: bytes) -> str: # 5G NAS头:EPD(1字节) + SecurityHeaderType(1字节) + MessageType(1字节) epd = data[0] if epd == 0x7e: # 5G Mobility Management msg_type = data[2] names = { 0x41: 'Registration Request', 0x42: 'Registration Accept', 0x44: 'Identity Request', 0x4e: 'Authentication Request', } return names.get(msg_type, f'Unknown(0x{msg_type:02x})') return f'Not 5GMM(0x{epd:02x})'这段代码的核心是:第一个字节0x7e表示这是一条5GMM消息,第三个字节才是消息类型。0x41是注册请求,0x42是注册接受,0x44是身份请求,0x4e是鉴权请求。实际抓包里如果消息被加密,第三个字节还在但后面全是密文,脚本只能帮你认消息名,没法看IE。
5. 信令学习高频翻车点与排查思路:四条血泪经验
这一章把学习过程中最常见的翻车场景整理成四条。每条都是真实工作里反复踩过的坑,按“现象、原因、解决”写清楚。
5.1 现象一:只学成功流程,现网日志里的cause一个都不认识
很多学习材料只画理想成功路径:注册请求发出,一路绿灯,注册接受回来。但现网拉日志时,大概率看到的是Registration Reject或者Authentication Failure,策略被拒、切片不允许、区域不允许,根因都在cause值里。如果你只背过消息名而没背过cause,日志摆在你面前也不知道该查哪个网元。
原因在于学习时没有建立“失败分支”的知识结构。解决方法是给每个流程补一张cause表:5GMM cause、NGAP cause、5GSM cause分开记。比如5GMM cause #3代表Illegal UE,多半是IMSI被列入黑名单;#7代表5G服务不允许,可能是网络没有开放5G或切片被限制;#29代表User authentication failed,直接查USIM密钥和签约数据。NGAP cause则要分Radio Network Layer、Transport Layer和Protocol三类,分别对应无线侧、传输链路和协议参数问题。学习时不能只看“这条消息是什么”,还要问“这条消息为什么是这个结果”。
5.2 现象二:把NGAP和NAS混在一条时间线里,时序全乱
Wireshark里同一时刻会同时出现NGAP和NAS两层消息,比如一条Initial Context Setup Request里可能既有NGAP过程信息,又带着一条NAS消息。新手常犯的错,是看到NGAP层有几条就以为是几个独立流程,或者把NAS消息的时间当成NGAP时间。实际这两个层面存在“承载”关系:NAS-PDU只是NGAP消息里的一个IE,它的时间戳和NGAP消息时间戳一致。
解决方法是分析前先分两个动作:第一,用ngap过滤看N2口过程;第二,用nas_5gs过滤看UE和AMF之间的对话。每次看时序,嘴里默念一句:这条消息是gNB和AMF之间的,还是UE和AMF之间的?想清楚这件事,很多“为什么这条消息先到、那条后到”的问题就自动消失了。
5.3 现象三:看到“没回应”就以为卡死,其实是定时器在起作用
现网信令跟踪里经常出现一段间隔后重复发送的相同请求,很多人第一反应是核心网卡死或基站丢包。其实5G的NAS层和NGAP层都有自己的定时器机制,比如UE侧的T3510控制注册请求的重传,超时没收到响应就重发一次;T3512控制周期注册更新,到了时间自动触发一次注册流程。日志上表现为同一条消息按固定间隔出现好几次,这不一定是网络故障。
原因是没有把定时器纳入流程认知模型。解决方法是背流程时连定时器一起背:注册请求看T3510,鉴权流程看T3560,PDU会话建立看T3580。同时看UERANSIM这类模拟器的日志,它会明确打印“Timer T3510 expires,retransmit”,这是理解“没回应”到底是什么状态的最好教材。真正需要排查的反而是“定时器还没超时就收到了拒绝”,那才是有条件的问题。
5.4 现象四:背了一堆消息名,却说不清每个消息里哪个IE最关键
消息名只是外壳,排障时决定方向的是IE。比如Registration Request里,5G-GUTI和SUCI决定AMF按什么路径处理身份识别;Requested NSSAI决定切片选择结果。只看消息名不看IE,遇到注册被拒就会抓瞎。典型场景是AMF回Registration Reject,你翻遍消息名也看不出原因,但展开IE发现Rejected NSSAI里的原因值写的是“切片在当前位置不可用”。
解决方法是强制自己做笔记时按固定格式来,格式放在下一章。要点是:每个流程至少记“一个关键IE + 一个失败cause”。关键IE选那个“变了就会导致流程走向不同的”字段;失败cause选该流程最常踩的3个值。这样笔记量不大,但每条都是排障时的索引。
6. 把信令流程学成肌肉记忆:一条主线、两种抓包、三遍过
6.1 一张“五段式”信令笔记模板
前面踩了那么多坑,最后落地的习惯是:学一个新流程,只允许自己填一张表,填完能不看材料默画出流程图,才算真会。这张表只有五列:
| 列 | 要填的内容 | 举例(注册流程) |
|---|---|---|
| 流程名 | 规范里的正式名称 | Registration procedure |
| 触发条件 | 什么事件引起 | 开机、跨TA、周期更新 |
| 消息时序 | 按方向写出完整消息链 | UE → gNB → AMF → AUSF → UDM |
| 关键IE | 流程分叉时决定方向的字段 | 5G-GUTI、Requested NSSAI |
| 失败cause | 最可能出现的3个原因 | #3、#7、#29 |
用这张表过一遍注册流程,你会发现自己真正需要记的并没有想象中那么多。填不出来就回头看TS 24.501或抓包,而不是回头再背一张巨型流程图。
6.2 三遍过学习法与现网验证习惯
学习任何一张新流程图,我习惯用三遍过法。第一遍只求全貌,用信令流程图倍速扫,知道消息走向和涉及网元;第二遍盯细节,把Wireshark里同流程的抓包逐条对照图里的每条消息,重点看IE和方向;第三遍主动破坏,改错OPc、改错切片、停掉UPF,让流程走失败分支,亲眼看到cause值怎么变化。三遍过完,这个流程才算长在身上。
拿一张真实失败日志做验证时,我现在的习惯是先问三个问题:这条拒绝的cause是哪一层的?这条请求有没有对应的定时器重传?成功路径如果走不通,网络侧有没有给降级或回退?这三个问题能过滤掉一多半的无效排查。希望这套思路对你也有用。
本文还有配套的精品资源,点击获取