在IMS架构中,S-CSCF(Serving Call Session Control Function)是会话控制的核心节点,但它本身不执行任何业务逻辑。所有增值服务——呼叫转接、语音信箱、号码显示、视频彩铃——都由AS(Application Server)提供。那么问题来了:S-CSCF如何知道一条SIP消息应该被路由到哪些AS?
答案就是初始过滤准则(Initial Filter Criteria, iFC)——一套XML编码的规则集,存储在HSS的用户签约数据中,在用户注册时通过Cx接口下载到S-CSCF。iFC定义了触发条件(Trigger Point)和目标AS,S-CSCF按优先级逐一评估,匹配则转发,不匹配则跳过。
这套机制的本质是一个五维匹配引擎,通过五种Service Point Trigger(SPT)对SIP消息进行多维度特征提取和布尔逻辑组合判定,最终形成一条有序的AS触发链。
| 规范编号 | 内容 | 关键章节 |
|---|---|---|
| TS 23.218 | IMS会话处理与呼叫模型 | Section 5.2, 6.1 |
| TS 29.228 | Cx/Dx接口信令流 | Section 6.1, A.2 |
| TS 29.229 | Cx/Dx Diameter协议 | Section 7 |
| TS 24.229 | IMS SIP/SDP程序 | Section 5.4.1, 5.4.2 |
| TS 23.228 | IMS架构总体 | Section 4.3.3 |
iFC的获取时机是用户IMS注册流程中S-CSCF向HSS发起Server-Assignment-Request(SAR)时。HSS在Server-Name-Answer(SAA)中携带完整的User-Data AVP,其中包含所有iFC。
sequenceDiagram
participant UE
participant P-CSCF
participant I-CSCF
participant HSS
participant S-CSCF
participant AS1
participant AS2
UE->>P-CSCF: SIP REGISTER (Public Identity)
P-CSCF->>I-CSCF: SIP REGISTER
I-CSCF->>HSS: Diameter UAR (User-Authorization-Request)
HSS-->>I-CSCF: Diameter UAA (S-CSCF能力集/已分配S-CSCF)
I-CSCF->>S-CSCF: SIP REGISTER (转发)
S-CSCF->>HSS: Diameter MAR (Multimedia-Auth-Request)
HSS-->>S-CSCF: Diameter MAA (认证向量)
Note over S-CSCF: 执行IMS-AKA认证<br/>(401 Unauthorized挑战)
S-CSCF->>HSS: Diameter SAR (Server-Assignment-Request)<br/>Server-Assignment-Type=REGISTRATION
HSS-->>S-CSCF: Diameter SAA (Server-Assignment-Answer)<br/>User-Data AVP包含完整iFC集
Note over S-CSCF: 解析并缓存用户签约数据<br/>包括所有iFC规则
rect rgb(255, 240, 240)
Note over S-CSCF,AS2: 第三方注册:S-CSCF根据iFC触发AS
S-CSCF->>S-CSCF: 评估iFC:Method=REGISTER匹配?
S-CSCF->>AS1: SIP REGISTER (第三方注册,Priority=1)
AS1-->>S-CSCF: 200 OK
S-CSCF->>AS2: SIP REGISTER (第三方注册,Priority=2)
AS2-->>S-CSCF: 200 OK
end
S-CSCF-->>I-CSCF: SIP 200 OK
I-CSCF-->>P-CSCF: SIP 200 OK
P-CSCF-->>UE: SIP 200 OK
SAA消息中的User-Data AVP采用XML格式编码(TS 29.228 Appendix A定义了XML Schema),其核心层级如下:
User-Data (XML)
├── Public-Identification
│ ├── Public-Identity (sip:user@domain)
│ ├── Barring-Indication (0/1)
│ └── Identity-Type (1=Public User ID)
├── CoreNetworkServiceAuthorization
│ └── Subscribed-Media-Profile-ID
├── ServiceProfile
│ ├── PublicIdentity
│ │ └── (关联的Public Identity)
│ ├── InitialFilterCriteria (iFC #1, Priority=1)
│ │ ├── Priority
│ │ ├── TriggerPoint
│ │ │ ├── ConditionTypeCNF
│ │ │ └── SPT[] (多个SPT)
│ │ ├── ApplicationServer
│ │ │ ├── ServerName (sip:as1.operator.com)
│ │ │ ├── DefaultHandling (0/1)
│ │ │ └── ServiceInfo (可选)
│ │ └── ProfilePartIndicator (可选)
│ ├── InitialFilterCriteria (iFC #2, Priority=2)
│ │ └── ...
│ └── InitialFilterCriteria (iFC #N)
├── ChargingInformation
└── MSISDN
| 命令 | 缩写 | 方向 | 用途 |
|---|---|---|---|
| User-Authorization-Request/Answer | UAR/UAA | I-CSCF→HSS | 注册/去注册时查询S-CSCF分配 |
| Server-Assignment-Request/Answer | SAR/SAA | S-CSCF→HSS | S-CSCF分配 + 用户数据下载 |
| Multimedia-Auth-Request/Answer | MAR/MAA | S-CSCF→HSS | 获取认证向量 |
| Location-Info-Request/Answer | LIR/LIA | I-CSCF→HSS | 来话时查询S-CSCF地址 |
| Registration-Termination-Request/Answer | RTR/RTA | HSS→S-CSCF | HSS发起去注册 |
| Push-Profile-Request/Answer | PPR/PPA | HSS→S-CSCF | 用户数据变更推送(含iFC更新) |
关键设计意图:PPR(Push-Profile-Request)机制确保运营商修改用户iFC后无需等待用户重新注册,HSS会主动推送更新到S-CSCF,实现了iFC的动态管理。
每个iFC的核心是Trigger Point(触发点),它是一个由多个SPT(Service Point Trigger)通过布尔逻辑组合而成的表达式。SPT是匹配引擎的最小原子条件,共定义了五种匹配维度:
graph TB
subgraph "SPT 五维匹配空间"
D1["① Request-URI<br/>匹配SIP请求行URI"]
D2["② SIP Method<br/>匹配INVITE/REGISTER等"]
D3["③ SIP Header<br/>匹配特定头部内容"]
D4["④ Session Case<br/>匹配主叫/被叫/未注册被叫"]
D5["⑤ Session Description<br/>匹配SDP媒体描述"]
end
subgraph "SPT属性"
CN["ConditionNegated<br/>0=正向匹配 1=取反"]
GR["Group<br/>分组编号用于逻辑组合"]
end
D1 --> |"SPT实例"| E1["例: RequestURI=sip:vm.operator.com"]
D2 --> |"SPT实例"| E2["例: Method=INVITE"]
D3 --> |"SPT实例"| E3["例: Header=Content-Type<br/>Content=application/sdp"]
D4 --> |"SPT实例"| E4["例: SessionCase=0 (Originating)"]
D5 --> |"SPT实例"| E5["例: Line=m=video<br/>Content=video"]
| 维度 | XML元素 | 匹配对象 | 典型应用 |
|---|---|---|---|
| ① Request-URI | <RequestURI> |
SIP请求行的R-URI | 路由到特定服务号码(如sip:[email protected] → 语音信箱AS) |
| ② SIP Method | <Method> |
SIP方法名 | 区分INVITE(呼叫)、REGISTER(注册)、MESSAGE(短信)触发不同AS |
| ③ SIP Header | <SIPHeader> |
指定SIP头部的存在/内容 | 匹配From头部的特定域名、Content-Type头部判断消息体类型 |
| ④ Session Case | <SessionCase> |
会话方向 | 0=Originating(主叫),1=Terminating(被叫),2=Originating-Unregistered,3=Terminating-Unregistered |
| ⑤ Session Description | <SessionDescription> |
SDP消息体内容 | 匹配m=行(媒体类型)、a=行(属性如rtcp、fmtp) |
SessionCase是iFC最精妙的设计之一,它将用户的注册状态与呼叫方向进行正交组合:
| SessionCase值 | 含义 | 触发场景 |
|---|---|---|
| 0 | Originating | 已注册用户发起呼叫 |
| 1 | Terminating | 已注册用户接收呼叫 |
| 2 | Originating-Unregistered | 未注册用户发起请求(实际很少使用) |
| 3 | Terminating-Unregistered | 未注册用户被呼叫(触发语音信箱、呼叫前转) |
设计意图:SessionCase=3是最常用的未注册场景触发条件。当用户关机或不在线时,来话会在S-CSCF被评估,匹配SessionCase=3的iFC后路由到语音信箱AS或呼叫前转AS。
多个SPT如何组合成最终的触发条件?3GPP定义了两种布尔逻辑模式,通过ConditionTypeCNF字段控制:
ConditionTypeCNF = 1(默认模式)
(SPT_A ∨ SPT_B) ∧ (SPT_C ∨ SPT_D)ConditionTypeCNF = 0
(SPT_A ∧ SPT_B) ∨ (SPT_C ∧ SPT_D)| 逻辑类型 | ConditionTypeCNF | 组内运算 | 组间运算 | 适用场景 |
|---|---|---|---|---|
| CNF | 1 | OR | AND | 多条件同时满足(如:方法=INVITE 且 方向=主叫) |
| DNF | 0 | AND | OR | 多条件任一满足(如:方法=INVITE 或 方法=MESSAGE) |
<InitialFilterCriteria>
<Priority>0</Priority>
<TriggerPoint>
<ConditionTypeCNF>1</ConditionTypeCNF>
<!-- Group 0: 方法匹配 -->
<SPT>
<ConditionNegated>0</ConditionNegated>
<Group>0</Group>
<Method>INVITE</Method>
</SPT>
<!-- Group 1: 会话方向匹配 -->
<SPT>
<ConditionNegated>0</ConditionNegated>
<Group>1</Group>
<SessionCase>0</SessionCase>
</SPT>
</TriggerPoint>
<ApplicationServer>
<ServerName>sip:tas.operator.com</ServerName>
<DefaultHandling>0</DefaultHandling>
</ApplicationServer>
</InitialFilterCriteria>
评估过程(CNF模式):
- Group 0:Method == "INVITE" → TRUE
- Group 1:SessionCase == 0(Originating)→ TRUE
- 最终:TRUE AND TRUE → 匹配 → 转发到TAS
ConditionNegated = 1可以实现"非"逻辑。例如,排除REGISTER方法的iFC:
<SPT>
<ConditionNegated>1</ConditionNegated>
<Group>0</Group>
<Method>REGISTER</Method>
</SPT>
这意味着:当SIP方法不是REGISTER时匹配成功——即对所有非注册消息都触发。
一个用户通常签约多个业务,因此有多条iFC。S-CSCF按Priority字段从小到大评估,形成一条AS触发链。
flowchart TD
SIP["SIP消息到达S-CSCF"] --> SORT["按Priority排序所有iFC"]
SORT --> EVAL["取出当前iFC<br/>评估Trigger Point"]
EVAL --> |"匹配"| FORWARD["转发SIP消息到AS"]
EVAL --> |"不匹配"| NEXT["跳过,取下一条iFC"]
FORWARD --> WAIT["等待AS响应"]
WAIT --> |"AS返回响应"| MODIFY["S-CSCF用AS响应<br/>更新SIP消息"]
WAIT --> |"AS超时/不可达"| DH{"DefaultHandling?"}
DH --> |"0=继续"| NEXT
DH --> |"1=终止"| ERR["返回错误响应<br/>终止会话"]
MODIFY --> NEXT
NEXT --> EVAL2{"还有下一条iFC?"}
EVAL2 --> |"是"| EVAL
EVAL2 --> |"否"| ROUTE["正常路由转发SIP消息"]
style SIP fill:#e1f5fe
style ERR fill:#ffcdd2
style ROUTE fill:#c8e6c9
当AS不可达时,DefaultHandling决定了系统的容错行为:
| DefaultHandling值 | 行为 | 适用场景 |
|---|---|---|
| 0 | 继续处理(Continue) | 非关键业务(如彩铃、号码显示) |
| 1 | 终止会话(Terminate) | 关键业务(如合法拦截、紧急呼叫) |
博弈分析:如果语音信箱AS的DefaultHandling设为Terminate,当AS故障时所有未注册用户的来话都会失败;如果设为Continue,来话会正常振铃但无语音信箱功能。运营商需要根据业务SLA权衡。
一个开通了VoLTE的基础用户,签约了以下业务:
| 优先级 | 业务 | AS | 触发条件 |
|---|---|---|---|
| 0 | Telephony Application Server (TAS) | sip:tas.operator.com | Method=INVITE, SessionCase=Originating |
| 1 | TAS (被叫侧) | sip:tas.operator.com | Method=INVITE, SessionCase=Terminating |
| 2 | 语音信箱 | sip:vm.operator.com | Method=INVITE, SessionCase=Terminating-Unregistered |
| 3 | 短信over IP | sip:smsoverip.operator.com | Method=MESSAGE |
| 4 | 补充业务管理 (UT接口) | sip:ut-as.operator.com | Method=INVITE, RequestURI=sip:operator.com (特征码) |
sequenceDiagram
participant UE_A as 主叫UE
participant P-CSCF
participant S-CSCF
participant TAS
participant I-CSCF_B
participant S-CSCF_B as 被叫S-CSCF
UE_A->>P-CSCF: SIP INVITE (SDP offer)
P-CSCF->>S-CSCF: SIP INVITE
Note over S-CSCF: 评估iFC链
rect rgb(232, 245, 233)
Note over S-CSCF,TAS: iFC Priority=0匹配:Method=INVITE ∩ SessionCase=Orig
S-CSCF->>TAS: SIP INVITE (转发到TAS)
Note over TAS: 执行主叫业务逻辑<br/>检查呼叫限制/补充业务
TAS-->>S-CSCF: SIP INVITE (可能修改SDP/头部)
end
rect rgb(255, 243, 224)
Note over S-CSCF: iFC Priority=1-4逐一评估,均不匹配
end
S-CSCF->>I-CSCF_B: SIP INVITE (路由到被叫域)
I-CSCF_B->>S-CSCF_B: SIP INVITE
Note over S-CSCF_B: 被叫侧iFC评估
rect rgb(232, 245, 233)
Note over S-CSCF_B,TAS: iFC Priority=1匹配:Method=INVITE ∩ SessionCase=Term
S-CSCF_B->>TAS: SIP INVITE
Note over TAS: 执行被叫业务逻辑<br/>CFU/CFB/语音信箱判断
TAS-->>S-CSCF_B: SIP INVITE (或302重定向)
end
当被叫用户未注册(关机/脱网)时,I-CSCF通过LIR/LIA查询HSS发现用户无活跃S-CSCF,但仍可能分配一个S-CSCF来处理未注册态逻辑。此时SessionCase=3的iFC被触发:
S-CSCF收到INVITE → 用户未注册 → SessionCase=3
→ 评估iFC: Priority=2匹配 → 转发到语音信箱AS
→ AS返回302 Moved Temporarily(Redirect到语音信箱号码)
→ 或AS作为Back-to-Back User Agent直接应答
第三方注册(Third-Party Registration)是iFC最典型的应用场景之一。当用户完成IMS注册后,S-CSCF不仅缓存iFC,还会立即评估所有匹配REGISTER方法的iFC,向对应AS发起第三方REGISTER。
| 维度 | 用户REGISTER | 第三方REGISTER |
|---|---|---|
| 发起方 | UE | S-CSCF(代理用户) |
| From头 | 用户Public Identity | S-CSCF的URI |
| To头 | 用户Public Identity | 用户Public Identity |
| Contact头 | UE的Contact | S-CSCF的Contact |
| 路由 | UE→P-CSCF→I-CSCF→S-CSCF | S-CSCF→AS |
| 目的 | 注册用户位置 | 通知AS用户已上线 |
S-CSCF在收到SAA(包含用户数据和iFC)后,按以下步骤执行:
AS的行为选择博弈:
一个精细但容易被忽略的字段是ProfilePartIndicator,它允许同一用户在不同注册状态下使用不同的iFC集合。
| ProfilePartIndicator值 | 含义 | 效果 |
|---|---|---|
| 0 | REGISTERED | 仅在用户已注册时该iFC生效 |
| 1 | UNREGISTERED | 仅在用户未注册时该iFC生效 |
| 不存在 | 全局 | 无论注册状态均生效 |
设计意图:这个字段解决了"同一AS在不同注册状态下需不同触发策略"的问题。例如: - 已注册状态:INVITE触发TAS执行呼叫限制检查 - 未注册状态:INVITE触发语音信箱AS
没有ProfilePartIndicator时,需要依赖SessionCase SPT来区分,但ProfilePartIndicator提供了更细粒度的控制——某些iFC可能仅在注册态生效(如视频彩铃),某些仅在未注册态生效(如呼叫前转无应答)。
| 观察对象 | 协议层 | 过滤条件 | 关键信息 |
|---|---|---|---|
| iFC下载 | Diameter | cmd-code == 301 (SAA) |
User-Data AVP中的XML内容 |
| 第三方注册 | SIP | From.contains("scscf") && Method == "REGISTER" |
S-CSCF到AS的REGISTER |
| AS触发 | SIP | 源/目的IP为S-CSCF和AS | SIP消息在S-CSCF与AS间的转发 |
| PPR推送 | Diameter | cmd-code == 309 (PPR) |
HSS推送的更新iFC |
场景1:AS未被触发——iFC不匹配
场景2:第三方注册失败——AS返回错误
场景3:iFC更新不生效——PPR未推送
在5G VoNR架构中,IMS作为5GC的"应用层"通过N6/N6a接口与5G核心网交互。iFC机制本身没有根本性变化,但有以下演进:
Q1: iFC和TAS有什么关系?TAS是iFC的一部分吗?
A: 不是。iFC是触发规则,TAS是Application Server。iFC定义了"在什么条件下把SIP消息转发到哪里",TAS是"被转发到的目标"。类比:iFC是路由表中的规则,TAS是下一跳地址。一个用户可以有多条iFC指向不同的AS(TAS、语音信箱AS、SMS-AS等),也可能有多条iFC指向同一个TAS但触发条件不同(主叫/被叫)。
Q2: CNF和DNF哪种更常用?实际网络中如何选择?
A: CNF(ConditionTypeCNF=1)是默认且最常用的模式。实际网络中约90%的iFC使用CNF。CNF适合"多条件同时满足"的场景(如方法=INVITE且方向=主叫),这覆盖了绝大多数业务触发需求。DNF适合"多种触发条件任一满足"的场景(如方法=INVITE或方法=MESSAGE都触发同一AS),这类需求较少但确实存在。建议优先使用CNF以保持配置一致性。
Q3: 如果两条iFC的Priority相同会怎样?
A: 根据TS 24.229,Priority值必须在用户签约数据内唯一。如果配置错误导致Priority重复,S-CSCF的行为取决于厂商实现——可能按XML中出现顺序处理,也可能报错拒绝加载。在运营商OSS/BSS系统中,业务发放平台通常会在iFC下发前做Priority唯一性校验。
Q4: 第三方注册失败会导致用户注册失败吗?
A: 不会。第三方注册是S-CSCF到AS的行为,与UE的注册流程解耦。UE的REGISTER 200 OK在S-CSCF完成认证和SAA处理后就会返回给UE,第三方注册在此之后异步执行。如果第三方注册失败,AS的后续业务功能可能不可用,但用户的IMS注册状态不受影响。
Q5: HSS修改iFC后,用户需要重新注册才能生效吗?
A: 不一定。如果S-CSCF在注册时通过Subscribe-Notification机制订阅了HSS的用户数据变更通知,HSS会通过PPR(Push-Profile-Request)主动推送更新的iFC。如果S-CSCF不支持或未订阅此机制,则需要等待用户重新注册(或发起管理员触发的去注册再注册)。
本文由「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 等场景全覆盖。
