关联规范: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 共用的同一套服务控制逻辑。
在传统电路交换(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 不是一条独立的信令消息,而是 用户档案(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。
一个 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 内的具体服务,便于精确路由 |
触发点 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 只负责"路由递送",这正是控制反转的精髓。
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 的生命周期从 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 区分——这正是"未注册前转"(用户关机时仍能前转到语音信箱)得以工作的数据基础。
现在把 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: <sip:[email protected]>;cause=unconditional;index=1,<br/><sip:[email protected]>;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 通话
① 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",实为标准行为。
| 维度 | 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 |
在 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。
| 故障现象 | 根因方向 | 排错切入点 |
|---|---|---|
| 业务不触发(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 值,否则会出现业务触发顺序不可预测、跨厂商行为不一致的问题。排障时这是高频踩坑点。
本文由「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 等场景全覆盖。
