首页 › ims › IMS iFC业务触发与前转信令拆解

IMS iFC 业务触发与 CDIV 呼叫前转信令全链拆解

关联规范:3GPP TS 23.218(IMS 会话处理与 ISC 接口 Stage 2)、TS 29.228/29.229(Cx/Dx 接口)、TS 24.229(IMS SIP 呼叫控制)、TS 24.604(通信前转 CDIV)、RFC 7044(History-Info)。本文以 V18.x 版本为基准,但所述机制自 Rel-7 起即为 IMS 业务触发的核心,至今仍是 VoLTE/VoNR 共用的同一套服务控制逻辑。


一、为什么 IMS 要发明 iFC:从 IN/CAMEL 到声明式触发的范式跃迁

在传统电路交换(CS)域,增值业务由智能网(IN)和 CAMEL 实现:MSC 在 BCSM(基本呼叫状态模型)的检测点(DP)上挂接触发,触发条件(CSI,CAMEL Subscription Information)静态烧录在 HLR 里,业务逻辑紧耦合在 gsmSCF/CSE 上。这套机制有三个致命缺陷:触发点硬编码在交换机状态机里、新增业务需要漫长的核心网升级周期、业务逻辑与承载控制深度纠缠。

IMS 彻底重构了这个模型。TS 23.218 定义了一条独立的 ISC(IP Multimedia Service Control)参考点,把"会话路由控制"(S-CSCF)和"业务逻辑执行"(AS)物理分离。S-CSCF 不再硬编码任何业务,而是变成一台"业务触发执行引擎"——它依据从 HSS 下载的 初始过滤准则(iFC,Initial Filter Criteria),以声明式、可编排、按优先级链式的方式,把初始 SIP 请求"递送"到正确的应用服务器。

这是一种典型的控制反转(Inversion of Control):业务触发规则成为用户签约数据(stored in HSS)而非网络设备配置,从而做到"千人千面"——不同用户可以挂载完全不同的 AS 链,运营商和第三方 AS 可以在不改动 S-CSCF 一行代码的前提下快速上线新业务。理解 iFC,是理解整个 IMS 服务层架构的钥匙。


二、iFC 的数据结构深度解析(TS 29.228 Annex B)

iFC 不是一条独立的信令消息,而是 用户档案(User Profile)XML Schema 中的片段,定义在 TS 29.228 Annex B(B.2 Service Profile → B.2.2 Initial Filter Criteria)。当用户注册时,S-CSCF 通过 Cx 接口的 SAR/SAA(Server-Assignment-Request/Answer)从 HSS 把整个 User Profile 拉到本地缓存,此后每次初始请求的 iFC 评估都在 S-CSCF 本地内存中完成,无需再回查 HSS。

2.1 iFC 的五个核心组成

一个 iFC 实例由以下要素构成:

组成要素 字段(XML Schema) 含义与作用
优先级 Priority 整数,值越小优先级越高。S-CSCF 按升序逐条评估
档案部分指示 ProfilePartIndicator 取值 REGISTERED / UNREGISTERED,决定该 iFC 仅在用户已注册或未注册时生效(未注册前转依赖此项)
触发点 TriggerPoint 一个布尔逻辑表达式(可缺省,缺省=无条件触发)
└ 逻辑类型 ConditionTypeCNF TRUE=合取范式(CNF,AND of ORs),FALSE=析取范式(DNF,OR of ANDs)。决定 SPT 之间的组合方式
└ 服务点触发器 SPT(集合) 构成表达式的最小判定原子
应用服务器 ApplicationServer 命中后转发目标
└ AS 地址 ServerName AS 的 SIP URI,如 sip:[email protected]
└ 默认处理 DefaultHandling SESSION_CONTINUED / SESSION_TERMINATED:AS 不可达时的兜底策略
└ 业务信息 ServiceInfo 透明传递给 AS 的业务参数串
└ 服务名称 ServiceName(Rel-13+) 标识 AS 内的具体服务,便于精确路由

2.2 SPT(Service Point Trigger)—— 触发判定的原子

触发点 TriggerPoint 由若干 SPT 组合而成。每个 SPT 检查初始请求的某一个特定侧面,TS 29.228 定义了六类 SPT:

