首页 › tech › 5G核心网查户口:NRF排障记

概述:5G核心网换成服务化架构(SBA)后,网元之间不再点对点写死地址,而是先到NRF“查户口”再通信。户口簿一旦出错——幽灵实例、漏申报的切片——故障就变得极难定位。本文以一次割接后专网切片批量建不了会话的脱敏案例为主线,拆解NFProfile关键字段、给出从抓包到REST探针的完整排障工具链,并沉淀一份可落地的割接后“户口核对”清单。

目录

一、从“拉专线”到“查户口”:SBA改了什么

干了十几年核心网的人,肌肉记忆都是4G时代养成的:MME配置里写死S-GW地址池,SGSN和MME之间一对一对通GTP-C,加一个新网元,周边十几个网元的配置文件都要跟着改一遍。那是一个“拉专线”的时代——所有关系都是点对点静态配置,谁连谁、走哪个IP,全在配置文件里躺着。排障也简单粗暴:配置对了就通,不通就查配置。

5G服务化架构(SBA)把这套逻辑连根拔了。TS 23.501定义的架构里,每个网络功能(NF)把自己提供的能力以“服务”的形式暴露出来,彼此之间走HTTP/2+JSON的SBI接口通信。更关键的变化是寻址方式的颠覆:一个NF要找对端,不再查自己的配置文件,而是去问NRF(Network Repository Function,网络存储功能)——3GPP TS 29.510专门定义了这套“户口簿”机制。

流程说起来不复杂:

  1. 上户口:每个NF启动后向NRF发起Nnrf_NFM注册,提交自己的NFProfile——类型是SMF还是AMF、监听哪些IP和端口、支持哪些切片(S-NSSAI)、支持哪些DNN、容量权重多少;
  2. 查户口:消费方(比如AMF要选SMF)向NRF发起Nnrf_NFDiscovery查询,条件包括目标NF类型、S-NSSAI、DNN、TAI等;
  3. 用户口:NRF返回符合条件的NFProfile列表,消费方按priority和capacity做负载均衡,挑一个发起真正的业务请求。

这个设计的好处显而易见:扩容时新实例自动注册上线,缩容时注销即可,全网无感知;故障切换从“改配置倒换”变成“NRF返回另一个实例”。但硬币的另一面是——过去分散在几十台设备上的配置错误,现在集中到了一张户口簿上。户口簿错了,错法比以前隐蔽得多,这是很多从4G转5G的运维同事最大的不适应。

二、NFProfile:户口簿上每一栏都可能埋雷

把TS 29.510定义的NFProfile拆开看,每一栏都对应一类真实故障。我按排障时的重要性排个序:

字段 含义 排障时的意义
nfType / nfInstanceId 网元类型与唯一标识 判断返回的实例到底“是谁”,同一实例反复注册会产生多份记录
nfStatus REGISTERED / SUSPENDED / UNDISCOVERABLE 头号嫌疑字段。已下电未注销的“幽灵实例”仍显示REGISTERED
ipv4Addresses / fqdn 实例的服务地址 查询返回了,但地址不可达,等于查到了死人的住址
sNssais / snssaiInfos(SMF) 申报支持的切片及每切片的DNN信息 漏申报一个切片,该切片用户全部选不到SMF——本案例第二处伤
validityTime Profile有效期,到期前需发NFUpdate刷新 机制上NRF会在过期后把实例置为UNDISCOVERABLE,是幽灵实例的“自动清道夫”,但有效期长短各网自定
capacity / priority 容量权重与优先级 决定流量怎么分——幽灵实例权重没回收,流量就继续往死路上分
supportedFeatures 支持的特性集 两端特性协商不一致,请求会被对端以不支持拒掉

这里要特别强调nfStatus和validityTime的配合机制,它是理解本案例的钥匙。按TS 29.510的设计,NF注册后NRF会给Profile一个有效期,NF必须周期性发NFUpdate续期;一旦停止续期(比如实例被下电),NRF在有效期到点后应将其置为UNDISCOVERABLE,后续发现请求不再返回它。理论上这是一个自愈机制。但工程现实是:有效期配置各网差异很大,标准也允许多种实现,具体默认行为以各厂家官方文档为准——如果有效期配得长、或者网管上没人盯着清单,幽灵实例就能“活”好几个小时甚至更久,足够酿成一场事故。

