引子:VoLTE 用户开机注册成功,网络侧却"装作没看见"——主叫拨号时 TAS 不介入、补充业务全失效、SMS over IP 投递失败。这类故障的根因,八成不在 5G/IMS 注册本身,而在于注册成功后那一步被多数人忽略的"第三方注册(Third-Party Registration)"与背后的 iFC(Initial Filter Criteria)评估。本文以 TS 23.228、TS 23.218、TS 29.228、TS 24.229 为准绳,把这一段从 HSS 下发用户配置到 AS 被触发的完整信令链逐一拆开。
在 IMS 架构里,会话控制与会话逻辑是被刻意解耦的。S-CSCF 作为用户归属域的会话锚点,只负责 SIP 路由、鉴权与转发仲裁;真正决定"这次呼叫要不要做号码补全、要不要计费、要不要前转"的业务逻辑,全部下沉到应用服务器(AS,如 TAS、SCC AS、Presence Server、IP-SM-GW、SMS Router 等)。
但 S-CSCF 并不知道一个用户该被哪些 AS 服务、按什么顺序服务。这套"路由规则"就是 iFC(Initial Filter Criteria,初始过滤规则),它以 XML 形式存储在 HSS 的用户配置(Service Profile)里,在注册过程中通过 Cx 接口的 Server-Assignment-Answer (SAA) 下发给 S-CSCF。
第三方注册则是 S-CSCF 把"用户刚刚注册成功"这一事件,以一个独立的 SIP REGISTER 消息的形式通知给 AS 的过程。它的设计意图有三层:
SUBSCRIBE reg-event,订阅后续的注册状态变化通知;一句话总结:iFC 是规则,第三方注册是规则在注册事件上的执行结果。
下面这张时序图覆盖了从 UE 认证注册成功,到 S-CSCF 下载 iFC、评估、向 TAS 发第三方 REGISTER、再到 AS 反向订阅注册事件的端到端流程(对应 TS 23.228 §5.3.2 与 TS 24.229 §5.1.2)。
sequenceDiagram
autonumber
participant UE
participant PCSCF as P-CSCF
participant ICSCF as I-CSCF
participant SCSCF as S-CSCF
participant HSS
participant TAS as TAS (AS)
Note over UE,SCSCF: 第一阶段:认证已完成(UMTS-AKA 挑战通过)
UE->>PCSCF: REGISTER (IMPU, IMPI, Authorization RES)
PCSCF->>ICSCF: REGISTER (转发)
ICSCF->>SCSCF: REGISTER (按 UAR/UAA 结果选定的 S-CSCF)
rect rgb(235, 248, 255)
Note over SCSCF,HSS: 第二阶段:下载用户配置(含 iFC)
SCSCF->>HSS: Cx SAR (Server-Assignment-Request)<br/>User-Data-Already-Available=0
HSS-->>SCSCF: Cx SAA (Server-Assignment-Answer)<br/>User-Data AVP = IMSSubscription XML(含 iFC 列表)
end
rect rgb(255, 245, 230)
Note over SCSCF,TAS: 第三阶段:iFC 评估 + 第三方注册
SCSCF->>SCSCF: 按 Priority 顺序评估各 iFC<br/>TriggerPoint 是否匹配本次 REGISTER
SCSCF->>TAS: ISC REGISTER (第三方注册)<br/>Request-URI/To=AS, From/P-Served-User=IMPU
TAS-->>SCSCF: 200 OK
TAS->>SCSCF: SUBSCRIBE (reg-event 包, 订阅注册状态)
SCSCF-->>TAS: 200 OK
end
SCSCF->>ICSCF: 200 OK (含 Service-Route, P-Associated-URI)
ICSCF->>PCSCF: 200 OK
PCSCF->>UE: 200 OK (注册成功)
关键判别点:图中第 7 步(S-CSCF → TAS 的 REGISTER)就是第三方注册。它在 ISC/Mw 接口上的"身份证"是——Request-URI 和 To 头指向 AS 的域名,而不是用户的 IMPU;这是它与 UE 发起的真正注册最直观的区别。
iFC 的 XML schema 定义在 TS 29.228 Annex B。一个 iFC 由三要素构成:Priority(优先级)、TriggerPoint(触发点)、ApplicationServer(目标 AS)。理解它的关键在于把 TriggerPoint 拆成"若干 SPT(Service Point Trigger)按逻辑运算组合"。
flowchart TB
IFC["InitialFilterCriteria<br/>(一条触发规则)"]
IFC --> P["Priority<br/>数字越小优先级越高"]
IFC --> TP["TriggerPoint<br/>(触发点)"]
IFC --> AS["ApplicationServer<br/>(动作)"]
TP --> CT{"ConditionTypeCNF / DNF<br/>决定组间逻辑"}
TP --> SPTs["1..N 个 SPT"]
SPTs --> S1["Method<br/>REGISTER/INVITE/..."]
SPTs --> S2["SessionCase<br/>0=Orig 1=Term_Reg<br/>2=Term_Unreg 3=Orig_Unreg 4=Orig_CDIV"]
SPTs --> S3["RequestURI"]
SPTs --> S4["SIPHeader<br/>Header+Content(ERE正则)"]
SPTs --> S5["SessionDescription<br/>SDP 行匹配"]
SPTs --> S6["RegistrationType"]
SPTs -.可逐项取反.-> CN["ConditionNegated<br/>0=匹配 1=非匹配"]
SPTs -.分组.-> GR["Group<br/>组内用相反逻辑"]
AS --> SN["ServerName (AS 的 SIP URI)"]
AS --> DH["DefaultHandling<br/>0=SESSION_CONTINUED<br/>1=SESSION_TERMINATED"]
AS --> SI["ServiceInformation<br/>透传给 AS 的业务信息"]
style IFC fill:#e3f2fd,stroke:#1565c0
style TP fill:#fff3e0,stroke:#ef6c00
style AS fill:#e8f5e9,stroke:#2e7d32
每个 SPT 就是一条原子匹配条件,TS 29.228 定义的匹配维度包括:SIP 方法、Session Case(会话场景)、Request-URI、SIP 头域(含内容,用 ERE 扩展正则匹配)、会话描述(SDP 某行)、注册类型。其中 Session Case 是最容易踩坑的枚举,它把"这个请求是主叫还是被叫、用户是否已注册"固化成 5 个值:
| 枚举值 | SessionCase | 语义 |
|---|---|---|
| 0 | Originating | 用户作为主叫发起的初始请求 |
| 1 | Terminating_Registered | 用户作为被叫且当前已注册 |
| 2 | Terminating_Unregistered | 用户作为被叫且未注册(常用于触发 Voicemail) |
| 3 | Originating_Unregistered | 未注册用户发起的主叫 |
| 4 | Originating_CDIV | 通信转移(CDIV)后的主叫段 |
TriggerPoint 里最精妙的设计是 ConditionTypeCNF / ConditionTypeDNF(合取/析取范式)与每个 SPT 的 Group 字段的组合,使得任意布尔表达式都能被 XML 表达:
Group1(...) AND Group2(...) AND Group3(...)。Group1(...) OR Group2(...)。举例:要求"方法是 INVITE 且 (SDP 含 audio 或 video) 且 是主叫场景"——用 DNF 写成:
<TriggerPoint>
<ConditionTypeDNF>1</ConditionTypeDNF>
<SPT><Group>1</Group><Method>INVITE</Method></SPT>
<SPT><Group>1</Group><SessionCase>0</SessionCase></SPT>
<SPT><Group>1</Group><SessionDescription>...</SessionDescription></SPT>
</TriggerPoint>
组 1 内三个 SPT 用 AND 连接,整体即"INVITE 且主叫且 SDP 匹配"。借由 ConditionNegated(取反)和德摩根定律,CNF 与 DNF 之间可互相转换,3GPP 选 ERE(IEEE POSIX 扩展正则)而非 PCRE,是为了保证跨厂商一致性与可移植性。
第三方注册在 S-CSCF 内部生成,对应 TS 24.229 §5.1.2.2.2 "Sending a third-party REGISTER request"。S-CSCF 并不是把 UE 的 REGISTER 原样转发,而是重新构造一个全新的 REGISTER。它的关键头域如下表(这是排查 AS 侧业务逻辑的最核心一张表):
| 头域 / IE | 取值 | 来源 / 作用 |
|---|---|---|
| Request-URI | AS 的 SIP URI(如 sip:tas.mnc001.mcc001.3gppnetwork.org) |
取自 iFC 的 ApplicationServer/ServerName,决定 REGISTER 发往哪个 AS |
| To | 与 Request-URI 相同(AS 地址) | 表明这是发往 AS 的注册通知 |
| From | 被注册用户的默认 Public User Identity(IMPU) | 标识"谁注册了" |
| P-Asserted-Identity | 本次注册的 IMPU | AS 据此识别用户身份 |
| P-Served-User | IMPU + registration-state 参数 |
告知 AS 注册/去注册状态,触发相应业务逻辑 |
| P-Profile-Key | 用户 profile 标识或 Shared iFC Set ID(RFC 5002) | 让 AS 在多 profile 场景下锁定正确业务档案 |
| Route | iFC ApplicationServer 携带的参数(如 ;orig/;term) |
透传业务指示,AS 据此区分主叫/被叫处理 |
| P-Charging-Vector | orig_ioi=<home network> |
计费与互操作标识 |
| P-Charging-Function-Addresses | ECF/ECF 地址 | 在线/离线计费功能地址 |
| Expires | 注册有效期 | 同步注册有效期给 AS |
| Service Information | iFC 的 ServiceInformation |
TS 23.218 定义,向 AS 透传附加业务信息(可承载厂商扩展) |
设计巧思:把 Request-URI/To 设为 AS 而非 IMPU,是为了让 AS 把它当成"对自己的注册通知"处理,而非"用户在我这里注册"。同时 P-Served-User 的 registration-state 参数让 AS 无需额外查询 HSS 就能知道是注册还是去注册——这正是 SCC AS、TAS 在用户注册后立即建立业务上下文的入口。
第三方注册能否被正确触发,取决于 S-CSCF 在 SAA 收到 iFC 后的评估逻辑。下图刻画了这一决策状态机:
stateDiagram-v2
[*] --> SAA_Rcvd: 收到 Cx SAA<br/>解析 User-Data XML
SAA_Rcvd --> BuildContext: 构建 iFC 执行链表<br/>按 Priority 升序
BuildContext --> EvalLoop
state EvalLoop {
[*] --> FetchNext: 取下一条 iFC(按Priority)
FetchNext --> MatchTP: 用本次 REGISTER 评估 TriggerPoint
MatchTP --> Yes: SPT 全部满足
MatchTP --> No: 不满足
Yes --> Send3rdReg: 构造第三方REGISTER→AS
No --> Skip: 跳过该 iFC
Send3rdReg --> CheckResp
Skip --> CheckResp
CheckResp --> FetchNext: 还有未评估 iFC
}
EvalLoop --> Done: 所有 iFC 评估完毕
Done --> Reply200: 向 UE 回 200 OK
Send3rdReg --> AS_Down?: AS 无响应/错误
AS_Down? --> Cont: DefaultHandling=SESSION_CONTINUED<br/>继续后续 iFC
AS_Down? --> Term: DefaultHandling=SESSION_TERMINATED<br/>中止/可能去注册
这里需要特别注意三点:
SESSION_CONTINUED 表示"忽略故障,继续后续 iFC,用户保持注册";SESSION_TERMINATED 表示"释放会话/拒绝注册"。对 TAS 这类核心 AS,常配置为 TERMINATED——若 TAS 第三方注册失败,网络宁可让用户去注册,也不能让他"注册成功却打不出电话"。SharedIFCSetID,S-CSCF 用本地预置的共享 iFC 集解析。这把 Cx 接口的信令开销降到最低,是大规模商用网络的常见做法。在 Wireshark/TShark 中(参考 pcap-analyzer 这类工具对 SIP/Diameter 的解析),可按三个维度定位:
diameter.cmd.code == 301(SAR)和 == 302(SAA),在 SAA 的 User-Data AVP (620) 里展开 XML,检查 IMSSubscription → ServiceProfile → PublicIdentity → ... → InitialFilterCriteria 是否存在且语法正确。sip.Method == "REGISTER" 且 sip.To.addr 为 AS 域名——这就是第三方注册。如果只看到 UE→P-CSCF→I-CSCF→S-CSCF 的注册,而 ISC 上没有任何 REGISTER,说明 iFC 评估未命中或 User-Data 下发为空。SUBSCRIBE(Event: reg)到 S-CSCF,后续 S-CSCF 用 NOTIFY 推送注册状态变化。这条链存在,才能保证用户掉线时 Voicemail/SCC AS 及时感知。| 现象 | 根因定位 | 排错方向 |
|---|---|---|
| VoLTE 主叫拨号无 TAS 介入、无补充业务 | iFC 的 TriggerPoint 未匹配 INVITE/主叫场景,或 Priority 错配 | 检查 SessionCase 是否为 0 (Originating)、Method=INVITE;核对 CNF/DNF 与 Group 组合 |
| 用户注册成功但 SMS over IP 收不到 | IP-SM-GW 对应的第三方注册未发出 | 确认 SAA 中含匹配 REGISTER 方法的 iFC,且 AS ServerName 解析正常 |
| 偶发性"注册成功却无法呼叫",TAS 日志无该用户 | 第三方 REGISTER 到 TAS 失败 + DefaultHandling=SESSION_CONTINUED | 检查 ISC 链路、TAS 容量;评估是否应改 TERMINATED 以暴露故障 |
| 终呼时 Voicemail 未触发 | iFC 用错 Session Case(应 Terminating_Unregistered=2) | 复核枚举值;区分 Term_Reg 与 Term_Unreg |
| AS 无法识别用户 profile | P-Profile-Key 缺失或 SharedIFCSetID 在 S-CSCF 未预置 | 核对 RFC 5002 头域;确认共享 iFC 集两端配置一致 |
| ERE 正则不匹配 | 厂商误用 PCRE 语法(如 \d) |
改用 POSIX ERE([0-9]) |
为凸显第三方注册 + iFC 机制的工程价值,下表对比了几种业务触发的不同思路:
| 维度 | iFC + 第三方注册(IMS 标准) | 静态路由/硬编码触发 | SCP/智能网(CAMEL)触发 |
|---|---|---|---|
| 规则存储位置 | HSS 用户配置(按用户粒度) | S-CSCF 配置文件(全局) | SCP gsmSCF |
| 配置灵活性 | XML 可按用户/业务组合,热下发 | 改配置需重启/重载 | 基于 CAMEL 触发检测点 TDP |
| 触发时机 | 注册/会话初始请求,按 Priority 串行 | 全量转发 | 呼叫处理中的检测点 |
| 业务与控制解耦 | 完全解耦,AS 独立 | 部分耦合 | 严重耦合于呼叫模型 |
| 跨网漫游支持 | 原生支持(归属域 S-CSCF 仲裁) | 差 | 受限于 CAMEL 网络 |
| 标准化 | 3GPP TS 29.228/23.218 | 厂商私有 | 3GPP TS 23.078 |
iFC 机制的核心优势在于"数据驱动 + 用户粒度 + 解耦"——把业务编排能力从设备里抽出来,交给运营商的 HSS 数据团队用 XML 表达,这正是 IMS 区别于传统智能网、支撑 VoLTE/RCS/视频等灵活业务的基石。
Q1:第三方注册和 UE 的正常注册都是 REGISTER,到底有什么区别? A:UE 的注册是"用户向网络声明在线",Request-URI/To 指向用户归属域,目的是在 S-CSCF 建立注册绑定;第三方注册是"S-CSCF 把注册事件通知给 AS",Request-URI/To 指向 AS 域名,From/P-Served-User 才是用户 IMPU。前者是用户→网络,后者是 S-CSCF→AS,方向和目的完全不同,只是复用了 REGISTER 方法体。
Q2:iFC 评估时,到底用什么 Session Case 来匹配注册事件? A:注册成功后,S-CSCF 把这次 REGISTER 当作一个初始请求,用用户的已注册 Service Profile 评估 iFC。能命中第三方注册的 iFC,通常其 TriggerPoint 不限定 Session Case、或限定为 Originating 语义,并以 Method=REGISTER(或留空方法)匹配。注册去注册则由后续的 REGISTER(Expires=0)或网络侧发起的去注册触发,S-CSCF 同样评估未注册 profile 的 iFC 通知 AS。
Q3:AS 收不到第三方注册,是 iFC 问题还是 SAA 问题? A:两者皆可能,分两步查。先看 Cx SAA 的 User-Data AVP 是否真的带回了 iFC XML(HSS 侧用户数据是否配置、SAR 的 User-Data-Already-Available 是否正确);若 iFC 已下发,再看 S-CSCF 评估日志——TriggerPoint 是否匹配、ServerName 能否 DNS 解析、ISC 链路是否可达。优先级:SAA 内容 → iFC 语法 → TriggerPoint 匹配 → AS 可达性。
Q4:DefaultHandling 配成 SESSION_TERMINATED 会有什么风险? A:当 AS 临时不可达或响应超时,S-CSCF 会按 TERMINATED 中止处理,极端情况下触发用户去注册。优点是暴露故障、避免"假在线";风险是 AS 短暂抖动(如割接、过载)会波及大量用户被去注册,引发注册风暴。核心 AS(TAS/SCC AS)建议 TERMINATED 并配合 AS 高可用;非关键 AS(如 Presence)建议 CONTINUED。
Q5:为什么 3GPP 选 ERE(POSIX 扩展正则)而不是 PCRE? A:为跨厂商一致性与可移植性。ERE 是 IEEE 1003 标准,语义固定、无 PCRE 的诸多方言(如命名分组、回溯引用),实现简单、匹配确定性强,避免不同厂商正则引擎差异导致"同一个 iFC 在 A 厂商触发、在 B 厂商不触发"的互操作事故。代价是表达能力略弱,但配合 ConditionNegated 与 CNF/DNF 已足够覆盖业务需求。
本文由「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 等场景全覆盖。