flowchart TD
    subgraph SPT["SPT 服务点触发器(六类)"]
        A1["① Request-URI<br/>匹配请求 URI 或其部分"]
        A2["② SIP Method<br/>INVITE / REGISTER / MESSAGE..."]
        A3["③ SIP Header<br/>头部存在性或正则匹配"]
        A4["④ Session Case<br/>主叫/被叫/注册状态"]
        A5["⑤ SDP 内容<br/>媒体行 a= / m= 匹配"]
        A6["⑥ Registration Type<br/>初始/重注册/去注册"]
    end
    SPT -->|被 ConditionTypeCNF 组合| TP["TriggerPoint<br/>布尔表达式"]
    TP -->|"求值 = TRUE"| HIT["命中 → 转发 AS"]
    TP -->|"求值 = FALSE"| MISS["跳过该 iFC"]

每一类 SPT 还可带 Group 属性(分组号):同一 Group 号的 SPT 之间为"或"关系,不同 Group 号之间为"与"关系——这是 SPT 组合逻辑的另一种表达方式,与 ConditionTypeCNF 配合使用。

举个 CFU(无条件呼叫前转)的真实例子。被叫用户 B 的 S-CSCF 下载到的 TAS 触发 iFC 大致形如:

<InitialFilterCriteria>
  <Priority>1</Priority>
  <TriggerPoint>
    <ConditionTypeCNF>0</ConditionTypeCNF>            <!-- 0 = DNF -->
    <SPT>
      <Method>INVITE</Method>                         <!-- 仅对 INVITE 触发 -->
    </SPT>
    <SPT>
      <SessionCase>1</SessionCase>                    <!-- 1 = Terminating 被叫侧 -->
    </SPT>
  </TriggerPoint>
  <ApplicationServer>
    <ServerName>sip:[email protected]</ServerName>
    <DefaultHandling>0</DefaultHandling>              <!-- 0 = SESSION_CONTINUED -->
    <ServiceName>MMTEL-CDIV</ServiceName>
  </ApplicationServer>
</InitialFilterCriteria>

这段声明的语义是:"当用户作为被叫收到一个 INVITE 时,先把它送给 TAS"。注意这里没有任何业务逻辑(不写"如果 CFU 激活就前转")——前转与否的判断完全在 TAS 内部完成。iFC 只负责"路由递送",这正是控制反转的精髓。


三、iFC 评估算法(TS 23.218 Clause 5)

S-CSCF 收到任何初始请求(Initial Request,即同一 Dialog 或 Subscription 的第一个请求,如 INVITE/REGISTER/SUBSCRIBE/MESSAGE,而非其中的 PRACK/UPDATE/ACK),都会执行 TS 23.218 Clause 5 定义的评估流程:

flowchart TD
    R["S-CSCF 收到初始 SIP 请求"] --> CASE{"确定会话情况<br/>Originating / Terminating<br/>Registered / Unregistered"}
    CASE --> FILTER["筛出匹配会话情况<br/>与 ProfilePartIndicator 的 iFC 子集"]
    FILTER --> SORT["按 Priority 升序排序"]
    SORT --> EVAL{遍历下一条 iFC}
    EVAL -->|"有 TriggerPoint"| TP["对当前请求求值 TriggerPoint"]
    EVAL -->|"无 TriggerPoint<br/>(无条件)"| HIT
    TP -->|"TRUE"| HIT["命中:转发请求到 AS"]
    TP -->|"FALSE"| SKIP["跳过,继续下一条"]
    HIT --> AS["AS 执行业务<br/>可能改写 Request-URI/Header"]
    AS -->|"返回请求"| EVAL
    SKIP --> EVAL
    EVAL -->|"iFC 链耗尽"| DONE["按正常路由转发<br/>(I-CSCF / 终端)"]

这里有三个极易被忽视的设计要点:

① 链式触发(Service Chaining)与"逐条返回"。 一个请求可能依次命中多条 iFC,被多个 AS 串行处理。每命中一条,S-CSCF 就暂停后续 iFC 评估,把请求转发给 AS;AS 处理完(可能改写了 Request-URI、增删了头部)后把请求交还 S-CSCF,S-CSCF 再从断点继续评估剩余 iFC。这意味着前一个 AS 的改写结果会影响后续 AS 的触发判定——这是 iFC 链编排的精髓,也是故障排查时"为什么第二个 AS 没触发"的常见根因(被前一个 AS 改没了)。

② 共享 iFC 评估(Shared iFC)。 当请求从 AS 返回后,S-CSCF 重新评估剩余 iFC 时使用的是被 AS 改写后的请求,但当前 AS 本身不会被重复触发(避免死循环)。

③ DefaultHandling 的兜底语义。 若 TAS 宕机、ISC 超时,SESSION_CONTINUED 表示 S-CSCF 视同 AS 放行、继续后续流程(业务降级但不阻断呼叫);SESSION_TERMINATED 表示直接释放会话(强安全/计费场景)。这个字段的取值直接决定了网络容灾行为,是运维排障的关键参数。