还有一个运维容易忽略的点:注销也是生命周期的一部分。注册(Register)→续期(NFUpdate)→注销(NF-Deregister),三步缺一不可。而割接脚本十有八九只写了“新实例上线、旧实例下电”,下电用的是最粗暴的方式——直接关虚机。进程没了,注销请求自然没人发。

三、案例:割接后2小时47分的“隐形断网”

以下案例来自某省5G SA网络商用初期的真实排障经历,细节已做脱敏与融合处理,数字为便于叙述做了圆整。

背景:该省5G核心网设两个DC,SMF资源池共4个实例,承载公网eMBB用户和6家企业的专网切片(企业切片用独立的S-NSSAI,SD值不同)。周四晚例行割接窗口,计划对SMF池做一次版本升级:新版本以2个新实例上线,2个旧实例下电退役。

时间线:

时间 事件 关键动作
21:15 割接开始 冻结工单,按预置脚本执行
21:38 2个新SMF实例上线,2个旧实例直接关机回收 割接报告显示一切正常
21:52 拨测机器人告警:专网切片会话建立失败率飙到22% 公网切片指标正常,NOC初步怀疑专网侧问题
22:05 NOC初判 优先排查企业侧专线与终端,未执行回滚
22:40 无线侧排查完毕 基站KPI、NGAP建立正常,排除接入网
23:05 翻AMF日志 Nsmf会话创建请求大量超时,失败集中且随机的分布
23:20 SBI接口抓包 NFDiscovery有返回,但返回的实例地址ping不通
23:52 直接调NRF的清单接口 发现注册清单里有8个SMF实例,预期只有4个
00:05 手工PATCH注销4个幽灵实例 失败率不降反升至100%——第二处伤现形
00:15 检查新实例NFProfile snssaiInfos漏了专网切片(升级模板用了公网基线)
00:25 补齐申报字段后,专网切片恢复 成功率回到99.5%,事件关闭
次日 复盘 固化三条整改措施(见第六节)

影响评估:故障窗口2小时47分钟(21:38–00:25),期间专网切片方向累计约2.6万次会话建立尝试、约7300次失败,6家企业中4家的物联网与办公终端间歇性无法上网;公网手机用户成功率从99.6%小幅波动到99.1%,基本无感。这是一场典型的“隐形断网”——公网大盘绿得发亮,专网客户那头已经炸了锅,而那恰恰是SLA最贵、赔付条款最狠的用户。

值得玩味的是为什么失败率是22%而不是50%。SMF池4个预期实例中2个成了幽灵,理论上按容量轮询约一半请求会命中死实例;但AMF侧对发现结果有本地缓存和重选逻辑,一部分请求重试后命中活实例,对外表现就被“抹平”到了两成。这种不彻底的失败是最害人的故障形态——告警不炸、指标半红不红,很容易被当成参数抖动压下去。

四、追凶:三条时间线对出来的真相

复盘整个定位过程,真正起决定作用的是“三条时间线对齐”的方法:把拨测KPI曲线、AMF侧日志、NRF侧清单变化放到同一个时间轴上。23:05之前各家各查各的,进展缓慢;23:20完成对齐后,十分钟就锁定了方向——失败率抬升的起点精确地卡在21:38新实例上线那一刻,而那之后NRF清单里多了“活口”。

完整的故障链路可以用一张图说清:

sequenceDiagram
    participant U as 终端
    participant B as gNB
    participant A as AMF
    participant R as NRF
    participant S as SMF
    U->>B: 注册请求
    B->>A: NGAP初始UE消息
    A->>A: 鉴权通过 注册接受
    U->>A: PDU会话建立请求
    A->>R: NFDiscovery查询SMF
    R-->>A: 返回幽灵实例的NFProfile
    A->>S: Nsmf会话创建请求
    Note over S: 该实例已下电两小时 无人应答
    A-->>U: PDU会话建立失败

