
做5G核心网相关工作的人迟早都要和NAS消息杠上。不管是测试终端注册不上网络、切片协商失败还是业务建立后突然掉线翻到最后几乎都会落到那条NAS信令上。NAS消息解析说难不难说简单也不简单——Wireshark一打开全是十六进制消息里各种IEInformation Element层层嵌套新手容易一头雾水。我刚入行时就在这上面栽过不少跟头今天把这几年实际抓包、解析5G NAS消息的经验整理出来从协议字段到Wireshark实操一次讲透。这篇文章适合三类人一是刚接触5G核心网的测试工程师、协议开发想快速看懂NAS消息结构二是做信令分析、问题定位的老手想系统地补一下Wireshark解析NAS的细节三是纯粹好奇“5G手机注册网络时到底和核心网说了什么”的技术爱好者。我会用一次注册流程的实际抓包作为主线把NAS消息的封装位置、协议字段、常见消息类型、Wireshark过滤和分析方法全部串起来。看完之后你至少能自己打开一个pcap文件从一堆二进制里准确找出Registration Request、看懂关键字段并判断流程走到哪一步出了问题。1. 先搞清楚NAS消息在5G核心网里的位置1.1 什么是NAS消息为什么要盯着它NAS全称是Non-Access Stratum非接入层。这里的“非接入层”是相对“接入层”ASAccess Stratum而言的。你可以把整个无线通信体系想象成一家餐厅终端UE是顾客基站gNB是服务员核心网AMF是后厨。顾客想加菜、催菜这些需求属于“和后厨直接沟通”的内容服务员负责把需求原话传给后厨自己不解读、不修改。这里“顾客和后厨之间的对话”就是NAS消息而“服务员传递菜单、上菜”的过程就是接入层的活儿对应的主要是RRC无线资源控制信令。在5G里终端和AMFAccess and Mobility Management Function接入与移动性管理功能之间直接交互的NAS消息承载了几乎所有和移动性、会话管理相关的关键操作注册流程、鉴权流程、安全模式控制、服务请求、PDU会话建立、去注册等等。可以说核心网侧看到的“用户意图”全部体现在NAS消息里。RRC层再复杂最终也只是负责把NAS内容“原封不动”地从一个节点搬到另一个节点。实际工作中判断一个5G终端能不能入网、为什么被拒、安全流程是否正常基本都是靠分析NAS消息。不信你打开任何一个核心网信令跟踪工具里面最核心的路径就是NAS消息列表。所以学会解析NAS就是掌握了5G核心网调试的“主线剧情”。1.2 NAS消息是怎么从终端一路跑到AMF的既然NAS是非接入层的“直达消息”它肯定是跑在无线协议栈的上层。从终端侧看协议栈从上到下大致是NAS - RRC - PDCP - RLC - MAC - PHY。NAS消息并不被基站“翻译”而是被封装在RRC信令里的一个字段中常见的是DLInformationTransfer和ULInformationTransfer里的dedicatedInfoNAS字段。基站把RRC解出来取出里面的NAS消息再放到NGAPN2接口的NAS-PDU字段里通过SCTP连接发给AMF。所以在不同的接口抓包看到的“容器”不一样N1接口UE和AMF之间逻辑接口NAS消息在RRC层承载。N2接口gNB和AMF之间NAS消息在NGAP协议中透传Wireshark中对应ngap.nasPdu字段。不管在哪一层承载NAS内容本身是不变的。这意味着在Wireshark里只要Wireshark能正确解析RRC或NGAP它就能把内嵌的5G NAS内容解析出来。这也是抓包分析NAS的理论基础。理解这一点后面设置过滤器就顺理成章了。需要注意Wireshark把5G NAS协议显示名称为nas-5gs而不是5g-nas之类的名字。这个细节很关键因为很多人第一次过滤时输入“5g-nas”发现一个包都过滤不出来其实是协议名写错了。1.3 消息头和消息体5G NAS的“信封”结构5G NAS消息的结构基本是三段式和寄快递类似先是“收件人信息”再是“投递要求”最后才是“包裹内容”。具体到NAS消息就是Extended Protocol DiscriminatorEPD扩展协议鉴别器、Security Header Type安全头类型和Message Type消息类型三个头字段后面跟着一堆消息体IE。EPD的作用是告诉接收方“这是哪一类NAS消息”。5G里最常见的两个值0x7e表示5GMM5G Mobility Management移动性管理消息0x7d表示5GSM5G Session Management会话管理消息。简单说0x7e开头的是管“注册、鉴权、移动”的0x7d开头的是管“PDU会话建立、修改、释放”的。Security Header Type表示这条NAS消息是否做了完整性保护或加密。0表示明文1表示只做了完整性保护2表示既做了完整性保护又加密。明文状态是我们最舒服的分析状态因为所有字段都看得清清楚楚一旦加密Wireshark只能告诉你这是某类NAS消息但消息体里的IE已经不可读了。Message Type则是一条NAS消息的“身份证号”。比如0x41是Registration Request注册请求0x42是Registration Accept注册接受0x43是Registration Complete注册完成。不同的消息类型对应不同的IE模板Wireshark拿到Message Type后才知道怎么去解析后面的字节。我在刚开始接触时经常把LTE的NAS和5G的NAS搞混。LTE的EPD值通常显示为0x7e在EMM消息里5G显示也是0x7e但字节排列和字段含义并不完全一样。所以分析之前一定要确认抓到的包到底是4G环境还是5G环境不然会被一些字段差异带偏。2. 准备抓包环境从工具版本到抓包位置2.1 Wireshark版本选择与安装要点解析5G NASWireshark版本不能太老。太老的版本对5G NAS的解析支持不完整很多IE显示成Unknown或者原生十六进制分析起来非常痛苦。我个人的经验是尽量用4.0以上的版本4.0以后对nas-5gs、NGAP、HTTP/2等协议的支持都比较成熟。如果你用的是3.x的老版本建议先升级再对照下面的步骤操作否则有些显示字段对不上。安装方面Windows下需要注意Wireshark安装的时候会让你选安装Npcap还是WinPcap。现在一定要选NpcapWinPcap已经停止维护很多年了驱动层面存在兼容性问题。Npcap支持的新版Windows网卡驱动更好抓包稳定性也更高。安装的时候默认勾选的“Start Npcap Service at startup”建议保留否则部分网卡会提示抓不到包。如果你公司电脑有权限限制可以下载Wireshark绿色解压版但抓包引擎Npcap还是要单独装的。Wireshark本身只是个图形化前端真正干活的是抓包引擎。所以遇到“打开软件正常一点开始抓包就报错”的情况十有八九是Npcap没装好或者服务没启动。先在Windows服务里确认Npcap服务是运行状态再考虑重装不要一上来就卸载Wireshark。2.2 在哪个接口能抓到NAS消息抓包之前先想清楚你要在哪个位置抓这决定了你看到的协议栈内容。最理想的是在模拟终端和模拟核心网的测试环境里抓。很多5G核心网开发测试会用UERANSIM这类开源模拟终端/基站工具UERANSIM跑在普通的Ubuntu主机上终端gNB和核心网之间走的是真实NGAP协议NAS消息完整地封装在里面。在这种环境下直接在运行gNB或AMF的主机上用Wireshark抓对应端口通常是SCTP 38412端口就能看到完整的NAS交互。如果你有真正的测试终端比如某厂商的测试手机或CPE可以抓空口侧的RRC消息NAS消息就藏在RRC的DLInformationTransfer和ULInformationTransfer里。但空口侧抓包需要专用工具或支持Monitor Mode的专用网卡一般工作场景用得不多。大部分时间我们是在核心网侧、或在gNB与AMF之间的传输链路上抓包抓到的是NGAP封装的NAS消息。用虚拟机跑5G核心网也很常见。这种情况下你需要在宿主机上抓到虚拟网卡上的流量或者直接在虚拟机内部用Wireshark抓取回环接口通常是loopback。如果在虚拟机里抓回环别忘了Wireshark默认可能不会显示lo接口需要在“Capture Interfaces”里手动勾选或者用管理员权限启动Wireshark。2.3 捕获过滤器与显示过滤器怎么配合Wireshark有两套过滤器用途完全不同捕获过滤器Capture Filter在数据进Wireshark之前就过滤掉只保留匹配的流量。它的好处是节省磁盘和内存适合长时间抓包坏处是过滤条件写错就会漏掉关键数据所以抓关键信令时我一般不太敢用太窄的捕获过滤器。显示过滤器Display Filter只是“过滤显示”数据已经全部在内存里了只是把不匹配的包隐藏起来。它不影响包内容随时可以修改。分析NAS消息时我推荐先“全量抓包”再用显示过滤器来看NAS。原因很简单抓包时你并不知道哪些包重传了、哪些包顺序变了先留全量后面分析时更安全。显示过滤器一行就能搞定nas-5gs这一个过滤条件Wireshark会把所有包含5G NAS消息的包列出来。因为这些NAS可能是从RRC的dedicatedInfoNAS字段解出来的也可能是从NGAP的nasPdu字段解出来的但最终它们都会被Wireshark统一识别为nas-5gs协议。直接用nas-5gs过滤比分别用rrc.dedicatedInfoNAS和ngap.nasPdu过滤要省事得多。如果你抓的接口流量很大不想把SCTP之外的内容都收进来可以在捕获过滤器里写sctp or http25G NGAP通常跑在SCTP 38412端口5G服务化接口比如AMF与SMF之间的通信通常跑在HTTP/2上。这个捕获条件已经能覆盖大多数实验室环境下的信令流量。3. 5G NAS协议字段拆解从消息类型到关键IE3.1 永远先看前三个字节每次拿到一条5GMM的NAS消息我都会先看前三个字节。别看只有三个字节它能告诉你这条消息“属于谁、有没有加密、到底是什么操作”。用一条最常见的Registration Request来举例它在Wireshark里的原始十六进制前三个字节通常是7e 00 41逐字节拆开0x7eExtended Protocol Discriminator值是5GMM。这是移动性管理消息不是会话管理消息。0x00Security Header Type。0x00表示“Plain NAS message”也就是明文、没有加密、没有完整性保护。注册请求的初始消息基本都是这个状态。0x41Message Type0x41就是Registration Request注册请求。这三字节一读出来这条消息的性质就明确了这是一条5G移动性管理域里、明文状态下的注册请求。如果第二个字节变成0x02说明这条消息已经加密了后面的IE大概率是密文Wireshark也就无法展开具体字段。这个时候你应该意识到安全模式命令已经执行过后续流程里的大多数NAS内容已经不可读了。3.2 一条Registration Request的关键字段往前走一步在Wireshark中点击一条Registration Request展开NAS-5GS树会看到密密麻麻的字段。第一次看很容易眼花我建议先关注下面几个最能说明问题的字段5GS Registration Type注册类型常见的有Initial Registration初始注册、Mobility Registration Updating移动性更新注册、Periodic Registration Updating周期性更新注册、Emergency Registration紧急注册。终端开机第一条消息基本是Initial Registration如果走到中段掉线后重注册很可能是Periodic。ngKSINAS Key Set IdentifierNAS密钥集标识用于表示当前使用哪套安全上下文。如果终端注册时带了ngKSI可以和核心网侧的安全上下文编号做对照判断是否是旧密钥导致的鉴权失败。5GS Mobile Identity这是注册请求里最重要的IE。它可以是一个SUCISubscription Concealed Identifier用户隐藏标识也可以是一个5G-GUTI5G Globally Unique Temporary Identity5G全球唯一临时标识。如果终端之前已经注册过手头有5G-GUTI可用一般会用5G-GUTI如果没有就上报SUCI。SUCI是对IMSI加密后的结果目的是保护用户隐私。UE Security Capability终端支持的安全算法能力比如NEA05G加密算法0、NEA1、NEA2以及完整性算法NIA1、NIA2等。核心网需要根据这个字段和自身配置选择双方都支持的算法并在后续安全模式命令里下发。Requested NSSAI终端请求的网络切片列表每个NSSAI由SSTSlice/Service Type和可选的SDSlice Differentiator组成。这个字段在切片问题排查里非常关键。展开这些字段时Wireshark会在每个字段下面给你十六进制偏移和二进制位图。刚开始看的时候不用逐位研究先看每个IE的“摘要值”等遇到具体问题再细化到bit级。3.3 常见NAS消息类型与流程阶段对照5G NAS消息类型非常多但实际定位问题常用到的就那几个。我整理了一个速查表遇到流程中断直接按消息类型查消息名称Message Type所属域常见场景Registration Request0x415GMM开机初始注册、移动性更新、周期性更新Registration Accept0x425GMM核心网同意终端注册Registration Complete0x435GMM终端确认注册完成Registration Reject0x445GMM核心网拒绝注册携带拒绝原因De-registration Request0x455GMM终端或网络发起去注册Service Request0x4c5GMM终端需要建立用户面连接或响应寻呼Authentication Request0x565GMM核心网向终端发起鉴权请求Authentication Response0x575GMM终端返回鉴权响应Security Mode Command0x5d5GMM核心网下发安全算法和密钥信息Security Mode Complete0x5e5GMM终端确认安全模式完成消息码我建议以Wireshark实际解析为准不同协议版本可能会有保留值或扩展值。分析时更可靠的办法是直接看Wireshark字段树里的Message Type描述而不是死记硬背十六进制值。当然0x41是Registration Request、0x42是Registration Accept这种基本功还是值得记在脑子里因为看十六进制原始报文时能一眼定位。3.4 安全保护后怎么继续分析很多新手有一个误区以为NAS只要加密了就没法分析了。实际上即使NAS消息密文不可读它的外层消息流程依然有大量信息。比如Security Mode Command这条消息本身是明文或部分明文它携带了核心网选择的算法列表、ngKSI等信息Security Mode Complete之后后续NAS消息被加密但Wireshark依然能从消息长度、方向、时间间隔上推断流程流转是否正常。我在定位“终端注册到一半卡住”的问题时经常会看到注册完成后后续一条Service Request变成密文但迟迟没有收到Accept。这时候就算解不开密文也能从时间线上怀疑是核心网侧SMF选择或PDU会话建立环节出了问题而不是终端有问题。如果要深入分析加密后的NAS载荷必须在核心网侧拿到保存的安全上下文密钥然后在Wireshark的“Protocols - NAS-5GS”里配置密钥让Wireshark尝试解密。但这种操作的前提是你有合法的调试授权并且密钥信息严格脱敏。普通网络抓包不做配置的话只能看到密文。这块涉及调试权限和管理流程我这里不展开知道有这回事就行。4. 实战完整抓取并解析一次5G注册流程4.1 发起注册前要确认的几件事一次成功的5G初始注册在Wireshark里会表现为一串典型的NAS信令序列。在开始抓包前有几个容易忽略的准备工作第一确认终端和核心网的时间戳比较接近。两边时间差太大日志和抓包对不上定位问题非常痛苦。第二把终端里的旧USIM信息、旧安全上下文清理干净确保首次注册从“无上下文”状态开始这样能看到完整的SUCI上报、鉴权、安全模式流程。如果终端带着5G-GUTI去注册流程会简略很多初学者可能看不到完整链路。第三Wireshark里先加一个“Time”frame.time_relative列记录每个包相对开始抓包的秒数后面算时延要用。另外抓包的主机如果性能一般建议先停掉不必要的抓包任务尤其是不要同时用浏览器等产生大量流量减少噪声。4.2 抓包实录与逐层展开一次典型的开机注册流程开启Wireshark抓包后在终端侧执行开关机、SIM卡重新插拔、飞行模式切换等方式触发注册。停止抓包后在显示过滤器里输入nas-5gs你会看到一串消息从Registration Request开始后面可能跟着Identity Request/Response如果需要终端上报身份、Authentication Request/Response、Security Mode Command/Complete最后是Registration Accept和Registration Complete。点击第一条Registration RequestWireshark下方Packet Details面板会显示类似这样的结构NAS-5GS Extended protocol discriminator: 5G mobility management (0x7e) Security header type: Plain NAS message, not security protected (0x0) Message type: Registration request (0x41) 5GS registration type: Initial registration ngKSI: 1 5GS mobile identity: SUCI UE security capability: 5G-EA0, 128-5G-EA1, 128-5G-EA2, 5G-IA0, 128-5G-IA1, 128-5G-IA2 Requested NSSAI: 1 network slice ...这个字段树就是Wireshark根据原始十六进制自动解析出来的结果。我习惯在“Packet Bytes”面板里同时开着十六进制视图鼠标点字段树的某一项十六进制视图会自动高亮对应字节这样能把“协议字段”和“原始字节”一一对上。比如点Message type字段右侧高亮的就是0x41那个字节。这个联动功能对理解协议结构帮助极大。4.3 从Registration Request到Accept要经过哪些消息整条注册流程走下来正常的消息顺序和时间消耗大概是方向消息作用UE - AMFRegistration Request终端发起注册携带身份和能力AMF - UEIdentity Request可选核心网请求终端上报身份UE - AMFIdentity Response可选终端上报SUCIAMF - UEAuthentication Request核心网发起鉴权挑战UE - AMFAuthentication Response终端完成鉴权计算AMF - UESecurity Mode Command下发安全算法激活安全上下文UE - AMFSecurity Mode Complete终端确认安全模式建立AMF - UERegistration Accept核心网同意注册下发5G-GUTI、TA List、NSSAI等信息UE - AMFRegistration Complete终端确认收到GUTI等信息初学者最容易犯的错是把“Authentication Request”和“Security Mode Command”的顺序搞混。记住一个原则鉴权在前安全模式在后。鉴权证明“你是你”安全模式决定“后续消息用什么算法加密”。如果鉴权失败后面根本走不到安全模式。如果中间出现Registration Reject不要急着崩溃Reject消息里会带一个5GMM Cause值比如“Illegal UE #3”“SUBIET not subscribed #5”等。Wireshark会把Cause描述直接显示出来这往往是定位“为什么上不了网”的最快线索。4.4 用时间线分析和自定义列量化时延很多问题光看消息顺序还不够还要看时延。比如注册请求发出去之后等了很久才收到响应这中间耗时到底花在哪了需要用时间线量化。Wireshark里有一个特别好用的字段frame.time_delta_displayed它表示“当前显示的包”和“上一个显示的包”之间的时间间隔。在显示过滤器已经设为nas-5gs的前提下每一行显示的NAS消息都会自动计算和前一条NAS消息的间隔这样你就能直接看出注册流程里哪两个环节之间耗时最长。设置方法右键任意列标题选择“Column Preferences”添加一列字段名填frame.time_delta_displayed标题改成“Delta(ms)”。如果你的显示过滤器已经过滤好了这一列的单位会自动显示为秒或毫秒。生产环境里排查“注册慢”基本就是靠这个列一层层定位到底是UE发出Registration Request到AMF响应慢还是AMF向UE发出Authentication Request之后终端响应慢。4.5 把NAS消息导出成文本或脚本输入当NAS消息数量很多或者需要把协议解析结果导出给同事/写脚本分析时纯靠鼠标翻Wireshark界面太低效。Wireshark自带命令行工具tshark可以快速把NAS消息解析结果导出来。最简单的导出格式是文本树tshark -r 5g.pcap -Y nas-5gs -V nas_5g.txt这个命令会把每个包含NAS的包进行完整协议解析并把解析树输出到文本文件。配合grep可以快速筛选字段。比如想统计所有Registration Request的帧号可以tshark -r 5g.pcap -Y nas-5gs.msg_type 0x41 -T fields -e frame.number如果你不确定某个字段名怎么写先在Wireshark的Packet Details里右键该字段选择“Copy - Field Name”再拿这个字段名去tshark里用。这样不会记错字段名。命令行在处理几百兆的pcap时优势非常明显界面卡到不能动的时候tshark经常几秒钟就出结果。5. 常见问题与排查技巧实录5.1 我遇到过的几个“假故障”刚开始用Wireshark解析NAS时容易把环境问题当成协议问题。我踩过的坑里最典型的有三类。第一类是“抓到了包但显示过滤后用不上”。这种情况往往是过滤条件写错了协议名。比如写nas-5g、nas_5gs、5g-nas都是无效的。正确名称是nas-5gs中间没有乱加下划线或剪短。输错时Wireshark过滤器输入框会变红这是最直观的提示。第二类是“NAS字段树能展开但很多字段显示为Unknown”。这通常是因为Wireshark版本太老对某些新IE不支持。升级Wireshark就好别在旧版本上死磕。第三类是“看到一条Registration Request以为是同一个流程其实是旧流程的重传”。正常注册流程中某些NAS消息如果超时未收到响应对端会重传。你看到两条完全相同的Registration Request不一定代表终端注册了两次也可能是第一次请求超时后重发的。判断方法是看时间间隔和携带的ngKSI/5G-GUTI是否一致。5.2 长时间抓包的正确姿势长时间抓包是另一个高频需求。协议回归测试可能要跑一晚上如果一直往一个文件里写文件会膨胀到几个GB最后Wireshark打开都卡死甚至系统磁盘写满。正确的做法是用多文件模式。在“Capture Options”里找到“Output”区域选择“Use multiple files”按文件大小或时长切分比如每个文件100MB同时勾选“Ring buffer with N files”环形缓冲区可以只保留最近N个文件防止磁盘占满。抓NAS信令的话切分大小建议设小一点比如50MB因为一个包含大量SCTP和HTTP/2的抓包文件50MB已经能覆盖很长时间。另外长时间抓包时最好用捕获过滤器把无关流量过滤掉。比如只需要抓NGAP端口sctp port 38412这个捕获过滤器比显示过滤更早生效能显著降低写入压力。5.3 关于抓包长度显示不全的问题有朋友问过“为什么抓包只能看到520字节而实际包有2090字节”这个问题本质上和抓包“快照长度”Snaplen有关。Wireshark抓包时为了节省存储默认情况会保存每个帧的前面一定字节。现在新版Wireshark默认Snaplen是65535字节一般不会截断普通信令包。但如果你的抓包设置被改过或者起始抓包时选了某个接口的抓包长度限制就可能出现每个包只抓前面一小段比如520字节后面内容全部丢失的情况。遇到这个问题先打开“Capture Options”确认接口参数里长度/快照长度是65535以上重新抓包。注意已经抓到的不完整数据无法补全必须重新抓。还有一种情况不是包被截断而是网卡驱动做了TCP分段卸载TSO/LRO或接收端合并Wireshark看到的大包实际上是驱动合并后的结果字节数对不上。这种情况需要到网卡属性里关闭相关卸载功能再重新抓包。5.4 问题速查表现象可能原因解决办法过滤器nas-5gs输入后显示红底协议名写错确认拼写为nas-5gs抓包列表里SCTP很多但看不到NAS显示过滤未生效或Wireshark版本不支持NGAP解析升级Wireshark并输入nas-5gs过滤NAS消息体全是十六进制密文消息已加密查看Security Header Type是否为0确认安全模式已建立注册流程中缺少Authentication Request终端使用5G-GUTI且网络接受直接进入安全模式不是故障初始注册也允许跳过鉴权实际此场景极少数需结合日志确认Wireshark打开大pcap卡死文件过大或内存不足用tshark命令行处理或抓包时使用多文件切分只能看到前几百字节Snaplen被限制重新设置Capture Options的抓包长度关闭网卡卸载功能最后再分享一个小技巧。我每次拿到一条5GMM的NAS消息都会习惯性地在脑子里默念一遍前三个字节比如“7e 00 41这是一条明文注册请求”。这个习惯练出来之后在抓包列表里扫一眼十六进制视图就能快速判断流程方向不用每次点进去看字段树。不管是刚入行还是已经做了几年核心网保持“先在原始字节上确认再相信Wireshark解析结果”的习惯能帮你避开很多工具误差带来的误判。搞协议解析最后拼的就是细心。