<!-- title: IMS第三方注册与iFC拆解 -->
<!-- domain: ims -->

# IMS 第三方注册与初始过滤规则 iFC 业务触发信令全链拆解

> 引子：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 的过程。它的设计意图有三层：

1. **事件钩子（hook）**：让 AS 感知用户在线/离线状态，从而初始化业务上下文（如 TAS 加载用户的呼叫前转/呼叫限制档案）；
2. **驱动订阅**：AS 可借机向 S-CSCF 发起 `SUBSCRIBE reg-event`，订阅后续的注册状态变化通知；
3. **统一信令面**：复用 SIP REGISTER 方法承载，AS 无需新增接口，第三方注册本质是一次"被 S-CSCF 伪装成 REGISTER 的服务触发"。

一句话总结：**iFC 是规则，第三方注册是规则在注册事件上的执行结果**。

---

## 二、第三方注册完整信令时序

下面这张时序图覆盖了从 UE 认证注册成功，到 S-CSCF 下载 iFC、评估、向 TAS 发第三方 REGISTER、再到 AS 反向订阅注册事件的端到端流程（对应 TS 23.228 §5.3.2 与 TS 24.229 §5.1.2）。

```mermaid
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 的逻辑结构：规则如何被表达

iFC 的 XML schema 定义在 **TS 29.228 Annex B**。一个 iFC 由三要素构成：**Priority（优先级）、TriggerPoint（触发点）、ApplicationServer（目标 AS）**。理解它的关键在于把 TriggerPoint 拆成"若干 SPT（Service Point Trigger）按逻辑运算组合"。

```mermaid
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
```

### 3.1 SPT 的取值维度

每个 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）后的主叫段 |

### 3.2 CNF 与 DNF：用两种范式表达任意逻辑

TriggerPoint 里最精妙的设计是 **ConditionTypeCNF / ConditionTypeDNF**（合取/析取范式）与每个 SPT 的 **Group** 字段的组合，使得任意布尔表达式都能被 XML 表达：

- **CNF（合取范式）**：不同 Group 之间是 AND，同一个 Group 内的 SPT 之间是 OR。即 `Group1(...) AND Group2(...) AND Group3(...)`。
- **DNF（析取范式）**：不同 Group 之间是 OR，同一个 Group 内的 SPT 之间是 AND。即 `Group1(...) OR Group2(...)`。

举例：要求"方法是 INVITE **且** (SDP 含 audio 或 video) **且** 是主叫场景"——用 DNF 写成：
```xml
<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，是为了保证跨厂商一致性与可移植性。

---

## 四、第三方 REGISTER 消息的逐项解析

第三方注册在 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 评估 iFC 的决策流程

第三方注册能否被正确触发，取决于 S-CSCF 在 SAA 收到 iFC 后的评估逻辑。下图刻画了这一决策状态机：

```mermaid
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/>中止/可能去注册
```

这里需要特别注意三点：

1. **Priority 决定 AS 串联顺序**：多个 iFC 同时命中时，S-CSCF 按 Priority（0 最高）依次把请求"串"过各 AS，形成 AS 链。比如一次主叫 INVITE 可能依次经过 O-CSI 号码分析 AS → TAS → 计费 AS，顺序错乱会导致业务逻辑崩溃。
2. **DefaultHandling 是容错开关**：当第三方 REGISTER 发到 AS 失败（AS 宕机/超时），`SESSION_CONTINUED` 表示"忽略故障，继续后续 iFC，用户保持注册"；`SESSION_TERMINATED` 表示"释放会话/拒绝注册"。对 TAS 这类核心 AS，常配置为 TERMINATED——若 TAS 第三方注册失败，网络宁可让用户去注册，也不能让他"注册成功却打不出电话"。
3. **Shared iFC 的优化**：当大量用户共享同一组 iFC 规则时，HSS 不必在每个用户的 User-Data 里重复下发完整 XML，只下发一个 `SharedIFCSetID`，S-CSCF 用本地预置的共享 iFC 集解析。这把 Cx 接口的信令开销降到最低，是大规模商用网络的常见做法。

---

## 六、抓包识别与故障排错

### 6.1 抓包时如何识别第三方注册

在 Wireshark/TShark 中（参考 `pcap-analyzer` 这类工具对 SIP/Diameter 的解析），可按三个维度定位：

- **Cx 接口（SCTP/Diameter，code 1672 应用）**：过滤 `diameter.cmd.code == 301`（SAR）和 `== 302`（SAA），在 SAA 的 `User-Data AVP (620)` 里展开 XML，检查 `IMSSubscription → ServiceProfile → PublicIdentity → ... → InitialFilterCriteria` 是否存在且语法正确。
- **ISC 接口（S-CSCF ↔ AS，UDP/SCTP 上 SIP）**：过滤 `sip.Method == "REGISTER"` 且 `sip.To.addr` 为 AS 域名——这就是第三方注册。如果只看到 UE→P-CSCF→I-CSCF→S-CSCF 的注册，而 ISC 上没有任何 REGISTER，说明 iFC 评估未命中或 User-Data 下发为空。
- **reg-event 订阅链**：AS 成功收到第三方 REGISTER 后，通常会立即发 `SUBSCRIBE`（Event: `reg`）到 S-CSCF，后续 S-CSCF 用 `NOTIFY` 推送注册状态变化。这条链存在，才能保证用户掉线时 Voicemail/SCC AS 及时感知。

### 6.2 常见故障点与排错思路

| 现象 | 根因定位 | 排错方向 |
|------|---------|---------|
| 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 已足够覆盖业务需求。

---

## 参考来源

1. [3GPP TS 23.228 — IP Multimedia Subsystem (IMS) Stage 2](https://www.3gpp.org/dynareport/23228.htm) — §5.3.2 IMS registration procedure（注册流程与第三方注册要求）
2. [3GPP TS 29.228 — IP Multimedia (IM) Subsystem Cx and Dx interfaces](https://www.3gpp.org/dynareport/29228.htm) — Annex B iFC XML schema、§6 Service Profile / Initial Filter Criteria
3. [3GPP TS 23.218 — IP Multimedia (IM) session handling](https://www.3gpp.org/dynareport/23218.htm) — IP Multimedia Service Control (ISC) 与 Service Information 使用
4. [3GPP TS 24.229 — IP Multimedia Call Control Protocol based on SIP and SDP](https://www.3gpp.org/dynareport/24229.htm) — §5.1.2.2.2 Sending a third-party REGISTER request、第三方注册消息构造
5. [RFC 5002 — The P-Profile-Key P-Header](https://www.rfc-editor.org/rfc/rfc5002.html) — 第三方注册中 P-Profile-Key 头域语义
6. [Nick vs Networking — IMS Routing with iFCs](https://nickvsnetworking.com/ims-routing-with-ifcs/) — iFC XML 结构与 SPT/CNF-DNF 实战解读
7. [Real Time Communication — How to read Initial Filter Criteria](https://realtimecommunication.wordpress.com/2016/04/29/how-to-read-initial-filter-criteria/) — iFC、TriggerPoint、SessionCase 工程化讲解
8. [ShareTechnote — IMS SIP Registration](https://www.sharetechnote.com/html/IMS_SIP_Registration.html) — IMS 注册全程信令与数据流

---

> 本文由「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 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