四、iFC 是怎么到 S-CSCF 的:Cx 接口 User Profile 下载

iFC 的生命周期从 HSS 签约数据开始。注册流程中,I-CSCF 通过 UAR/ULA 选定 S-CSCF 后,S-CSCF 通过 SAR 向 HSS 请求用户数据,HSS 以 SAA 返回完整的 User Profile(含所有 iFC)。这套 Cx Diameter 命令定义在 TS 29.229(协议)/ TS 29.228(信令流程)。

sequenceDiagram
    autonumber
    participant UE as UE-B(被叫)
    participant SCSCF as S-CSCF
    participant HSS as HSS
    Note over UE,SCSCF: ====== 注册阶段:iFC 下载 ======
    UE->>SCSCF: REGISTER
    SCSCF->>HSS: SAR (User-Name, SIP-Auth-Data-Item,<br/>Server-Assignment-Type=REGISTRATION)
    HSS-->>SCSCF: SAA (User-Profile: 含 iFC 集合)<br/>缓存到 S-CSCF 内存
    SCSCF-->>UE: 200 OK
    Note over UE,SCSCF: 此后呼叫阶段 iFC 评估全部在本地内存完成,不再回查 HSS

User Profile 通过 SAA 的 User-Data AVP 携带,其内容即 TS 29.228 Annex B 定义的 XML 文本。注册态 iFC 与未注册态 iFC 在同一份 User Profile 中以 ProfilePartIndicator 区分——这正是"未注册前转"(用户关机时仍能前转到语音信箱)得以工作的数据基础。


五、CDIV 呼叫前转(CFU)完整信令时序拆解

现在把 iFC 评估和具体业务流程缝合起来。场景:用户 B 签约了无条件呼叫前转(CFU)到用户 C。主叫 A 拨打 B,呼叫最终被前转到 C。TS 24.604 Clause 4.2 定义了 CFU 的协议过程。

sequenceDiagram
    autonumber
    participant A as UE-A(主叫)
    participant SCSCF_A as S-CSCF_A
    participant ICSCF as I-CSCF_B
    participant SCSCF_B as S-CSCF_B(被叫归属)
    participant TAS as TAS(CDIV-AS)
    participant HSS as HSS
    participant C as UE-C(前转目标)

    A->>SCSCF_A: INVITE sip:[email protected]
    SCSCF_A->>ICSCF: INVITE(主叫侧 iFC 评估后转发)
    ICSCF->>HSS: LIR/LIA(查询 B 的 S-CSCF)
    ICSCF->>SCSCF_B: INVITE sip:[email protected]

    Note over SCSCF_B: 被叫侧 iFC 评估:INVITE+Terminating 命中 TAS-iFC
    SCSCF_B->>TAS: INVITE(经 ISC,原 Request-URI=B)
    Note over TAS: 查询 B 的 CDIV 签约 → CFU 激活
    Note over TAS: TAS 作为 B2BUA,构造新 INVITE 到 C

    TAS->>SCSCF_B: INVITE sip:[email protected](Request-URI 已改写为 C)<br/>History-Info: &lt;sip:[email protected]&gt;;cause=unconditional;index=1,<br/>&lt;sip:[email protected]&gt;;index=2

    Note over SCSCF_B: 用改写后的请求再次评估 iFC(共享 iFC 评估)
    SCSCF_B->>ICSCF: INVITE(路由到 C 的归属域)
    ICSCF->>C: INVITE
    C-->>ICSCF: 180 Ringing
    ICSCF-->>SCSCF_B: 180 Ringing
    SCSCF_B-->>TAS: 180 Ringing
    TAS-->>SCSCF_B: 180 Ringing(B2BUA 对应到 A-leg)
    SCSCF_B-->>SCSCF_A: 180 Ringing
    SCSCF_A-->>A: 180 Ringing

    C-->>SCSCF_B: 200 OK(含 SDP 应答)
    SCSCF_B-->>A: 200 OK(逐段回传,TAS 完成 SDP 透传/桥接)
    A-->>SCSCF_B: ACK
    Note over A,C: 媒体通道建立,A 与 C 通话

5.1 关键 IE 逐条解析

① INVITE 的 Request-URI 改写。 TAS 收到的 INVITE,其 Request-URI 是 sip:[email protected](原始被叫)。TAS 判定 CFU 激活后,把新发出的 INVITE 的 Request-URI 改为 sip:[email protected]。这是 CFU 实现的核心动作——前转目标成为新的被叫。TS 24.604 明确规定 AS 应将 Request-URI 设置为 <target> 元素给出的前转目标地址。

