深度解析 3GPP TS 29.531:6.1 Nnssf_NSSelection Service API (请求-响应式API详解)
本文技术原理深度参考了3GPP TS 29.531 V18.8.0 (2024-09) Release 18规范中,关于“Chapter 6.1 Nnssf_NSSelection Service API”的核心章节。本文旨在将NSSF的“按需查询”服务从功能概念,转化为开发者可以理解和实现的精确API接口定义。
在前面的章节中,我们已经站在“产品经理”和“架构师”的视角,理解了NSSF的定位(是什么)、职责(做什么)以及两大核心服务(功能模型)。我们知道了NSSF有一个名为Nnssf_NSSelection的“问询处”,AMF等客户可以随时前来咨询切片相关的问题。
现在,我们将转换角色,戴上“软件开发工程师”的帽子。我们的任务,是要在公司的AMF产品中,实现与NSSF的通信功能。此时,我们最关心的不再是宏大的架构,而是具体的技术细节:
- 我们应该向哪个URL地址发送请求?
- 我们应该使用什么通信协议和数据格式?
- 请求中应该携带哪些参数?每个参数的精确含义和格式是什么?
- NSSF会返回什么样的数据?我们又该如何解析?
所有这些问题的答案,都写在了规范的第六章“API Definitions”中。本篇文章,我们将聚焦于第6.1节,对Nnssf_NSSelection服务的API进行一次像素级的拆解。我们将和主角小杰公司的开发团队一起,逐一攻克API URI、HTTP用法、资源模型和数据结构,将抽象的服务真正落地为可执行的代码逻辑。
1. API的“门牌号”:API URI (Clause 6.1.1)
要与NSSF通信,首先得知道它的“地址”。6.1.1章节就定义了Nnssf_NSSelection服务API的统一资源标识符(URI)结构。
规范原文引用 (Clause 6.1.1 API URI):
The Nnssf_NSSelection service shall use the Nnssf_NSSelection API. The API URI of the Nnssf_NSSelection API shall be:
{apiRoot}/<apiName>/<apiVersion>The request URIs used in HTTP requests from the NF service consumer towards the NF service producer shall have the Resource URI structure defined in clause 4.4.1 of 3GPP TS 29.501, i.e.:
{apiRoot}/<apiName>/<apiVersion>/<apiSpecificResourceUriPart>with the following components:
- The
{apiRoot}shall be set as described in 3GPP TS 29.501.- The
<apiName>shall be “nnssf-nsselection”.- The
<apiVersion>shall be “v2”.- The
<apiSpecificResourceUriPart>shall be set as described in clause 6.1.3.
这段定义虽然简短,但为开发者提供了清晰的URL构建指南。让我们来解读这个“地址”的构成:
| URI组件 | 规范定义 | 解读与开发者视角 |
|---|---|---|
| {apiRoot} | See 3GPP TS 29.501 | 这是API的根路径,代表了NF服务消费者访问NF服务生产者的入口点。在实际部署中,它通常被配置为服务通信代理(SCP)的地址,或者是NRF服务发现后返回的NSSF实例的访问地址。例如,AMF的配置文件中会有类似api_root: https://scp.my-operator.com的配置。 |
"nnssf-nsselection" | 这是API的名称,是固定字符串。它清晰地表明了这个API是用于NSSF的网络切片选择服务。 | |
"v2" | 这是API的版本号。规范的版本在演进,API也会随之迭代。明确的版本号(如v2)确保了向后兼容性和接口的稳定性。开发者在构建URL时必须使用这个指定的版本。 | |
See clause 6.1.3 | 这是API特定的资源路径。对于Nnssf_NSSelection服务,我们稍后会在6.1.3节看到,这个部分就是/network-slice-information。 |
场景:开发者的第一次URL构建
小杰团队的开发者小李,他的任务是在AMF代码中实现向NSSF发起请求的功能。他根据规范,会这样构建最终的请求URL:
- 从AMF的配置中读取
apiRoot,例如https://core.5g.operator.com:8080。 - 拼接上固定的
apiName:nnssf-nsselection。 - 拼接上固定的
apiVersion:v2。 - 拼接上稍后将在6.1.3节学到的
apiSpecificResourceUriPart:/network-slice-information。
最终,小李在代码中构建出的完整请求URL将是:
https://core.5g.operator.com:8080/nnssf-nsselection/v2/network-slice-information
这个精确、标准化的URI,就是AMF通往NSSF决策大门的唯一路径。
2. “沟通”的规则:Usage of HTTP (Clause 6.1.2)
知道了地址,下一步就是确定沟通的“语言”和“礼仪”。6.1.2章节规定了API在HTTP协议层面的使用规则。
规范原文引用 (Clause 6.1.2.1 General):
HTTP/2, IETF RFC 9113, shall be used as specified in clause 5 of 3GPP TS 29.500.
规范原文引用 (Clause 6.1.2.2.2 Content type):
The following content types shall be supported:
- JSON, as defined in IETF RFC 8259, shall be used as content type of the HTTP bodies…
- The Problem Details JSON Object (IETF RFC 9457)… shall be signalled by the content type “application/problem+json”.
规范原文引用 (Clause 6.1.2.3.1 General):
In this release of this specification, no custom headers specific to the Nnssf_NSSelection service are defined.
这些规则共同定义了一个现代、高效、标准的RESTful API交互模式:
| HTTP特性 | 规范要求 | 对开发者的意义 |
|---|---|---|
| 协议版本 | HTTP/2 | 必须使用HTTP/2客户端库。相比HTTP/1.1,HTTP/2通过头部压缩、多路复用等技术,提供了更高的性能和更低的时延,非常适合核心网内部NF间频繁、低时延的信令交互。 |
| 数据格式 | JSON (JavaScript Object Notation) | 所有请求体和响应体的数据都必须是JSON格式。这是一种轻量级、易于人类阅读和机器解析的数据交换格式,是现代Web API的事实标准。 |
| 错误格式 | Problem Details JSON Object (application/problem+json) | 当发生应用层错误时(如请求的切片不被支持),NSSF不能只返回一个简单的状态码如403。它必须返回一个遵循RFC 9457标准的JSON对象,其中包含type, title, detail, cause等字段,为客户端提供了结构化的、详细的错误信息,极大地便利了错误处理和问题定位。 |
| 自定义头 | 无 | Nnssf_NSSelection API本身没有定义特殊的HTTP头部。所有需要的头部(如Authorization用于安全认证)都遵循3GPP TS 29.500中定义的通用规则,这简化了API的设计。 |
场景:小李的代码实现
小李在选择HTTP客户端库时,会确保它完全支持HTTP/2。在编写代码时,他会:
- 设置请求的
Content-Type和Accept头部为application/json。 - 编写一个统一的错误处理逻辑,该逻辑专门解析
application/problem+json格式的响应体,可以根据返回的cause值(如SNSSAI_NOT_SUPPORTED)执行不同的处理分支。
3. 唯一的“问询台”:Resources (Clause 6.1.3)
在RESTful API设计中,“资源”是核心概念,代表了可以操作的数据实体。令人惊讶的是,对于功能如此重要的Nnssf_NSSelection服务,规范只定义了一个资源。
3.1 资源概览 (Clause 6.1.3.1 Overview)
规范原文图重绘 (Figure 6.1.3.1-1: Resource URI structure of the nnssf_nsselection API)
//{apiRoot}/nnssf-nsselection/<apiVersion> | |
| └─ /network-slice-information |
规范原文表重绘 (Table 6.1.3.1-1: Resources and methods overview)
| 资源名称 (Resource name) | 资源URI (Resource URI) | HTTP方法 (HTTP method) | 描述 (Description) |
|---|---|---|---|
| Network Slice Information | /network-slice-information | GET | To retrieve network slice information. (用于检索网络切片信息。) |
这清晰地表明,所有与Nnssf_NSSelection服务相关的查询,无论场景多么复杂,都汇聚到了对/network-slice-information这一个资源的GET请求上。这种“万流归一”的设计,其背后的灵活性完全依赖于GET请求的查询参数。
3.2 GET方法详解 (Clause 6.1.3.2.3.1 GET)
这里是6.1章的“心脏”地带,详细规定了GET请求的输入(查询参数)和输出(响应体)。
输入:Table 6.1.3.2.3.1-1: URI query parameters
这张表格是开发者实现AMF客户端时最重要的参考。它定义了所有可能用到的查询参数。
规范原文表重绘与深度解析 (Table 6.1.3.2.3.1-1)
| 参数名 (Name) | 数据类型 | P | Card. | 描述与场景解读 |
|---|---|---|---|---|
| nf-type | NFType | M | 1 | [我是谁] 强制携带。表明请求者的网络功能类型,如AMF。NSSF可能需要根据请求者类型应用不同的策略。 |
| nf-id | NfInstanceId | M | 1 | [我的ID] 强制携带。表明请求者的唯一实例ID。 |
| slice-info-request-for-registration | SliceInfoForRegistration | C | 0..1 | [注册场景] 在UE初始注册、移动性注册更新、4G到5G切换等流程中使用。这是一个复杂的JSON对象,里面打包了UE请求的切片、签约的切片等所有注册相关信息。 |
| slice-info-request-for-pdu-session | SliceInfoForPDUSession | C | 0..1 | [PDU会话场景] 在PDU会话建立流程中使用。包含请求的S-NSSAI、漫游指示等会话相关信息。 |
| slice-info-request-for-ue-cu | SliceInfoForUEConfigurationUpdate | C | 0..1 | [UE配置更新场景] 在UE配置更新流程中使用,用于网络侧发起的切片策略调整。 |
| slice-info-request-for-pdn-connection | array(Snssai) | C | 1..N | [4G/5G互通场景-PDN连接] 在EPC中的PDN连接建立流程中,用于获取VPLMN到HPLMN的S-NSSAI映射,需要RSIPCE特性支持。 |
| slice-info-request-for-other-purpose | array(Snssai) | C | 1..N | [其他场景] 一个通用的查询参数,例如供NWDAF查询S-NSSAI对应的NSI ID,需要SIOP特性支持。 |
| home-plmn-id | PlmnId | C | 0..1 | [漫游场景] 当UE是漫游用户时,必须携带其归属PLMN ID。 |
| tai | Tai | C | 0..1 | [你在哪] 携带UE当前所在的TAI。这是NSSF进行基于位置的切片可用性判断的核心依据。 |
| supported-features | SupportedFeatures | C | 0..1 | [特性协商] 用于客户端(如AMF)向NSSF表明自己支持哪些高级特性(如TargetNssai),以便NSSF返回更丰富的信息。 |
输出:Table 6.1.3.2.3.1-3: Data structures supported by the GET Response Body
这张表定义了NSSF的响应内容,是开发者解析响应的依据。
规范原文表重绘与深度解析 (Table 6.1.3.2.3.1-3)
| 数据类型 | P | Card. | HTTP状态码 | 描述与处理逻辑 |
|---|---|---|---|---|
| AuthorizedNetworkSliceInfo | M | 1 | 200 OK | [成功] 这是最主要的成功响应。响应体是一个复杂的AuthorizedNetworkSliceInfo对象,包含了NSSF的完整决策结果(允许的切片、拒绝的切片、重定向信息等)。开发者需要编写详细的解析逻辑来处理这个对象。 |
| RedirectResponse | O | 0..1 | 307 Temporary Redirect | [临时重定向] 表示请求的资源临时被移动到了新的URI。响应的Location头会包含新的地址。这通常由SCP(服务通信代理)或NSSF自身实现,用于NF实例间的负载均衡或维护。客户端收到后应向新地址重新发起请求。 |
| RedirectResponse | O | 0..1 | 308 Permanent Redirect | [永久重定向] 类似于307,但表示资源已永久移动。客户端收到后,除了重发请求,还应更新本地的地址记录。 |
| ProblemDetails | O | 0..1 | 403 Forbidden | [失败-禁止访问] 表示请求因权限或策略原因被拒绝。响应体是ProblemDetails对象,其cause字段会进一步说明原因,如:- SNSSAI_NOT_SUPPORTED: 请求的切片不被支持。- NOT_AUTHORIZED: 请求的NF没有权限执行此操作。 |
4. “沟通”的语言:Data Model (Clause 6.1.6)
前面我们多次提到了AuthorizedNetworkSliceInfo等复杂的数据类型,6.1.6章节就是这些“词汇”的“字典”,详细定义了API中用到的所有数据结构。
4.1 核心数据结构:AuthorizedNetworkSliceInfo
这是Nnssf_NSSelection服务最重要的“产出物”,是NSSF智慧的结晶。
规范原文表重绘与深度解析 (Table 6.1.6.2.2-1: Definition of type AuthorizedNetworkSliceInfo)
| 属性名 (Attribute name) | 数据类型 | P | Card. | 解读与开发者视角 |
|---|---|---|---|---|
allowedNssaiList | array(AllowedNssai) | C | 1..N | [通行证列表] NSSF最终批准UE使用的切片列表。开发者需要遍历此列表,为UE配置网络资源。 |
configuredNssai | array(ConfiguredSnssai) | C | 1..N | [推荐菜单] 当UE没有明确请求或请求无效时,NSSF提供的默认配置。 |
targetAmfSet | string | O | 0..1 | [指令:转移到那个区域] 一个字符串,标识了目标AMF Set。如果出现此字段,AMF必须启动向该目标AMF Set的重定向流程。 |
candidateAmfList | array(NfInstanceId) | O | 1..N | [建议:这些AMF你看着办] 候选AMF实例列表。如果出现此字段,AMF可以从列表中选择一个进行AMF重定向或切换。 |
rejectedNssaiInPlmn | array(Snssai) | O | 1..N | [全局黑名单] 被整个PLMN拒绝的切片列表。AMF收到后,就知道在当前PLMN内都不应再为这些切片请求资源。 |
rejectedNssaiInTa | array(Snssai) | O | 1..N | [局部黑名单] 仅在当前TA被拒绝的切片列表。UE移动到其他TA后,这些切片可能变为可用。 |
nsiInformation | NsiInformation | C | 0..1 | [SMF发现指南] 包含用于发现SMF的NRF的URI,以及可选的NSI ID。这是PDU会话建立流程的关键输出。 |
nrfAmfSet / nrfAmfSetNfMgtUri … | Uri / map(boolean) | O | 0..1 | [AMF发现指南] 当NSSF建议AMF重定向时,会提供用于发现目标AMF的NRF的相关信息,包括其地址和是否需要OAuth2认证。 |
targetNssai | array(Snssai) | O | 1..N | [目标网络配置] 在UE配置更新流程中,NSSF指示UE应该切换到的目标网络切片(通常与特定频段绑定)。 |
mappingOfNssai | array(MappingOfSnssai) | C | 1..N | [漫游翻译词典] 在漫游场景下,提供VPLMN S-NSSAI到HPLMN S-NSSAI的映射关系。 |
5. 总结:一个API,支撑万千场景
通过对Nnssf_NSSelection Service API的深度解剖,我们深刻地理解了3GPP服务化接口设计的精髓。它并没有为每一种场景设计一个独立的API,而是通过一个高度统一、参数驱动的GET API,优雅地支撑了注册、会话建立、移动性管理、网络优化、漫游互通等多种复杂流程。
对于开发者而言,TS 29.531的第6.1节就是一份详尽的“开发说明书”。它清晰地规定了:
- 去哪里 (URI)
- 怎么说 (HTTP/JSON)
- 说什么 (Query Parameters)
- 听什么 (Response Bodies)
小杰公司的开发团队,在小李的带领下,依据这份“说明书”,成功地在AMF产品中实现了与NSSF的交互逻辑。现在,他们的AMF已经具备了在复杂的网络环境中,为“智勘-T1”这样的高级终端,实时获取精准切片策略的能力。
但这只是故事的一半。一个真正智能的AMF,还需要具备感知网络动态变化的能力。在下一篇文章中,我们将深入6.2节,探索Nnssf_NSSAIAvailability Service API,看看开发者是如何实现“订阅新闻”和接收“头条推送”功能的。
FAQ环节
Q1:为什么API版本是”v2”而不是”v1”?“v1”去哪里了?
A1:在3GPP规范的演进过程中,API会不断迭代和优化。通常,早期的Release(如Rel-15)中可能会定义v1版本的API。随着新功能(如NSAG、切片替换等)的加入和对API设计的优化,规范会引入新的、功能更强大的v2版本。新版本的规范(如本文参考的Rel-18)会指定使用最新的稳定版本(即v2),而v1的相关定义可能会被废弃或保留用于后向兼容。对于新的开发,应始终遵循当前规范指定的最新版本。
Q2:targetAmfSet和candidateAmfList在功能上有什么区别?为什么需要两种AMF重定向机制?
A2:它们提供了不同粒度的控制。
targetAmfSet是一个更强硬、更宏观的指令。它告诉AMF:“你不用管具体哪个实例,把这个UE整个交接到ID为XXX的AMF Set去就行了”。这适用于基于区域或切片归属的粗粒度重定向。candidateAmfList是一个更灵活、更微观的建议。它告诉AMF:“我已经帮你筛选出了这几个可用的AMF实例,具体用哪个,你自己根据负载或其他策略决定吧”。这给了当前AMF更大的自主权。 提供两种机制是为了适应不同的网络策略和部署场景,增加了网络的灵活性。
Q3:NSSF返回403 Forbidden和200 OK但在rejectedNssaiInTa中包含我请求的切片,这两种情况有什么区别?
A3:这是一个很好的细节问题,区别在于拒绝的范围和UE的注册状态。
- 返回
403 Forbidden(cause: SNSSAI_NOT_SUPPORTED):通常意味着UE请求的所有切片都不可用,并且网络中也没有可为其分配的默认切片。这是一种比较彻底的“拒绝”。AMF可能会因此只完成UE的移动性注册,但不为其建立任何PDU会话或分配任何切片资源。 - 返回
200 OK,但rejectedNssaiInTa包含部分切片:这是一种“部分成功”。它表示UE的注册是成功的,并且NSSF至少为UE批准了一个或多个切片(在allowedNssaiList中),但同时明确告知AMF,你请求的另外一些切片,只是在当前这个TA不可用。这为AMF和UE提供了更精细的信息,UE移动到其他TA后,这些被拒绝的切片可能就变得可用了。
Q4:作为一个AMF开发者,我需要完整实现Table 6.1.3.2.3.1-1中所有的查询参数吗?
A4:这取决于你的产品需要支持的3GPP特性。
- 基础功能:
nf-type,nf-id,slice-info-request-for-registration,tai是实现最基本的UE注册流程所必需的。 - 会话管理: 如果你的AMF需要处理PDU会话建立,那么
slice-info-request-for-pdu-session(或其等效参数)也必须支持。 - 高级特性: 如果你的产品宣称支持漫游、4G/5G互通(RSIPCE)、特性协商等,那么
home-plmn-id,slice-info-request-for-pdn-connection,supported-features等相应的参数就必须实现。 通常,产品会根据其市场定位和支持的Release版本,分阶段实现这些参数。
Q5:Problem Details JSON对象具体是什么样的?能给个例子吗?
A5:当然。假设AMF为“智勘-T1”请求了一个S-NSSAI {SST:10, SD:100},但这个切片在园区网络中并不存在。NSSF会返回403 Forbidden状态码,其响应体(Content-Type: application/problem+json)可能如下所示:
{
"type": "urn:3gpp:problem-details:nssf-nsselection:snssai-not-supported",
"title": "SNSSAI not supported",
"status": 403,
"detail": "The requested S-NSSAI(s) are not supported or not available in the current PLMN or TA.",
"cause": "SNSSAI_NOT_SUPPORTED"
}这个结构化的错误信息,使得AMF的错误处理代码可以非常清晰和健壮,而不是去猜测一个模糊的403状态码背后到底发生了什么。