资讯详情

资讯详情

IMS计费机制深度解析:从信用控制到多网元关联的工程实践

简介面向IMS计费学习与工程实践者的中文版3GPP TS 32.260规范V17.3.0聚焦IP多媒体子系统计费管理适合从事核心网计费、运营商支撑系统开发及通信标准研究的技术人员用于理解在线与离线计费架构、计费数据记录与Diameter接口等关键机制。资源包共1个PDF文件约2.65MB为规范正文的中文译本涵盖前言、范围、参考文献、定义符号与缩写、架构注意事项、计费原理等章节并展开高级IMS架构、离线与在线计费架构及融合计费架构的说明。已有196人学习可作为对照英文原版精读的辅助材料。读者可从中系统掌握CDR生成、计费触发点、OCS与OFS分工、计费策略规则功能及Gx等接口协议理清从2G到4G多制式下计费环节的标准脉络为计费系统设计、联调排错与标准条款查阅提供直接参考。1. IMS 计费为什么一通电话的账单在挂断之前就已经算完了很多人以为计费是“事后算账”——通话结束话单落地后台批价出账。但在 IMS 域里这个直觉是错的。真正决定一通 VoLTE 电话能不能接通、能打多久、什么时候被强制拆线的往往不是核心网的信令处理能力而是计费系统在会话建立那一刻给出的“额度”。3GPP TS 32.260 这份规范讲的就是这套机制IMS 计费如何把一次 SIP 会话拆成可计量的信用单位又如何在离线、在线、融合三种模式下保证同一通电话不被重复计费、也不被漏计。搞懂它你才能理解为什么一个看似简单的200 OK背后可能已经完成了一次 Diameter 信用控制交互。这份中文版行标把 17.3.0 版本的架构、触发条件、消息流和错误场景都落到了具体章节是啃 IMS 计费底层机制时绕不开的原料。2. 计费架构的分层离线、在线与融合到底差在哪2.1 三种架构不是三套系统而是三种信任模型规范第 4 章把 IMS 计费架构拆成高级架构、离线计费架构、在线计费架构和融合计费架构四块。表面看是四张图底层其实是三种信任模型的选择。离线计费假设“先服务、后结算”网元只管把计费数据记下来通过 Rf 参考点送到 CDF计费数据功能再由 CGF计费网关功能落成 CDR。在线计费则假设“先授权、后服务”网元在会话建立或中期更新时必须先向 OCS 要额度拿到配额才放行媒体。融合计费是两者的折中同一个会话可以同时走在线和离线两条路径但计费标识必须一致否则对账时会出现两套互不相认的话单。这里的关键设计动机是IMS 的业务触发点太多S-CSCF、AS、IBCF、ATCF 都可能产生计费事件。如果每个网元各自为政运营商收到的就是一堆无法关联的碎片。规范用 ICIDIMS 计费标识符把同一会话在不同网元产生的计费数据串起来这个标识在 SIP 消息里随会话传递离线侧靠它做 CDR 关联在线侧靠它做配额归并。常见的实现思路是S-CSCF 在收到首个 INVITE 时生成 ICID写入 P-Charging-Vector 头域后续所有涉及该会话的网元都从这个头域里取而不是自己重新生成。2.2 参考点与基于服务接口的并存Rf 为什么没有退场规范 5.2.1.1 讲参考点 Rf 的规格5.2.1.2 讲基于服务的 Nchf 接口。这两者并存不是历史包袱而是部署形态差异。Rf 是 Diameter 时代的点对点接口网元配置好 CDF 地址后直接发 ACR计费请求适合传统电信机房里的静态组网。Nchf 是 SBA 架构下的服务化接口走 HTTP/2支持服务发现和负载均衡适合云化部署。规范没有强制二选一而是让网元根据自身支持的接口能力选择路径。从机制上看两者的计费语义是对齐的ACR 里的Service-Information和 Nchf 里的ChargingDataRequest承载的是同一套 IMS 计费信息包括会话标识、用户标识、媒体成分、时间戳和触发原因。差异在于传输层Rf 用 Diameter 的 AVP 编码Nchf 用 JSON/Protobuf 序列化。我一般会这么理解Rf 是“我知道 CDF 在哪直接敲门”Nchf 是“我先问服务注册中心再按返回的地址发请求”。前者简单但僵化后者灵活但多一跳发现开销。提示规范里 Rf 和 Nchf 的计费信息模型是同一套迁移时重点核对 AVP 到 JSON 字段的映射而不是重写业务逻辑。2.3 融合计费的真正难点一次会话两条账怎么保证不打架融合计费架构4.4 节允许同一会话同时产生在线配额消耗和离线 CDR。难点不在“同时记两笔”而在“两笔账能对上”。规范的做法是让在线和离线共享同一个 ICID 和同一个计费会话标识并且在在线侧的中期更新里携带已用量离线侧的 CDR 里也记录对应的时间窗口。这样后台对账时可以用 ICID 加时间窗口把在线扣费和离线话单匹配起来。如果实现时偷懒在线侧用一套会话 ID、离线侧用另一套对账就会变成血泪经验同一通电话在线扣了 60 秒离线话单记了 75 秒差额找不到出处。规范在 5.1.2.2 和 5.1.2.2A 里专门定义了 IMS 计费标识符和相关 ICID就是为了堵这个口子。常见的实现思路是网元在会话建立时只生成一次 ICID在线和离线两条路径都引用它任何一侧的中期更新都不重新生成。3. 计费触发与信用控制额度是怎么被“要”出来的3.1 触发条件不是拍脑袋而是挂在 SIP 状态机上规范 5.1.4 定义触发条件5.2.2 展开消息流。IMS 计费的触发点不是独立定时器而是挂在 SIP 会话状态机的关键迁移上会话建立INVITE 到 200 OK、中期程序re-INVITE 或 UPDATE、会话释放BYE。在线计费下这些点对应信用控制请求建立时申请初始配额中期时申请增量配额并上报已用量释放时上报最终用量并退还剩余配额。为什么挂在 SIP 状态机上因为计费必须和媒体实际可用性强绑定。如果计费触发和 SIP 信令脱节就会出现“信令已通、媒体未通却开始扣费”或者“媒体已断、计费还在跑”的翻车场景。规范把触发条件写成“SIP 事务成功完成”而不是“收到某条消息”就是为了让计费动作跟随会话的真实生命周期。3.2 在线计费的信用控制循环一个伪代码看清配额申请下面这段伪代码按规范 5.2.2.1.1 和 5.2.2.1.3 的语义模拟 S-CSCF 在在线计费下的信用控制循环。它不是规范原文而是把消息流里的关键判断抽出来方便看清“申请—使用—上报—再申请”的闭环。# 模拟 IMS 在线计费信用控制循环语义对齐 TS 32.260 5.2.2 def handle_session(sip_session, ocs_client): # 会话建立申请初始配额携带 ICID 和请求的单元数 initial_request build_ccr( session_idsip_session.icid, subscribersip_session.user, requested_units60, # 请求 60 秒额度 triggerSESSION_START ) grant ocs_client.send(initial_request) if grant.granted_units 0: # 配额为零规范要求拒绝会话不能先放行再补授权 sip_session.reject(reasonINSUFFICIENT_CREDIT) return sip_session.start_media(grant.granted_units) # 中期程序用量接近阈值时申请增量同时上报已用量 while sip_session.active: if sip_session.used_units grant.threshold: update_request build_ccr( session_idsip_session.icid, used_unitssip_session.used_units, requested_units60, triggerMID_SESSION ) grant ocs_client.send(update_request) if grant.granted_units 0: # 增量配额为零规范要求终止会话 sip_session.terminate(reasonCREDIT_EXHAUSTED) break sip_session.extend_quota(grant.granted_units) # 会话释放上报最终用量退还未使用配额 final_request build_ccr( session_idsip_session.icid, used_unitssip_session.used_units, triggerSESSION_END ) ocs_client.send(final_request)这段逻辑里有两个容易踩坑的参数requested_units和threshold。前者是向 OCS 要多少额度后者是已用量达到多少时触发中期申请。规范没有规定具体数值而是留给运营商策略配置。常见的实现思路是 threshold 设为 granted_units 的 80% 左右留出申请往返的余量避免额度用尽时增量请求还没回来导致会话被误杀。trigger字段则决定 OCS 侧走哪条计费规则SESSION_START、MID_SESSION、SESSION_END 对应不同的批价逻辑写错会导致话单归类错误。3.3 离线计费的 ACR 事件为什么释放时还要再发一次离线计费虽然不控制额度但消息流并不简单。规范 5.2.2.1.4 的会话释放流程里网元在 BYE 之后仍要发一次 ACR携带最终用量和会话时长。原因是离线计费的 CDR 需要闭合建立时的 ACR 只记录了开始时间和初始媒体描述释放时的 ACR 才补上结束时间和实际用量。如果只发建立不发释放CDF 侧会留下一条没有结束标记的半开话单后台批价时要么丢弃要么按异常处理。这里的设计取舍是离线计费允许“先记后补”但补的时机必须紧跟会话释放不能拖到定时器超时。规范在 5.2.2.2 的错误场景里专门提到如果释放 ACR 发送失败网元需要重试重试仍失败则本地缓存并在链路恢复后补发。常见的实现思路是给 ACR 加一个本地持久化队列按 ICID 去重避免重试导致重复话单。4. 多网元计费关联ICID 与接入网标识怎么串起整条链路4.1 ICID 的生成与传递谁生成、谁透传、谁不能改规范 5.1.2.2 明确 ICID 由发起会话的网元生成写入 P-Charging-Vector 头域后续网元透传。这里的关键约束是“透传不改”中间网元可以读取 ICID 用于自己的计费记录但不能重新生成或覆盖。原因是 ICID 是跨网元关联的唯一锚点一旦被改S-CSCF 的话单和 AS 的话单就对不上。实际部署里这个约束经常被打破。某类 AS 在作为 B2BUA 时如果实现不规范可能会把收到的 INVITE 拆成两个独立会话各自生成 ICID结果一次通话在计费系统里变成两条互不相关的记录。规范 5.1.7 专门讲了“来自作为 B2BUA 的 AS/ATCF 的单一计费会话”要求这类网元在拆分信令时保持计费会话的唯一性。常见的实现思路是B2BUA 在内部维护入向和出向的映射表两个方向共用同一个 ICID只在 CDR 里用不同的功能实体标识区分。4.2 接入网计费标识与运营商间标识跨域对账的钥匙5.1.2.3 的接入网计费标识和 5.1.2.4 的运营商间标识解决的是“同一用户在不同网络接入时话单怎么归集”的问题。接入网计费标识由接入网侧生成随 SIP 消息带入 IMS 域用于把 IMS 话单和接入网话单关联起来。运营商间标识则用于跨运营商结算当会话经过 IBCF 转接时双方用这个标识核对流量归属。这两个标识的设计动机是IMS 计费不能只看 IMS 域内的网元用户的实际接入方式比如通过某种无线接入会影响成本分摊。如果只记 IMS 侧的话单跨运营商结算时就缺少接入侧的凭证。规范把它们放进 P-Charging-Vector就是为了让计费信息随信令走而不是靠后台文件交换。4.3 功能实体标识列表一张话单里为什么有多个网元名字5.1.2.8 定义了功能实体标识列表允许一条计费记录里携带多个参与网元的标识。这看起来是冗余实际是排障刚需。当一通电话出现计费争议时后台需要知道这条话单经过了哪些网元S-CSCF 记了会话建立AS 记了业务触发IBCF 记了转接。如果只记一个网元名排障时就得靠时间戳猜路径效率极低。常见的实现思路是每个网元在写计费记录时把自己的功能实体标识追加到列表里而不是覆盖前一个。列表的顺序反映信令经过的顺序后台可以据此还原会话路径。这个字段在规范里不算显眼但在实际对账和故障定位时往往是黑匣子里的关键线索。5. 避坑与排查IMS 计费落地时最容易翻车的几个点5.1 现象在线会话建立成功但媒体不通计费却已开始扣费原因网元在收到 OCS 的配额授权后先启动了计费计时器再等待媒体协商完成。如果媒体协商失败比如 SDP 协商不成功计费侧已经按授权额度开始消耗但用户实际没有通话。规范 5.1.3 的 SDP 处理要求计费信息与媒体描述对齐但实现时容易把“授权成功”等同于“媒体可用”。解决把计费启动点挂在媒体通道确认之后而不是配额授权之后。在线计费下配额授权只代表“可以放行”不代表“已经放行”。如果媒体协商失败应立即发终止请求退还配额而不是等会话超时。5.2 现象同一通电话在离线话单里出现两条记录时长各算一半原因B2BUA 类网元把入向和出向当成两个独立会话各自生成 ICID 并各自发 ACR。CDF 侧收到两条不同 ICID 的记录无法合并。规范 5.1.7 要求单一计费会话但实现时如果 B2BUA 的内部映射表没把两个方向绑到同一个 ICID就会翻车。解决在 B2BUA 内部建立入向会话 ID 到出向会话 ID 的映射两个方向共用发起侧生成的 ICID。CDR 里用功能实体标识区分方向而不是用 ICID 区分。5.3 现象中期更新时 OCS 返回配额为零会话被拆线但用户还有余额原因中期 CCR 里上报的used_units超过了实际用量或者requested_units填得过大OCS 按策略判定额度不足。规范 5.2.2.1.3 的中期程序要求上报已用量但“已用量”的统计口径如果和 OCS 侧不一致比如一边按秒、一边按分钟就会出现误判。解决统一计量单位和取整规则在会话建立时的首次 CCR 里就明确单位。中期上报的已用量应该是“自上次上报以来的增量”而不是“会话累计总量”除非 OCS 侧明确要求累计值。这个口径要在网元和 OCS 的对接文档里写死不能靠猜。5.4 现象会话释放的 ACR 丢失后台出现半开话单原因BYE 之后网元立即释放了会话上下文ACR 发送失败后没有重试机会。规范 5.2.2.2 的错误场景要求重试但实现时如果 ACR 发送是异步的且没有持久化进程重启或链路抖动就会丢。解决ACR 发送前先落本地持久化队列按 ICID 去重发送成功后再删除。重试策略要有上限和退避避免链路恢复后瞬间冲击 CDF。半开话单的排查方法是按 ICID 查建立和释放两条记录缺释放的那条就是丢失点。5.5 现象跨运营商结算时双方话单对不上差额找不到出处原因运营商间标识没有随信令正确传递或者 IBCF 在转接时重新生成了标识。规范 5.1.2.4 要求该标识在运营商间保持稳定但转接网元如果把它当成“本网标识”处理就会破坏对账锚点。解决IBCF 在转接时透传运营商间标识不重新生成。结算对账时以该标识加时间窗口为键而不是以 ICID 为键因为 ICID 在跨网场景下可能被不同运营商各自解释。对不上的差额先查标识传递链路再查时间窗口是否对齐。6. 设计取舍为什么规范把“关联”看得比“精确”更重翻完这份规范最值得琢磨的不是某个消息流的细节而是它在“精确计费”和“可关联计费”之间的取舍。IMS 域里一次会话可能经过 S-CSCF、多个 AS、IBCF、ATCF每个网元都有自己的时钟、自己的会话视图、自己的失败重试逻辑。如果追求单点精确每个网元都独立算一份账后台合并时必然打架。规范的选择是先保证所有网元用同一套标识ICID、接入网计费标识、运营商间标识把记录串起来再在这个基础上做批价和對账。精确性让位于可关联性因为不可关联的精确记录在跨网元场景下等于不可用。这个取舍在在线计费里体现得更明显。规范没有规定配额单元的具体数值也没有规定中期更新的触发阈值而是把这些留给运营商策略。它只强制一件事配额申请和用量上报必须携带同一个计费会话标识。这意味着不同运营商可以有不同的额度策略但跨网结算时仍然能对上账。我一般会这么理解规范管的是“账本怎么装订”不管“每页写多少”。验证这套机制是否落地正确最直接的方法不是读代码而是抓一次真实会话的完整信令按 ICID 把各网元的计费记录拉出来看建立、中期、释放三个点是否闭合看在线和离线两条路径的用量是否在容差内一致。如果对不上先查标识传递再查时间窗口最后才查批价规则。这个顺序能省掉大量无效排查。从那以后我每次接触 IMS 计费相关的实现都强制先画一张 ICID 流转图把每个网元在哪个环节读、哪个环节写标清楚再去看代码里的计费触发点。这张图对不上的地方往往就是后面话单对不上的地方。希望帮到你。本文还有配套的精品资源点击获取
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →