为什么BSF服务注册如此重要?
在5GC服务化架构下,任何NF(Network Function)想要对外提供服务,都必须经历以下三步:
-
注册(Register):向NRF注册自己的NF Profile,包括NF类型、实例ID、支持的服务列表、IP地址/端口等;
-
被发现(Discover):其他NF通过NRF查询发现该NF;
-
被调用(Invoke):其他NF根据发现结果直接调用该NF的服务。
如果BSF没有成功向NRF注册,那么PCF和AF就永远无法找到BSF,整个PCC架构中的会话绑定机制将无法工作,基于应用层的策略控制(如针对特定应用的QoS保障)将完全失效。
BSF提供的核心服务
BSF在NRF中注册的服务名称为 nbsf_management(即Nbsf_Management服务),该服务主要提供以下能力:
BSF还在注册时上报自己服务的IP地址段信息(bsfInfo),包括IPv4地址范围和IPv6前缀范围,用于NRF在服务发现时进行精确匹配。
详细消息流程图
sequenceDiagram
participant BSF
participant NRF
Note over BSF, NRF: BSF服务启动,向NRF发起注册
BSF->>NRF: PUT /nnrf-nfm/v1/nf-instances/{nfInstanceID}
Note right of BSF: 请求体携带NFProfile:
Note right of BSF: nfInstanceID
Note right of BSF: nfType: BSF
Note right of BSF: nfStatus: REGISTERED
Note right of BSF: serviceName: nbsf_management
Note right of BSF: bsfInfo: ipv4/ipv6地址段
NRF-->>BSF: 201 Created
Note left of NRF: 响应体含NFRegistrationData:
Note left of NRF: NFProfile (已注册实例)
Note left of NRF: heartBeatTimer
Note left of NRF: Location头域
flowchart LR
A["BSF服务启动"] --> B["构造NFProfile"]
B --> C["PUT /nnrf-nfm/v1/nf-instances/nfInstanceID"]
C --> D["NRF校验并存储NFProfile"]
D --> E["NRF返回201 Created + heartBeatTimer"]
E --> F["BSF注册成功,进入心跳维持阶段"]
style A fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
style F fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
测试目的
验证NRF支持BSF发起的服务注册流程,确保BSF能够成功将其NFProfile(包括NF实例标识、NF类型、支持的服务、IP地址端口、服务的IP地址段等信息)注册到NRF中。
测试前置条件
-
SA网络中BSF和NRF网元系统及操作维护台运行正常。
-
BSF已配置NRF的地址,且已配置为用户分配的IP地址段(包括IPv4和IPv6地址段)。
-
服务化接口的信令监控、抓包分析工具准备就绪。
测试步骤
-
在BSF和NRF之间启动消息跟踪/抓包操作。
-
启动BSF服务。
-
观察BSF和NRF之间的消息交互。
-
在NRF上查看BSF服务注册情况。
测试结果验证(预期)
-
检查在NRF中BSF服务注册成功。
-
检查BSF服务注册流程成功。对HTTP消息检查如下:
消息1(BSF -> NRF,PUT请求)检查项:
PUT消息的URI: {apiRoot}/nnrf-nfm/v1/nf-instances/{nfInstanceID},其中apiRoot和nfInstanceID与实际配置一致
| NFProfile.nfInstanceID |
与实际配置保持一致 |
| NFProfile.nfType |
BSF |
| NFProfile.nfStatus |
REGISTERED |
| NFProfile.serviceInstanceID |
与实际配置保持一致 |
| NFProfile.serviceName |
nbsf_management |
| NFProfile.version |
与实际配置保持一致 |
| NFProfile.schema |
http |
| NFProfile.ipEndPoints |
nbsf_management的服务IP和Port |
| NFProfile.bsfInfo.ipv4AddressRanges |
提供服务的IPv4地址段 |
| NFProfile.bsfInfo.ipv6PrefixRanges |
提供服务的IPv6地址段 |
消息2(NRF -> BSF,响应)检查项:
| 检查项 |
预期结果 |
| statusCode |
201 Created |
| 头域 |
包含Location |
| Body |
包含NFRegistrationData,其中NFProfile为注册的网元实例 |
2 BSF服务注册信令深度解析
在本测试中,BSF与NRF的交互涉及5GC服务化架构中最核心的NF管理流程。BSF通过HTTP PUT方法将自身的完整NFProfile推送给NRF,NRF校验后存储并返回注册成功的响应。
(注:为保护网络安全,以下log中的网元IP、NF Instance ID等敏感信息已做严格脱敏处理)
2.1 BSF向NRF发送注册请求(Nnrf_NFManagement_NFRegister)
BSF启动后,首先构造自身的NFProfile,然后通过HTTP PUT方法向NRF发起注册请求。PUT方法的URI中包含BSF的NF Instance ID,NRF通过此ID唯一标识该BSF实例。
sequenceDiagram
participant BSF
participant NRF
Note over BSF, NRF: Nnrf_NFManagement_NFRegister
BSF->>NRF: PUT /nnrf-nfm/v1/nf-instances/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Note right of BSF: 请求体(NFProfile):
Note right of BSF: nfInstanceID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Note right of BSF: nfType: BSF
Note right of BSF: nfStatus: REGISTERED
Note right of BSF: serviceName: nbsf_management
Note right of BSF: bsfInfo.ipv4AddressRanges: IP段信息
Note right of BSF: bsfInfo.ipv6PrefixRanges: IPv6前缀信息
NRF-->>NRF: 校验NFProfile合法性
NRF-->>NRF: 存储BSF的NFProfile到本地数据库
NRF-->>BSF: 201 Created
Note left of NRF: 响应头: Location: /nnrf-nfm/v1/nf-instances/XXX
Note left of NRF: 响应体: NFRegistrationData
Note left of NRF: 含NFProfile + heartBeatTimer
信令抓包解析:
# 1. BSF -> NRF(发起服务注册 PUT请求)
PUT /nnrf-nfm/v1/nf-instances/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Host: 10.XX.XX.XX:31380
Content-Type: application/json
JavaScript Object Notation: application/json
Object
# ===== NF基本信息 =====
Member Key: nfInstanceID
String value: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
# BSF的NF实例ID,UUID格式,全局唯一标识
Member Key: nfType
String value: "BSF"
# 网元类型,标识该NF为Binding Support Function
Member Key: nfStatus
String value: "REGISTERED"
# 注册状态:REGISTERED表示已注册
Member Key: serviceInstanceID
String value: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
# 服务实例ID
# ===== NF服务信息 =====
Member Key: nfServices
Array
Object
Member Key: serviceName
String value: "nbsf_management"
# BSF对外提供的核心服务名称
Member Key: versions
Array
Object
Member Key: apiVersion
String value: "v1"
# API版本号
Member Key: apiPrefix
String value: "/nbsf-management"
Member Key: scheme
String value: "http"
# 传输协议:HTTP
Member Key: ipEndPoints
Array
Object
Member Key: ipv4Address
String value: "10.XX.XX.XX"
# BSF服务的IP地址
Member Key: port
Number value: 8080
# BSF服务监听端口
# ===== BSF特有信息 =====
Member Key: bsfInfo
Object
Member Key: ipv4AddressRanges
Array
Object
Member Key: start
String value: "10.XX.0.0"
# IPv4地址段起始地址
Member Key: end
String value: "10.XX.255.255"
# IPv4地址段结束地址
Member Key: ipv6PrefixRanges
Array
Object
Member Key: start
String value: "2a01:172:253::0/64"
# IPv6前缀段起始
Member Key: end
String value: "2a01:172:253:ffff::0/64"
# IPv6前缀段结束
Member Key: dnnList
Array
String value: "internet"
# BSF支持的DNN列表
Member Key: ipDomainList
Array
String value: "default"
# IP域列表
关键NFProfile信元解读:
nfInstanceID |
NF实例标识 |
UUID格式,在NRF中唯一标识该BSF实例 |
nfType |
NF类型 |
固定为"BSF",用于服务发现时过滤 |
nfStatus |
注册状态 |
"REGISTERED"表示在线可用 |
serviceName |
服务名称 |
"nbsf_management"为BSF的核心服务 |
ipEndPoints |
服务端点 |
包含BSF的IP地址和端口号 |
bsfInfo.ipv4AddressRanges |
IPv4地址段 |
BSF负责服务的UE IP地址范围,用于绑定匹配 |
bsfInfo.ipv6PrefixRanges |
IPv6前缀范围 |
BSF负责服务的UE IPv6前缀范围 |
bsfInfo.dnnList |
DNN列表 |
BSF支持的数据网络名称列表 |
协议参考:根据3GPP TS 29.510 第6.1.6.2节,NF注册使用HTTP PUT方法,URI为{apiRoot}/nnrf-nfm/v1/nf-instances/{nfInstanceID}。NFProfile数据结构定义在TS 29.510的表6.1.6.2.3-1中,其中bsfInfo字段专属于BSF类型网元,定义在TS 29.551中。
2.2 NRF返回注册成功响应
NRF收到BSF的PUT请求后,会执行以下操作:
-
校验NFProfile:检查nfInstanceID、nfType、nfStatus等必填字段是否完整、合法;
-
存储NFProfile:将BSF的NFProfile存入NRF的本地数据库(NRF Repository);
-
返回响应:向BSF返回201 Created状态码,携带注册结果数据。
信令抓包解析:
# 2. NRF -> BSF(注册成功响应)
HTTP/1.1 201 Created
Location: http://10.XX.XX.XX:31380/nnrf-nfm/v1/nf-instances/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Content-Type: application/json
JavaScript Object Notation: application/json
Object
Member Key: nfProfile
Object
# 返回完整的已注册NFProfile
Member Key: nfInstanceID
String value: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Member Key: nfType
String value: "BSF"
Member Key: nfStatus
String value: "REGISTERED"
# ... 其余NFProfile字段与请求一致
Member Key: heartBeatTimer
Number value: 120
# 心跳定时器,单位:秒
# BSF需每隔120秒向NRF发送心跳,维持注册有效性
响应关键字段解读:
| 字段 |
取值 |
含义 |
| HTTP状态码 |
201 Created |
表示资源创建成功 |
| Location头域 |
/nnrf-nfm/v1/nf-instances/{nfInstanceID} |
指向刚创建的NF实例资源URI |
nfProfile |
完整NFProfile |
NRF确认存储的NF配置信息 |
heartBeatTimer |
120秒 |
心跳周期,BSF需按此时长周期性发送心跳 |
协议参考:根据3GPP TS 29.510 第6.1.6.2节,NRF收到有效的NF注册请求后,应返回201 Created状态码,并在响应体中包含NFRegistrationData。heartBeatTimer字段指示NRF期望的心跳周期,BSF必须遵守此周期,否则NRF将在超时后将该BSF标记为不可用。
2.3 【深度分析】BSF注册中的bsfInfo字段
bsfInfo是BSF注册时最独特的部分,也是区分BSF与其他NF的关键。它包含了BSF的"服务覆盖范围"信息:
bsfInfo的四个核心子字段:
ipv4AddressRanges |
array(Ipv4AddressRange) |
可选 |
BSF服务的IPv4地址段范围 |
ipv6PrefixRanges |
array(Ipv6PrefixRange) |
可选 |
BSF服务的IPv6前缀范围 |
dnnList |
array(Dnn) |
可选 |
BSF支持的DNN列表 |
ipDomainList |
array(string) |
可选 |
BSF支持的IP域列表 |
为什么BSF需要上报IP地址段?
这是PCC架构中会话绑定的核心机制。当PCF收到来自AF的策略请求时(比如AF请求为某个IP地址的用户视频流提供QoS保障),PCF需要知道应该联系哪个BSF来获取绑定信息。PCF通过NRF发现BSF时,会携带目标UE的IP地址作为查询条件,NRF根据各BSF注册的ipv4AddressRanges或ipv6PrefixRanges进行匹配,返回管理该IP地址段的BSF实例。
flowchart TD
A["BSF启动"] --> B["读取本地配置: IP地址段、DNN等"]
B --> C["构造NFProfile, 包含bsfInfo"]
C --> D["PUT /nnrf-nfm/v1/nf-instances/nfInstanceID"]
D --> E["NRF校验NFProfile"]
E --> F["NRF存储NFProfile到本地仓库"]
F --> G["NRF返回201 Created + heartBeatTimer"]
G --> H["BSF注册完成, 启动心跳定时器"]
style H fill:#c8e6c9,stroke:#2e7d32,stroke-width:3px
bsfInfo的典型配置示例:
bsfInfo:
ipv4AddressRanges:
- start: 10.XX.0.0
end: 10.XX.255.255
- start: 10.XX.100.0
end: 10.XX.100.255
ipv6PrefixRanges:
- start: 2a01:172:253::0/64
end: 2a01:172:253:ffff::0/64
dnnList:
- internet
- ims
ipDomainList:
- default
协议参考:根据3GPP TS 29.551 第6.1.6节,BsfInfo数据结构定义了BSF的注册信息中特有的字段。这些信息用于NRF在收到PCF或AF的服务发现请求时,根据目标UE的IP地址进行精确的BSF实例匹配。
2.4 【工程细节】注册流程中的注意事项
1) PUT vs POST的选择
5GC NF注册使用HTTP PUT而非POST,这是一个重要的设计选择。PUT是幂等方法(Idempotent),意味着BSF多次发送相同的PUT请求,NRF中的NFProfile状态是一致的。这对BSF的重启场景特别重要——BSF重启后使用相同的nfInstanceID重新注册,NRF会直接覆盖旧记录而非创建重复条目。
2) URI中nfInstanceID的作用
注册URI中直接包含了nfInstanceID(/nnrf-nfm/v1/nf-instances/{nfInstanceID}),这是RESTful设计的体现——PUT请求的目标资源URI就是NF实例本身。NRF根据URI中的nfInstanceID判断是新建注册还是更新已有注册。
3) 心跳定时器的协商
NRF在注册响应中返回heartBeatTimer(本例中为120秒),BSF必须按此时长周期性发送心跳。如果BSF停止发送心跳超过heartBeatTimer指定的时间,NRF将把该BSF的nfStatus从REGISTERED改为SUSPENDED,并通知已订阅该NF状态变更的其他网元。
3 测试结论
| 验证项 |
结果 |
说明 |
| BSF服务注册成功 |
OK |
NRF成功存储BSF的NFProfile |
| PUT消息URI正确 |
OK |
格式为/nnrf-nfm/v1/nf-instances/{nfInstanceID} |
| NFProfile内容完整 |
OK |
包含nfType=BSF、nbsf_management服务等 |
| bsfInfo地址段正确 |
OK |
IPv4和IPv6地址段与实际配置一致 |
| NRF返回201 Created |
OK |
注册成功,含Location头域和heartBeatTimer |
| 心跳时长与配置一致 |
OK |
heartBeatTimer为120秒 |
本测试用例完美通过。BSF通过Nnrf_NFManagement_NFRegister服务成功向NRF注册了自身的NFProfile,包括NF实例标识、NF类型(BSF)、核心服务(nbsf_management)以及BSF特有的IP地址段信息(bsfInfo)。NRF返回201 Created确认注册成功,并指示心跳周期为120秒。整个注册流程与3GPP TS 29.510和TS 29.551规范完全吻合。
协议参考汇总:
关于作者:爱卫生,从事通信教学18年,出版过《5G核心网原理与实践》等4本专业书籍。学5G核心网、IMS,来51学通信就对了!知识星球:200+小时视频、3000+精华文章、1年答疑群。公众号/知识星球:51学通信,微信:gprshome201101