在IMS(IP Multimedia Subsystem)网络中,用户终端(UE)的注册动作表面上只是UE与S-CSCF之间完成一次SIP REGISTER鉴权交互。但对于归属网络的业务层而言,"用户上线"是一个必须被感知的语义事件——呈现服务器(Presence Server)需要初始化用户的在线状态、补充业务(如呼叫前转CFU)模块需要加载签约数据、SMS over IP网关需要为用户建立消息接收通道、Centrex/IMS会议AS需要记录用户可达性。这些业务逻辑全部由应用服务器(AS,Application Server)承载,而UE对自己"被哪些AS服务"完全无感知,也绝不可能逐一向每个AS发起注册。
3GPP为解决这一"控制层感知用户状态、业务层被动接收通知"的解耦需求,设计了第三方注册(Third-Party Registration)机制:当S-CSCF成功处理UE的初始注册后,它会代表用户向签约配置中匹配的应用服务器逐一发起REGISTER请求,这个动作通过ISC(IP Multimedia Service Control)接口完成。规范层面的核心依据是:
本文聚焦这一机制,从iFC的数据结构、S-CSCF的评估算法,到第三方REGISTER消息的IE构造与抓包识别,逐层拆解。
第三方注册的"决策依据"完全来自HSS下发的用户配置(User Profile)。S-CSCF在注册流程中通过Cx-Select-Pull(SAR/MAA,规范称Cx-Select-Pull)请求获取User Profile(TS 29.228 B.2),其中Service Profile字段携带若干条初始过滤准则iFC(Initial Filter Criteria)。
每条iFC是一个结构化数据对象,下图展示其完整IE树:
flowchart TB
UP["User Profile (TS 29.228 B.2)<br/>含IMPI/IMPU/ServiceProfile"] --> SP["Service Profile"]
SP --> IFC["Initial Filter Criteria (iFC)"]
IFC --> P["Priority: 整数, 越小优先级越高"]
IFC --> TP["Trigger Point 触发点"]
IFC --> AS["Application Server"]
IFC --> DH["Default Handling"]
IFC --> SI["Service Info: 透传给AS的业务数据"]
TP --> SPT1["SPT-1 (Service Point Trigger)"]
TP --> SPT2["SPT-2"]
TP --> SPTn["SPT-n (按CNF/DNF逻辑组合)"]
SPT1 --> M1["Method: REGISTER / INVITE ..."]
SPT1 --> SC1["Session Case: Originating/Terminating/...Unregistered"]
SPT1 --> SD1["Session Description: SDP行(行类型+内容)"]
SPT1 --> SH1["SIP Header: 头域名+内容正则"]
SPT1 --> RT1["Registration Type: 0初始/1重注册/2去注册"]
AS --> ASA["Server Name: AS的SIP URI (FQDN)"]
iFC的核心IE含义如下表(依据TS 29.228 B.2.2):
| IE字段 | 取值/类型 | 作用 | 典型值 |
|---|---|---|---|
| Priority | 整数 | 多条iFC的评估与触发顺序,数值越小越优先 | 0、1、2… |
| Trigger Point | SPT集合+逻辑组合 | 描述"什么情况下触发该AS"的逻辑表达式 | 由若干SPT经CNF/DNF组合 |
| Application Server | SIP URI | 目标AS地址(通常是FQDN) | sip:presence.as.home.net |
| Default Handling | 枚举 | AS不可达时的兜底策略 | 0=继续后续iFC;1=终止业务 |
| Service Info | 字符串 | S-CSCF不解析、透传给AS的私有数据 | 业务脚本ID、用户等级 |
| ProfilePartIndicator | 枚举 | 指示该iFC归属IMPU还是IMPI级别 | — |
而SPT(Service Point Trigger,业务点触发器)是Trigger Point的最小判定单元,主要包含Method(方法名)、Session Case(会话场景)、Session Description(SDP内容匹配)、SIP Header(头域匹配)、Registration Type(注册类型)五类判定项。判定一个SIP请求是否应触发某AS,就是把该请求的相关属性逐项与SPT比对。
需要特别强调Session Case(会话场景)枚举——它区分了请求在网络中的"角色":
| 枚举值 | 含义 | 触发场景 |
|---|---|---|
| 0 | Originating | 用户作为主叫发起的会话 |
| 1 | Terminating | 用户作为被叫的会话 |
| 2 | Terminating_Unregistered | 被叫且该IMPU未注册(用于未注册前转) |
| 3 | Originating_Unregistered | 主叫且该IMPU未注册 |
对第三方注册而言,触发AS的典型iFC配置是:Method = REGISTER + Registration Type = 0(初始注册)+ Session Case = Originating(已注册态)。这三项合在一起,精确刻画了"用户刚刚成功完成初始注册"这一语义。
下图为以"Presence AS"为例的第三方注册完整时序,覆盖两个阶段:阶段一是UE完成初始注册并触发S-CSCF下载User Profile;阶段二是S-CSCF评估iFC并通过ISC向AS发起第三方REGISTER。
sequenceDiagram
participant UE
participant PCSCF as P-CSCF
participant ICSCF as I-CSCF
participant SCSCF as S-CSCF
participant HSS
participant AS as AS (ISC接口)
Note over UE,SCSCF: 阶段一:初始注册与S-CSCF选择
UE->>PCSCF: REGISTER (IMPU/IMPI, 第1轮鉴权)
PCSCF->>ICSCF: REGISTER
ICSCF->>HSS: Cx-Query (UAR) 查询能力
HSS-->>ICSCF: Cx-Query Resp (UAA, S-CSCF能力集)
ICSCF->>SCSCF: REGISTER (选定S-CSCF)
SCSCF->>HSS: Cx-Select-Pull (SAR)
HSS-->>SCSCF: Cx-Select-Pull Resp (SAA, User Profile含iFC)
Note over SCSCF: 鉴权通过,缓存User Profile与iFC
SCSCF-->>ICSCF: 200 OK (注册成功,Expires)
ICSCF-->>PCSCF: 200 OK
PCSCF-->>UE: 200 OK
Note over SCSCF,AS: 阶段二:iFC评估 + 第三方注册(ISC)
SCSCF->>SCSCF: 遍历iFC: 匹配 Method=REGISTER<br/>& RegistrationType=0 & SessionCase
loop 按Priority顺序遍历每条匹配的iFC
SCSCF->>AS: 第三方REGISTER<br/>Request-URI=AS, P-Associated-URI, From/To=IMPU
AS->>HSS: Sh-Pull (可选,拉取业务相关用户数据)
HSS-->>AS: Sh-Pull Resp
AS->>AS: 初始化业务状态(如在线 Presence)
AS-->>SCSCF: 200 OK (业务激活完成)
end
时序中有几个关键细节值得注意:
第三方REGISTER与UE发起的REGISTER在报文结构上同属SIP REGISTER方法,但语义完全不同——它的Request-URI指向AS而非注册服务器。下表对照其关键IE(依据TS 24.229第5.4.1.2a节):
| SIP头域 / IE | 取值来源 | 含义与作用 |
|---|---|---|
| Request-URI | iFC的Application Server字段 | 标识本次REGISTER的目标AS,决定ISC路由目的 |
| From | 被注册的IMPU(Public User Identity) | 标识"是谁在被第三方注册" |
| To | 被注册的IMPU | 与From一致,表明注册对象 |
| Contact | 原注册请求中的Contact | 携带UE的可达地址与注册有效期 |
| Expires | 原注册有效期 | 通知AS该用户本次注册的有效时长 |
| P-Associated-URI | 该IMPI隐式注册集的全部IMPU | 告知AS用户所有已注册的公共标识 |
| P-Visited-Network-ID | 拜访网络标识 | 漫游场景下标识拜访网络 |
| P-Charging-Function-Addresses | 计费功能地址 | 用于AS侧计费关联 |
| Via | S-CSCF构造 | 记录ISC信令路径,用于响应回送 |
设计要点:AS收到这条REGISTER后,不得据此对用户发起去注册(TS 24.229明确约束),AS的职责仅限于"感知用户已上线"并据此加载/初始化业务上下文,随后回送200 OK。AS若需进一步的用户业务数据,可走Sh接口(Sh-Pull/Update/Notif)向HSS/UPF(UDR)查询,这条链路与ISC并行存在,是AS获取动态业务数据的第二条腿。
把S-CSCF在注册与第三方注册过程中的内部状态抽象为状态机,有助于理解重注册、Profile变更、AS故障等场景下的行为:
stateDiagram-v2
[*] --> Idle
Idle --> Auth: 收到初始REGISTER
Auth --> ProfileDown: 鉴权通过<br/>SAR→SAA下载UserProfile
ProfileDown --> Evaluating: 缓存iFC
Evaluating --> Invoking: 命中iFC(Method=REGISTER)
Invoking --> WaitForAS: ISC发送第三方REGISTER
WaitForAS --> Invoking: AS回200OK,处理下一条iFC
WaitForAS --> DefaultHandling: AS超时/错误
DefaultHandling --> Invoking: DefaultHandling=0继续
DefaultHandling --> Terminated: DefaultHandling=1终止
Invoking --> Registered: 全部匹配iFC处理完毕
Registered --> Evaluating: 重注册 / PPR推送Profile变更
Registered --> Idle: 去注册(RegistrationType=2)
状态机揭示了两个工程上常见的分支:
第三方注册机制之所以采用"S-CSCF代理触发"而非"UE直接注册多个AS"或"AS主动轮询",背后有三层设计意图:
在Wireshark中,第三方注册的ISC腿可通过以下过滤条件精准定位:
# 过滤所有REGISTER方法
sip.Method == "REGISTER"
# 区分ISC第三方REGISTER: Request-URI指向AS域名而非运营商域
sip.Request-URI contains "as." or sip.Request-URI contains "presence."
# 识别含P-Associated-URI的REGISTER(第三方注册标志性头域)
sip.Header contains "P-Associated-URI"
ISC腿REGISTER的判别特征:①Request-URI是AS的FQDN;②携带P-Associated-URI;③Source IP为S-CSCF。把它与UE↔P-CSCF↔I-CSCF的注册腿区分开,是排查"用户注册成功但业务不生效"问题的关键第一步。
| 故障现象 | 可能根因 | 排错方向 |
|---|---|---|
| 用户注册成功,但Presence不显示在线 | iFC未配置或Session Case不匹配 | 检查HSS User Profile的iFC,确认Method/RegType/SessionCase |
| AS未被触发 | iFC的Priority与Trigger Point逻辑错误 | 验证SPT组合(CNF/DNF)是否可被该REGISTER满足 |
| 部分AS被触发、部分未触发 | 前序AS的Default Handling=1中止了链路 | 检查前序AS是否故障及DefaultHandling取值 |
| 第三方REGISTER发出但无200 OK | AS宕机/DNS解析失败/ISC路由不通 | 检查AS FQDN解析、ISC链路、AS进程状态 |
| P-Associated-URI缺失导致AS误判 | 隐式注册集配置不全 | 核对IMPI与IMPU的Implicit Registration Set签约 |
| ## 八、对比:第三方注册 vs 其他注册态感知方式 |
| 维度 | 第三方注册(ISC) | SIP注册事件包(SUBSCRIBE/NOTIFY) | AS直接Sh订阅 |
|---|---|---|---|
| 触发主体 | S-CSCF代理 | UE或AS主动订阅 | AS主动 |
| 接口 | ISC(SIP) | ISC(SIP) | Sh(Diameter) |
| 感知粒度 | 注册/去注册事件 | 注册状态全集变化 | 用户数据变化 |
| 时延 | 注册成功即触发,低 | 依赖订阅周期 | 依赖Sh订阅 |
| 适用场景 | 绝大多数VoLTE/补充业务 | Presence、统一通信 | 计费、策略类AS |
三者并非互斥,工程中常以第三方注册作为"用户上线"的主通知通道,辅以SUBSCRIBE/NOTIFY维持长周期状态同步。
Q1:第三方REGISTER和UE的REGISTER有什么本质区别? A:UE的REGISTER是"用户主动向S-CSCF注册鉴权",Request-URI指向注册服务器域,用于建立注册态;第三方REGISTER是"S-CSCF代理已注册用户向AS通知上线",Request-URI指向AS的FQDN,AS不参与鉴权、不得去注册,仅感知状态并加载业务。两者报文同为SIP REGISTER方法,但语义、流向、处理实体完全不同。
Q2:iFC中Priority字段如何影响业务? A:Priority决定S-CSCF遍历并触发AS的顺序,数值越小越优先。当一个请求可能命中多条iFC时,Priority保证业务编排的确定性(例如计费AS优先于呈现AS)。前序AS的Default Handling取值会决定是否继续触发后续AS,因此Priority与Default Handling共同构成业务链的编排规则。
Q3:用户重注册时AS会被再次触发吗? A:取决于iFC中Registration Type的配置与厂商实现。若iFC的SPT匹配Registration Type=1(重注册),S-CSCF会再次发起第三方REGISTER;若仅匹配Type=0(初始注册),则重注册不触发。多厂商对接时这是高频IOT问题点,需在配置与联调中明确策略。
Q4:AS宕机时第三方注册失败会怎样? A:S-CSCF依据该iFC的Default Handling决策:取值0则跳过该AS、继续触发链上其他AS(业务降级但不中断);取值1则终止后续业务触发(保守策略,避免业务逻辑残缺)。运营商务开通时应根据AS的重要性合理配置Default Handling。
Q5:为什么AS还要走Sh接口而不只用第三方注册? A:第三方注册仅传递"用户上线"这一事件及基础注册信息(IMPU、Expires、P-Associated-URI),不携带业务数据。AS要执行具体业务逻辑(如读取用户的前转号码、呈现好友列表、计费余额),需通过Sh接口向HSS/UDR拉取(Sh-Pull)或订阅(Sh-Subs-Notif)动态用户数据。ISC负责"事件通知",Sh负责"数据供给",二者分工互补。
本文由「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 等场景全覆盖。