② History-Info 头部(RFC 7044)。 这是记录前转轨迹的关键 IE。TAS 必须在 History-Info 中追加两个 hi-entry: - 第一个 index=1:<sip:[email protected]>;cause=unconditional,记录原始被叫与前转原因; - 第二个 index=2:<sip:[email protected]>,记录前转后的目标,并通过 mp(mapped-target)参数指向当前请求目标。

其中 cause 参数取值集(TS 24.604 / RFC 7131):unconditional(CFU)、busy(CFB)、no-reply(CFNR)、not-reachable、time-of-day 等。History-Info 是计费、防环路、多段前转溯源的唯一依据,丢失会导致前转链断裂、计费错误。

③ cause-param(redirecting reason)。 TS 24.604 还要求 AS 在 SIP URI 中设置 cause-param,承载 redirecting reason 和 redirecting indicator,用于与传统 Diversion 头部(RFC 5806,已废弃)的互通——RFC 7544 定义了 Diversion 与 History-Info 的映射关系。

④ TAS 的 B2BUA 角色。 与"302 Moved Temporarily 重定向"不同,CFU 的标准实现是 TAS 作为背靠背用户代理(B2BUA):它在 ISC 上维护一个 toward-S-CSCF 的 leg 和一个 toward-diverted-target 的 leg,两端独立 SDP 协商。这样 TAS 才能执行放音、计费、前转次数限制(防环路,TS 24.604 规定最大前转次数)等控制逻辑。少数实现也会用 302,但 302 会把前转决策权交还给主叫域,难以集中计费,因此主流商用 TAS 采用 B2BUA。

⑤ 二次 iFC 评估。 注意时序图第 10 步之后:TAS 把改写后的 INVITE 发回 S-CSCF_B,S-CSCF_B 会对这个"新"请求再做一轮 iFC 评估(前转目标的 iFC)。这是 iFC 链式评估在被叫域内的体现——前转后的请求可能再次触发其他 AS(如 C 的彩铃 AS)。排障时常被误判为"重复触发 bug",实为标准行为。


六、iFC 与传统/未来方案的对比

维度 IN/CAMEL(CS 域) iFC(IMS) 5G SBA 触发(参考)
触发规则存储位置 HLR(CSI) HSS User Profile(XML) UDM 订阅数据 + NEF 事件
触发点粒度 BCSM 检测点 DP(粗) SPT 六类原子,CNF/DNF 组合(细) NF 服务订阅,事件驱动
业务与控制耦合 强耦合(状态机内挂触发) 松耦合(S-CSCF 仅路由,AS 执行逻辑) 完全解耦(SBI 微服务)
新业务上线 改交换机软件 改签约数据即可,零核心网改动 注册新 NF 服务
链式编排 难(串接 gsmSCF 复杂) Priority + 逐条返回,天然支持 事件总线编排
协议接口 CAP/INAP SIP over ISC(Diameter Cx 下载) HTTP/2 SBI

七、抓包识别与实战排错

7.1 抓包里如何认出 iFC 触发链

在 ISC 接口(S-CSCF ↔ TAS)抓包,一个 iFC 触发有以下识别特征: - Via 头部:经 S-CSCF 转发到 AS 的 INVITE,Via 链顶端是 S-CSCF 自己的地址(S-CSCF 在 ISC 上是 SIP 代理); - Route 头部:可能携带 AS 路由信息; - P-Asserted-Identity / P-Called-Party-ID:被叫侧触发时,P-Called-Party-ID 携带原始被叫 B,而 Request-URI 可能被改写——这是区分"被叫侧触发"的关键; - 业务标识:部分厂商在 INVITE 注入自定义头部(如华为 Service-Info、中兴的业务标记),可辅助识别具体 AS。

7.2 常见故障点与排错思路

故障现象 根因方向 排错切入点
业务不触发(TAS 收不到 INVITE) iFC 未命中:Priority 冲突、SessionCase 不符、SPT 条件写错、ProfilePartIndicator 错误 在 S-CSCF 开启 iFC 评估日志,核对 User Profile XML;确认会话情况归类
触发顺序错误(业务互相干扰) 多个 iFC 的 Priority 配置不当,AS 链顺序错 检查每条 iFC 的 Priority,按业务依赖重排
前转不生效 TAS 未签约 CFU;或 User-Data 未刷新;或 cause 未写入 History-Info 抓 ISC INVITE 确认 TAS 是否收到;查 TAS 内 CFU 开关(Ut/XCAP 自服务)
History-Info 丢失/环路 中间代理 strip 了头部;前转次数超限未拦截 全链路抓 History-Info;核对 TS 24.604 最大前转次数实现
AS 宕机后行为异常 DefaultHandling 配置错误 核对是 SESSION_CONTINUED 还是 SESSION_TERMINATED
未注册前转失败 ProfilePartIndicator=UNREGISTERED 的 iFC 缺失 检查 HSS 中未注册态 User Profile 是否下发
## 八、常见问题

Q1:iFC 和 sFC(后续过滤准则)有什么区别? A:iFC(Initial Filter Criteria)仅作用于初始请求(INVITE/REGISTER 等同一 Dialog 的第一个请求),在 S-CSCF 本地内存评估。sFC(subsequent Filter Criteria)理论上作用于同一会话的后续请求,但 3GPP 在标准化中发现 sFC 会引入复杂的会话状态维护与 AS 间同步问题,实际上 sFC 未被广泛标准化实现,业界统一用 iFC + AS 内部状态机来处理后续请求。这也是为什么你几乎只在文档里看到 iFC。

Q2:CFU 用 B2BUA 还是 302 重定向更好? A:标准(TS 24.604)两种都允许,但商用网络几乎一律用 B2BUA。原因:302 把前转决策与计费权交还给主叫域,无法在被叫域集中计费和执行前转次数限制(防环路);B2BUA 让 TAS 完全掌控 A-leg 和 C-leg,便于放音、计费、彩铃桥接。302 多用于与不支持 B2BUA 的传统网络互通。

Q3:为什么前转后的请求要再做一次 iFC 评估,不会死循环吗? A:因为前转改变了 Request-URI 和被叫身份,新被叫 C 可能有完全不同的服务链,必须重新评估。防死循环靠两点:① TS 24.604 规定的最大前转次数(通常实现为 5 次);② History-Info 中已出现过的目标不再重复前转;③ DefaultHandling 与 AS 内部逻辑的兜底。这也是为什么 History-Info 必须完整保留。

Q4:5G/VoNR 还在用这套 iFC 机制吗?有没有演进? A:完全在用。VoNR 的 IMS 业务层与 VoLTE 共用同一套 S-CSCF/AS/iFC 架构,5GC(AMF/SMF/UPF)只负责承载,IMS 信令通过 N3IWF/P-CSCF 接入。R18 在 IMS 侧的增强主要在边缘发现(EASDF)、紧急业务、与企业 API 暴露(CAPIF/SEAL)方向,iFC 评估逻辑本身自 Rel-7 以来高度稳定,未做根本性改动——这也是它设计成功的佐证。

Q5:如果两条 iFC 的 Priority 相同怎么办? A:标准未严格定义同优先级 iFC 的评估顺序,属实现相关。工程上应避免同优先级,配置时给每条 iFC 唯一且递增的 Priority 值,否则会出现业务触发顺序不可预测、跨厂商行为不一致的问题。排障时这是高频踩坑点。


参考来源

  1. 3GPP TS 23.218 V18.x — IP Multimedia (IM) session handling; IM Subsystem Service Control (ISC) Interface; Stage 2 — iFC 评估算法(Clause 5)、ISC 接口模型
  2. 3GPP TS 29.228 V18.0.0 — Cx and Dx interfaces based on the Diameter protocol; Signalling flows and messages — User Profile XML Schema(Annex B,含 iFC/SPT 结构 B.2.2)、SAR/SAA 信令流程
  3. 3GPP TS 24.604 V18.x — Communication Diversion (CDIV) using IP Multimedia (IM) Core Network (CN) subsystem; Protocol specification — CFU/CFB/CFNR 前转协议过程(Clause 4)、History-Info 与 cause-param 构造
  4. 3GPP TS 24.229 V18.x — IP Multimedia call control protocol based on Session Initiation Protocol (SIP) and Session Description Protocol (SDP) — IMS SIP 呼叫控制、S-CSCF 行为
  5. RFC 7044 — An Extension to the Session Initiation Protocol (SIP) for Request History Information — History-Info 头部与 cause 参数定义(前转溯源)
  6. 3GPP Explorer — IFC / SPT / CDIV 词条 — iFC、SPT、CDIV 机制的结构化解读与设计动机
  7. Nick vs Networking — IMS Routing with iFCs — iFC 结构与 TriggerPoint/SPT 工程化解析

本文由「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学通信知识星球海报-扫码加入