OmniNSSF 操作指南
概述
OmniNSSF 实现了 5G 核心的网络切片选择功能 (NSSF)。它提供了两个 SBI 服务:Nnssf_NSSelection (TS 29.531),用于回答 AMF 关于 UE 可以使用哪些网络切片的查询,以及 Nnssf_NSSAIAvailability (TS 29.531),用于接受来自 AMF 的 NSSAI 可用性报告并管理对可用性变化通知的订阅。
切片配置 — S-NSSAIs 到 NRF URIs 的映射、每个 PLMN 允许的 NSSAI 和 AMF 集分配 — 在启动时从应用程序配置加载。AMF 报告的 NSSAI 可用性状态在 Agent 中保持处理。可用性变化通知作为火并忘的 HTTP POST 调用发送给订阅者。
架构
3GPP 角色和规范参考
| 规范 | 相关性 |
|---|---|
| TS 23.501 | 系统架构 — NSSF 角色、网络切片概念、S-NSSAI 定义 (第 5.15 节) |
| TS 23.502 | 程序 — 注册期间的切片选择 (4.2.3.2)、PDU 会话建立 (4.3.2) |
| TS 29.531 | Nnssf_NSSelection 和 Nnssf_NSSAIAvailability APIs |
| TS 23.003 | S-NSSAI 结构 (SST, SD)、NSI 定义 |
SBI 端点
所有端点均在基本 URL {sbi_scheme}://{sbi_addr}:{sbi_port} 下提供。
| 方法 | 路径 | 服务 | 描述 | 规范 |
|---|---|---|---|---|
| GET | /nnssf-nsselection/v2/network-slice-information | Nnssf_NSSelection | 检索 UE 的授权网络切片信息 | TS 29.531 5.2.1 |
| PUT | /nnssf-nssaiavailability/v1/nssai-availability/{nfId} | Nnssf_NSSAIAvailability | 报告或替换 AMF 的 NSSAI 可用性 | TS 29.531 5.2.2.2 |
| DELETE | /nnssf-nssaiavailability/v1/nssai-availability/{nfId} | Nnssf_NSSAIAvailability | 删除 AMF 的 NSSAI 可用性记录 | TS 29.531 5.2.2.4 |
| POST | /nnssf-nssaiavailability/v1/nssai-availability/subscriptions | Nnssf_NSSAIAvailability | 订阅 NSSAI 可用性变化通知 | TS 29.531 5.2.2.3 |
| DELETE | /nnssf-nssaiavailability/v1/nssai-availability/subscriptions/{subscriptionId} | Nnssf_NSSAIAvailability | 取消 NSSAI 可用性订阅 | TS 29.531 5.2.2.5 |
请求 / 响应摘要
GET network-slice-information — 必需查询参数:nf-id,nf-type。可选:slice-info-request-for-registration,slice-info-request-for-pdu-session,snssai,tai,home-plmn-id,supported-features。返回 200 OK 和 AuthorizedNetworkSliceInfo。
PUT nssai-availability/{nfId} — 请求体:NssaiAvailabilityInfo(必须包含 supportedSnssaiList 或 supportedNssaiAvailabilityData)。返回 200 OK 和 AuthorizedNssaiAvailabilityInfo。触发对所有当前订阅者的通知。
POST subscriptions — 请求体:NssaiAvailabilitySubscription(必须包含 nfNssaiAvailabilityUri)。返回 201 Created 和订阅对象及 Location 头。
配置参考
配置从应用程序环境键 :omnissf 中读取。
config :omnissf,
sbi_scheme: "http",
sbi_addr: "127.0.0.14",
sbi_port: 7777,
nrf_uri: "http://127.0.0.10:7777",
mcc: "999",
mnc: "70",
heartbeat_interval: 10_000,
nsi_list: [
%{
s_nssai: %{sst: 1, sd: "0x000001"},
nrf_uri: "http://127.0.0.10:7777",
nsi_id: "1"
}
],
allowed_nssai: %{
"999-70" => [
%{sst: 1, sd: "0x000001"}
]
},
amf_set_mapping: %{
"1-0x000001" => ["1"]
},
configured_nssai: %{}
基本参数表
| 参数 | 类型 | 默认值 | 描述 |
|---|---|---|---|
sbi_scheme | 字符串 | "http" | SBI 监听套接字的 HTTP 协议 (http 或 https) |
sbi_addr | 字符串 | "127.0.0.14" | SBI HTTP 服务器绑定的 IP 地址 |
sbi_port | 整数 | 7777 | SBI HTTP 服务器监听的 TCP 端口 |
nrf_uri | 字符串 | "http://127.0.0.10:7777" | NRF 的基本 URI。仅用于 NF 注册和心跳 |
mcc | 字符串 | "999" | 归属 PLMN 的移动国家代码。作为 home-plmn-id 在选择查询中缺失时的后备 PLMN 键 |
mnc | 字符串 | "70" | 归属 PLMN 的移动网络代码 |
heartbeat_interval | 整数 (毫秒) | 10000 | NRF 心跳请求之间的间隔(毫秒) |
切片配置参数
nsi_list
网络切片实例 (NSI) 条目的列表。每个条目将 S-NSSAI 绑定到 NRF URI。当 NSSF 接收到切片选择查询时,它会在此列表中查找请求的 S-NSSAI,并在响应的 nsiInformation 字段中返回关联的 NRF URI。
| 字段 | 类型 | 描述 |
|---|---|---|
s_nssai.sst | 整数 | 切片/服务类型 (1–255)。标准值:1=eMBB,2=URLLC,3=MIoT (TS 23.501 表 5.15.2.2-1) |
s_nssai.sd | 字符串或 nil | 切片区分符,作为十六进制字符串 (例如,"0x000001")。nil 或缺失匹配给定 SST 的任何 SD (见 NSSF-L5) |
nrf_uri | 字符串 | 负责在此切片实例内进行 NF 发现的 NRF 的基本 URI |
nsi_id | 字符串 | 此 NSI 的不透明标识符,包含在 nsiInformation 响应中 |
如果没有 nsi_list 条目与请求的 S-NSSAI 匹配,NSSF 将返回 403 Forbidden,原因是 SNSSAI_NOT_FOUND。
allowed_nssai
从 PLMN 键 ("{mcc}-{mnc}") 到 S-NSSAI 结构列表的映射。控制哪些切片包含在选择响应的 allowedNssaiList 字段中。如果请求的 PLMN 没有条目,则使用归属 PLMN 的允许 NSSAI 作为后备。
列表中的每个 S-NSSAI:
| 字段 | 类型 | 描述 |
|---|---|---|
sst | 整数 | 切片/服务类型 |
sd | 字符串或 nil | 切片区分符 |
amf_set_mapping
从 S-NSSAI 键 ("{sst}-{sd}" 或 "{sst}" 当没有 SD 时) 到 AMF 集 ID 字符串列表的映射。当填充时,NSSF 在选择响应中将第一个条目包含为 targetAmfSet(请参见限制 NSSF-L3 — candidateAmfList 未填充)。
configured_nssai
从 S-NSSAI 键到漫游场景的配置 NSSAI 结构的映射。当给定 S-NSSAI 存在时,NSSF 在选择响应中包含 configuredNssai。默认情况下为空。
关键程序
网络切片选择 — 注册 (TS 23.502 第 4.2.3.2 节)
网络切片选择 — PDU 会话 (TS 23.502 第 4.3.2 节)
NSSAI 可用性报告 (TS 29.531 第 5.2.2 节)
NSSAI 可用性订阅 / 通知
S-NSSAI 查找逻辑
NSSF 根据以下规则将请求的 S-NSSAI 与 nsi_list 进行匹配:
- SST 必须完全匹配。
- SD 匹配:如果
nsi_list条目具有sd: nil,则它匹配该 SST 的任何请求 SD(通配符)。如果条目具有特定 SD,则在十六进制规范化后进行不区分大小写的比较。
这意味着具有 sd: nil 的 nsi_list 条目充当其 SST 值的捕获。有关此行为的操作影响,请参见限制 NSSF-L5。
Prometheus 指标
NSSF 指标
| 指标 | 类型 | 标签 | 描述 |
|---|---|---|---|
omni_nssf.nsselection.requests.count | 计数器 | result, nf_type | NS 选择请求 |
omni_nssf.nssai_availability.update.count | 计数器 | nf_id | NSSAI 可用性更新 |
omni_nssf.nssai_availability.delete.count | 计数器 | nf_id | NSSAI 可用性删除 |
omni_nssf.nssai_availability.subscribe.count | 计数器 | -- | 可用性订阅 |
omni_nssf.nssai_availability.unsubscribe.count | 计数器 | -- | 可用性退订 |
omni_nssf.ns_selection_requests.total | 计数器 | result | 总网络切片选择请求 |
omni_nssf.nssai_availability_updates.total | 计数器 | -- | 总 NSSAI 可用性更新通知 |
omni_nssf.nrf.registration.status | 计量器 | nf_type | NRF 注册状态 (1=已注册, 0=未注册) |
BEAM VM 指标
| 指标 | 类型 | 描述 |
|---|---|---|
beam.memory.total | 计量器 | BEAM 总内存(字节) |
beam.memory.processes | 计量器 | Erlang 进程使用的内存 |
beam.memory.processes_used | 计量器 | 进程实际使用的内存 |
beam.memory.system | 计量器 | 系统内存 |
beam.memory.atom | 计量器 | 总原子内存 |
beam.memory.atom_used | 计量器 | 使用的原子内存 |
beam.memory.binary | 计量器 | 二进制内存 |
beam.memory.code | 计量器 | 代码内存 |
beam.memory.ets | 计量器 | ETS 表内存 |
beam.processes.count | 计量器 | Erlang 进程数量 |
beam.ports.count | 计量器 | Erlang 端口数量 |
beam.atom.count | 计量器 | 原子数量 |
beam.vm.uptime | 计量器 | VM 运行时间(秒) |
已知限制
| ID | 领域 | 描述 |
|---|---|---|
| NSSF-M2 | NSSAI 可用性 PATCH | 没有 PATCH /nnssf-nssaiavailability/v1/nssai-availability/{nfId} 端点。对 AMF 可用性数据的部分更新不受支持;必须使用 PUT 替换完整记录。 |
| NSSF-M3 | 可用性授权 | NSSF 对报告的 NSSAI 可用性的授权是直通的。PUT 响应中的 authorizedNssaiAvailabilityData 与提交的 supportedNssaiAvailabilityData 相同。NSSF 不会交叉检查报告的 S-NSSAIs 与配置的 nsi_list。 |
| NSSF-L1 | 支持的功能 | 接受 supported-features 查询参数但不处理。AMF 和 NSSF 之间不进行能力协商。 |
| NSSF-L2 | 被拒绝的 NSSAI | AuthorizedNetworkSliceInfo 响应不包括 rejectedNssaiInRa(在注册区域被拒绝)或 rejectedNssaiInTa(在跟踪区域被拒绝)字段。请求的 S-NSSAI 在特定 TA 中不可用的 UE 将不会收到明确的拒绝信息。 |
| NSSF-L3 | 候选 AMF 列表 | 选择响应中未填充 candidateAmfList 字段。仅在适用时包含 targetAmfSet(来自 amf_set_mapping 的第一个条目)。未提供 TS 29.531 的完整 AMF 选择协助。 |
| NSSF-L4 | 订阅 PATCH | 没有 PATCH /nnssf-nssaiavailability/v1/nssai-availability/subscriptions/{subscriptionId} 端点。创建后无法更新订阅参数;必须删除并重新创建订阅。 |
| NSSF-L5 | SD 通配符匹配 | nsi_list 条目具有 s_nssai.sd: nil 匹配给定 SST 的任何 SD,而不仅仅是没有 SD 的请求。这意味着通配符条目也将匹配显式 SD 请求。如果多个切片共享一个 SST 但通过 SD 区分,则每个切片必须在 nsi_list 中具有自己的显式 SD 条目,并在任何通配符条目之前排序(第一个匹配胜出)。 |
故障排除
切片选择返回 403 SNSSAI_NOT_FOUND
nsi_list 中没有条目与请求的 S-NSSAI 匹配。请验证:
- 请求中的 SST 精确匹配
nsi_list条目(整数比较)。 - 请求中的 SD 与条目的 SD 匹配,或者条目具有
sd: nil(通配符)。 - 在更改后重新加载了
nsi_list配置 — OmniNSSF 仅在启动时从应用程序环境读取nsi_list。需要重启以获取更改。
NSSF 日志将显示 NSSelection: Cannot find NSI for S-NSSAI [SST:{sst} SD:{sd}]。
切片选择返回 400 MANDATORY_QUERY_PARAM_MISSING
请求中缺少 nf-id 或 nf-type 查询参数。根据 TS 29.531,这两个参数都是必需的。请验证 AMF 是否在其选择请求中包含这些参数。
选择响应中缺少允许的 NSSAI
仅在可以从请��中确定 PLMN 键时,响应中才包含 allowedNssaiList 字段。PLMN 键是从 home-plmn-id 查询参数派生的,或者回退到 NSSF 自身的 MCC/MNC (mcc/mnc 配置)。如果两者都无法解析,则省略该字段。请验证:
mcc和mnc为归属 PLMN 正确配置。allowed_nssai映射包含键"{mcc}-{mnc}"的条目。
基于 TAI 的过滤移除了所有允许的 NSSAI
当提供 tai 参数且没有 AMF 通过 PUT 报告可用性数据时,NSSF 默认允许所有配置的 NSSAIs(空可用性映射 = 无限制)。一旦任何 AMF 报告可用性,仅返回在该可用性数据中匹配 TAI 条目的 S-NSSAIs。如果查询中的 TAI 在任何 AMF 报告的 supportedNssaiAvailabilityData 中未出现,则所有 NSSAIs 将被过滤掉。要诊断,请检查 AMF 是否提交了 PUT 请求,以及这些报告中的 TAC 是否与查询中的 TAC 匹配。
SD 通配符导致选择错误的 NSI
如果 nsi_list 条目具有 sd: nil 列在更具体的条目之前,它将首先匹配任何 SST 请求,而不考虑 SD。确保具体的 SD 条目在 nsi_list 中出现在通配符条目之前。请参见限制 NSSF-L5。
订阅者未收到可用性通知
通知是异步发送的(火并忘),在生成的任务中。交付失败将记录为警告,但不会���试。请验证:
- 订阅中的
nfNssaiAvailabilityUri从 NSSF 主机可达。 - 订阅者 NF 在该 URI 接受 POST 请求并返回 2xx 响应。
失败的通知尝试记录为 NSSAIAvailability: notification to {uri} failed: {reason}。
AMF 重启后可用性或订阅状态过时
NSSAI 可用性记录和订阅存储在进程中,并不是持久的。它们仅在 Erlang VM 的生命周期内存活。如果 AMF 重启并未通过 PUT 重新注册其可用性,NSSF 将继续为该 AMF 的 NF ID 提供过时(或缺失)的可用性数据。AMF 应在重新连接时重新提交其 NSSAI 可用性。同样,在 NSSF 重启之前创建的订阅必须由订阅者重新创建。
日志关联
NSSAI 选择日志行以 NSSelection: 为前缀,并包含请求的 nf-id。NSSAI 可用性日志行以 NSSAIAvailability: 为前缀,并包含 nfId。订阅通知尝试记录回调 URI。使用 nf-id 值将选择请求与来自同一 AMF 的可用性更新关联。