对应的排查决策树,建议存在每 responsibilities个NOC的预案库里:

flowchart TD
    A["专网切片会话批量失败"] --> B{"用户注册是否正常"}
    B -->|"正常"| C["看AMF的SMF选择日志"]
    B -->|"异常"| D["查接入与鉴权链路"]
    C --> E{"NRF发现请求返回什么"}
    E -->|"返回为空"| F["查SMF注册申报的切片"]
    E -->|"返回实例"| G["核对实例地址可达性"]
    G --> H{"实例是否真实存活"}
    H -->|"无响应"| I["比对注册清单与预期清单"]
    I --> J["PATCH注销幽灵实例"]
    F --> K["补齐NFProfile申报字段"]
    J --> L["固化割接后户口核对巡检"]
    K --> L

现场用到的三件工具,都是常规武器,组合起来才有杀伤力:

第一件,抓包看懂HTTP/2里的JSON。SBI走HTTP/2,明文h2c部署在内网很常见,用镜像口在AMF与NRF之间抓包,Wireshark新版本(4.x及以后)自带SBI解码能力,能把Namf、Nsmf这些服务调用的JSON报文解析成结构化字段,过滤协议名sbi即可。23:20那次抓包,我们看到discovery响应里返回的ipv4Addresses是旧实例的地址——设备早已回收,自然ping不通。

第二件,把NRF当数据库直接查。NRF本质是标准的REST服务,按TS 29.510定义,GET /nnrf-nfm/v1/nf-instances?nf-type=SMF 能列出全部注册实例,GET /nnrf-disc/v1/nf-instances?target-nf-type=SMF&requester-nf-type=AMF 能模拟一次发现请求。23:52那条清单查询一跑出来,8个实例对4个预期,全场安静了三秒。想在自己环境里练这套接口,Open5GS开源项目在笔记本上就能搭起来,仓库里NRF的实现和接口路径与规范一一对应。

第三件,认清报文里那些3gpp-Sbi-开头的自定义头。TS 29.500定义了一组3gpp-Sbi-*HTTP头部,比如携带路由绑定信息的3gpp-Sbi-Routing-Binding、标识生产者的3gpp-Sbi-Producer-Id。排障时这些头是“路条”——它能告诉你这个请求原本绑在哪个实例上,间接通信场景下尤其关键。当晚部分请求带着指向旧实例的路由绑定头,重试也打不回去,这也是失败分布看着“随机”的另一半原因。

五、修复与复盘:两处伤,一处理

00:05手工PATCH把4个幽灵实例置为UNDISCOVERABLE后,本以为大功告成——结果失败率瞬间冲到100%。这个反直觉的瞬间恰恰把第二处伤暴露了出来:新实例的NFProfile里,snssaiInfos漏申报了专网切片。此前专网会话部分能成功,靠的正是“还没注销干净”的旧实例——旧版本实例带着完整的切片申报在硬撑。注销幽灵等于拔掉了最后一根输血管,NRF发现请求返回空列表,AMF无SMF可选,会话全部拒绝,终端侧看到的正是5GSM原因值#27“缺失或未知DNN”一类拒因。

也就是说,当晚SMF池其实带着两处伤在运行:户口没注销(幽灵实例)+ 新户口内容错(切片漏申报)。第一处伤制造间歇性失败,第二处伤被第一处伤掩盖。修复顺序上也吃了亏——正确做法是先补齐新实例的申报字段,确认discovery能返回健康实例,再注销幽灵。反过来做的代价是多宕了十分钟。

根因归纳为四条:

  1. 割接流程缺失生命周期闭环。脚本只管进程启停,没有“旧实例NF-Deregister”步骤,也没人验证注销结果;
  2. 版本基线模板管理缺陷。升级用的新实例配置模板以公网商用基线为准,专网切片是后期增量需求,没进模板库——典型的“配置漂移”;
  3. NRF清单无巡检。监控体系里有CPU、有吞吐、有成功率,唯独没有“注册清单与预期清单的差集”这个最简单的核对项;
  4. 有效期机制形同虚设。该网NFProfile有效期配置偏长,且无人关注续期失败事件——NRF的自愈清道夫在,但没人给它定时。

另外还有一条隐性教训:当晚唯一能提前十几分钟抓住故障的信号,是分切片维度的会话建立成功率。公网大盘监控把专网的劣化平均掉了。6家企业的SLA价值占该省5G收入并不高,但故障放大系数极高——专网客户的一通投诉电话,分量顶得上十万个手机用户的静默重试。

六、给同行的工具箱与清单

把4G和5G的排障视角放在一起看,变化是结构性的:

维度 4G(点对点) 5G SBA(服务化)
寻址方式 配置文件写死对端地址 向NRF动态发现NFProfile
故障域 单点配置错,影响固定一对网元 注册表错,可能放大为区域性故障
排障对象 GTP-C/S1AP等专用协议 HTTP/2里的JSON报文
常用武器 协议仪表、网管跟踪 Wireshark SBI解码、REST探针、清单巡检
割接风险 配置回滚 生命周期闭环 + 基线字段核对
监控盲区 对端状态不可见 注册状态与实际存活性脱节

沉淀成三张可执行清单:

割接前——新实例配置模板与现网做字段级diff审计,sNssais、DNN列表、supportedFeatures逐项核对;预置“先补申报、后注销幽灵”的修复顺序。

割接中——注销必须走协议流程(NF-Deregister),禁止只关虚机;每下电一个实例,立刻查一次清单接口确认其状态变化。

割接后——固化“户口核对”巡检:GET /nnrf-nfm/v1/nf-instances 的返回与CMDB预期清单做差集,差集非空即告警;KPI按切片维度单列监控;把validityTime续期失败、nfStatus异常翻转纳入NRF侧事件告警。

七、结语

从4G到5G,核心网的排障逻辑其实完成了一次范式转移:过去查“线”,现在查“账”。NRF把全网网元的关系收进一张动态户口簿,换来了弹性与自动化,也把最古老的运维真理放大了——账本本身就是最大的单点真相,账本的核对比任何性能指标都优先。那个周四夜里,2小时47分钟的故障,起因不过是两台虚机下电时少发了一个HTTP请求。SBA没有让运维变简单,它只是把“细心”从一个美德变成了一个系统需求。

参考来源

  1. 3GPP TS 29.510(ETSI TS 129 510)— 5G System; Network Function Repository Services(NRF服务与NFProfile定义) — 本文NRF注册/发现/有效期机制的规范依据
  2. 3GPP TS 23.501(ETSI TS 123 501)— 5G系统架构(NF与NF服务的发现与选择) — SBA总体架构与AMF选择SMF的原则
  3. 3GPP TS 24.501(ETSI TS 124 501)— NAS协议(5GSM原因值定义) — 会话拒绝原因值(如#27)的官方定义
  4. Open5GS开源项目仓库 — 可本地复现NRF注册/发现全流程的开源5G核心网实现
  5. Wireshark官方文档 — 新版本内置SBI解码能力与显示过滤参考

本文由「51学通信」技术团队出品。51学通信由通信行业18年老兵爱卫生(微信ID: gprshome201101)维护,聚焦5G/6G核心网、3GPP标准解读、通信前沿技术深度分析。 出版作品有《5G核心网原理与实践》《IMS原理与实践》等4本通信专业书籍。知识星球「51学通信」提供深度技术答疑和行业洞察。

[!tip] 51学通信知识星球 星主:爱卫生(微信:gprshome201101)——公众号「51学通信」创办者,19 年通信行业运维与讲师经验,著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书(各大电商平台有售)。 星球定位:深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域,主打运维岗位与信令分析。 当前规模:5200 篇主题 / 990 个回答,198 元/年。 加入福利:加入星球后请加爱卫生微信,拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题,另有群内分享。 AI 加持:51学通信知识星球已作为 skill 接入 WorkBuddy,使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例,做总结、找文档和 PPT 等场景全覆盖。

51学通信知识星球海报-扫码加入