<!-- title: 5G核心网查户口：NRF排障记 -->

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

## 目录

- 一、从“拉专线”到“查户口”：SBA改了什么
- 二、NFProfile：户口簿上每一栏都可能埋雷
- 三、案例：割接后2小时47分的“隐形断网”
- 四、追凶：三条时间线对出来的真相
- 五、修复与复盘：两处伤，一处理
- 六、给同行的工具箱与清单
- 七、结语

## 一、从“拉专线”到“查户口”：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清单里多了“活口”。

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

```mermaid
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的预案库里：

```mermaid
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定义）](https://www.etsi.org/deliver/etsi_ts/129500_129599/129510/) — 本文NRF注册/发现/有效期机制的规范依据
2. [3GPP TS 23.501（ETSI TS 123 501）— 5G系统架构（NF与NF服务的发现与选择）](https://www.etsi.org/deliver/etsi_ts/123500_123599/123501/) — SBA总体架构与AMF选择SMF的原则
3. [3GPP TS 24.501（ETSI TS 124 501）— NAS协议（5GSM原因值定义）](https://www.etsi.org/deliver/etsi_ts/124500_124599/124501/) — 会话拒绝原因值（如#27）的官方定义
4. [Open5GS开源项目仓库](https://github.com/open5gs/open5gs) — 可本地复现NRF注册/发现全流程的开源5G核心网实现
5. [Wireshark官方文档](https://www.wireshark.org/docs/) — 新版本内置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学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
