处理Diameter协议消息的方法

文档序号:6603552阅读:715来源:国知局
专利名称:处理Diameter协议消息的方法
技术领域
本发明涉及通信技术领域,尤其涉及一种处理Diameter协议消息的方法。
背景技术
Diameter协议被IETF的AAA工作组作为下一代的AAA协议标准。Diameter (为直径,意味着Diameter协议是RADIUS协议的升级版本)协议包括基本协议、NAS (网络接 入服务)协议、EAP(可扩展鉴别)协议、MIP(移动IP)协议、CMS(密码消息语法)协议等。 Diameter协议支持移动IP、NAS请求和移动代理的认证、授权和计费工作,协议的实现和 RADIUS类似,也是采用AVP (Attribute Value Pair,属性值对)来实现,但是其中详细规定 了错误处理、failover机制,采用TCP协议,支持分布式计费,克服了 RADIUS的许多缺点, 是最适合未来移动通信系统的AAA协议。各通信运营商对Diameter协议的实现,主要涉及中国移动的Diameter协议、中国 电信的OCP协议和中国联通的DCC(Diameter Credit Control)协议。应用的场景有(1) 网元设备和在线计费系统(Online ChargingSystem)交互;(2)在线计费系统和余额管理 中心交换等等。在线计费系统(Online Charging System,简称0CS)是指参与通信过程控 制的计费系统,能够解决用户实时信用控制、预付费使用数据业务和增值业务实时计费等 问题。OCS是3GPP网络架构中最重要的组成部分之一。为更好地指导3G环境下计费支 撑体系的建设,3GPP组织在32. 815提出了 OCS的参考结构,给出了具有开放性和通用性的 实时计费系统框架,支持基于承载、会话和内容事件的统一计费。这一框架将话务控制功能 与计费功能相分离,使计费系统参与到服务的使用过程中,用户边使用业务,OCS边计费。作 为系统协议支撑Diameter,必须提供有力的实时性保证。现有的Diameter实现性能存在一 定的瓶颈,在一定程度上限制了 OCS的并发处理能力。Diameter消息体可以认为是一个Grouped类型AVP,每个Grouped类型的AVP里 面包含一组AVP (可以是Grouped类型)元素,也就是说,Diameter的消息体为多个AVP (属 性值对,即消息中的信息单元)组成,因此Diameter消息可以看作以AVP元素作为节点的 树。现在以电信的信用控制请求(Credit-Control-Request)消息为例,使用ABNF格式定 义如下<Credit-Control-Request) = <Diameter Header 272, REQ, PXY>Diameter ^ 议头,REQ表示该消息为一个请求消息,其中272表示由Diameter协议标准组织分配该命 令码的值;<Session-Id>{Origin-Host}源主机信息{Origin-Realm}源服务域信息{Destination-Realm}目的服务域信息{Auth-App1i cat i on-Id}
{Service-Context-Id}{CC-Request-Type}{CC-Request-Number}[Destination-Host][User-Name]
[Origin-State-Id][Event-Timestamp]*[Subscription-Id][Termination-Cause]氺[Route-Record][Requested-Action][Requested-Service-Unit]*[Used-Service-Unit][Multiple-Services-Indicator]*[Multiple-Services-Credit Control][CC-Correlation-Id][User-Equipment-Info]*[Proxy-Info][Service-Information];“<>”符号表示必选而且位置必须是在消息的开头的AVP,“{}”符号表示必选的 AVP, “ [] ”符号表示可选的AVP,“* [] ”符号表示可重复的可选的AVP0针对以上Diameter消息结构抽象出的主要类有,用于存储AVP属性和值的 类(⑶iameterAVP),用于管理AVP的容器(OTiameterGroup)和用于管理整个消息的类 (CDiameterMessage)。这些类实现基本消息结构和基本数据的存储,通过这些类可以很轻松的搞定消息 的管理。由于Diameter消息中存在“[]”和“*[] ”类型的AVP,每个消息的结构都不是固 定的。因此每次Diameter消息使用时都必须做一次OTiameterMessage的构造和析构操 作,对应的CDiameterGroup和CDiameterAVP也需要构造和析构。如果以new(生成)和 delete (销毁)操作时间为1 μ s (UNIX机器实测结果)来计算,具有100个AVP的消息其 自身消耗的时间大概就是0. Ims0现在以电信OCS系统为例,当系统压力为1000CAPS(Call Attempts Per Second,每秒建立呼叫数量)时,每秒处理的CCR消息数目为2500个,每个 消息业务处理的时间为0. 4ms。消息自身处理时间和业务处理时间是同一个数量级,这个处 理性能是满足不了 OCS系统的。或许内存池可以解决这个问题,当发生频繁的内存操作时 大家倾向于利用内存池来解决。但是,内存池只是解决了消息new和delete的性能,并没 有解决消息中所有AVP的生成和销毁问题,采用内存池的实测结果也是同样的性能,因此 并不能有效缩短消息处理时间。

发明内容
因此,本发明的目的在于提供一种处理Diameter协议消息的方法,减少Diameter协议消息对象的生成和销毁对系统资源的消耗。为实现上述目的,本发明提供一种处理Diameter协议消息的方法,其包括如下步 骤步骤1、应用根据Diameter消息的id获取内存中预先存储的Diameter消息模板, 并把该Diameter消息模板的结构作为构建Diameter消息对象结构的初始状态;步骤2、根据实际的消息结构,增加或删除Diameter消息对象结构中的AVP对象, 从而修改Diameter消息对象的结构;步骤3、用栈来记录步骤2中对Diameter消息结构的每次操作;步骤4、应用使用完消息后,根据栈中的记录,将Diameter消息对象的结构恢复为 初始状态。其中,步骤2中,如果增加或删除的AVP对象为Grouped类型的AVP对象,采用递 归方式处理所有的AVP对象。其中,对于Diameter消息的接收方来说,步骤1中使用的Diameter消息模板为空 结构。其中,步骤1中,如果内存中该Diameter消息模板数量为1,则先克隆该Diameter 消息模板,然后在克隆的Diameter消息模板基础上构建Diameter消息对象的结构。其中,在步骤3中,将步骤2中对Diameter消息结构的每次操作依次压栈;步骤4 中恢复Diameter消息对象的结构时,将步骤3中记录的操作依次出栈。其中,在内存中以Diameter消息模板为对象建立对象池,同一种的Diameter消息 模板存放于同一对象池中,多种Diameter消息模板分别以多个对象池来管理,用图来管理 这些不同的对象池,以邻接表来表示该图,邻接表中的每个链表都表示一个对象池,通过增 加或减少邻接表实现对象种类的增加或减少;在任一链表中,把链表中的第一个Diameter消息模板对象作为种子,该种子具备 自身的克隆功能,外部的应用从链表中获取Diameter消息模板对象时,当该链表中只有种 子对象时,则返回一个种子克隆的对象,否则从该链表的队列中取一个对象返回。其中,应用所获取的Diameter消息模板对象经过步骤1_4的处理后,应用释放该 Diameter消息模板对象,并将该Diameter消息模板对象加入相应的对象池。其中,该图通过控制链表长度的增加和减少来动态控制对象池中的对象数目。其中,所述链表具有单链表功能。其中,所述链表对外部应用提供获取和释放Diameter消息模板对象的接口。本发明所提供的处理Diameter协议消息的方法,通过具备智能记忆功能的 Diameter消息管理方式,以及能够动态增加对象种类和对象池大小的存放Diameter消息 的动态对象池,方便应用对消息的管理,降低系统资源的消耗。


下面结合附图,通过对本发明的具体实施方式
详细描述,将使本发明的技术方案 及其他有益效果显而易见。
附图中,图1为本发明处理Diameter协议消息的方法一较佳实施例中智能记忆消息的设计类图;图2为本发明处理Diameter协议消息的方法一较佳实施例中发送消息的记忆和 恢复处理流程图;图3为本发明处理Diameter协议消息的方法的流程图; 图4为本发明处理Diameter协议消息的方法一较佳实施例中动态对象池的设计 图;图5为本发明处理Diameter协议消息的方法一较佳实施例中动态对象池和智能 记忆消息的时序图。
具体实施例方式简化消息结构的管理,减少消息对象的生成和销毁对系统资源的消耗(CPU和内 存),才能根本上减少消息的处理时间。如何做呢?本发明采用智能记忆消息的方式,通过 消息的智能记忆功能,达到消息的重复的利用。一次构造多次使用,从而避免了每次业务处 理时的消息构造和销毁(这点类似于数据库的一次pr印are,多次execute的道理)。因此,在本发明在一较佳实施中,增加了用于消息结构改动的记忆类 (CMemoryElem)和修改操作栈(statck<CMemoryElem*>),用于消息结构修改的记忆和消息 结构的恢复。如图1所示,其为本发明处理Diameter协议消息的方法一较佳实施例中智能记 忆消息的设计类图。图中,CDiameterMessage 组合 CDiameterGroup 和 CDiameterAVP,用 以表示消息结构和AVP的存储,并把这种结构作为消息的模板,通过消息id来区分。这 样的消息模板可以根据Diameter协议预先确定并存储于内存中,应用通过在预先构造 的消息模板的基础上修改其结构,构建符合应用需求的消息结构。CDiameterGroup和 CDiameterAVP是双向关联的关系,首先CDiameterGroup是CDiameterAVP的容器,其次当 CDiameterAVP 表示 Grouped 类型的 AVP 时,对应的值为 CDiameterGroup。CMemoryElem 依 赖于 CDiameterGroup 和 CDiameterAVP,用于表示消息结构的改动,statck<CMemoryElem*> 用于表示消息改动的整个过程。在此较佳实施例中,对智能记忆消息的设计类图中记忆功 能相关的主要方法说明如下DCDiameterMessage: clone,克隆方法实现OTiameterMessage对象结构的构造和拷贝功能,进一步可与对象池协作来 实现消息数目的动态增长。2) CDiameterMessage recover,恢复方法从修改后的CDiameterMessage对象中恢复过来,把用户对CDiameterMessage对 象操作进行逆操作(例如增加AVP的操作变成删除AVP的操作)3) CDiameterMessage :add (CDiameterGroup^group, int pos,int num),增删 AVP 操作Group用来标识待修改的CDiameterGroup的对象;pos指示参照CDiameterAVP对 象的位置;num代表增删的数目(> O表示增加,< O代表删除)。4) CDiameterMessage: value,2Sl^I 白勺 CDiameterAVP ( iSS才目jS白勺 内存空间)
⑶iameterMessage对象管理了一组⑶iameterAVP对象,并且存在一些空闲的,用 来修改CDiameterMessage对象结构的时候用。5) CDiameterMessage: group,fgl^ 白勺 CDiameterGroup ( ^KffijS 的内存空间)⑶iameterMessage对象管理了一组⑶iameterGroup对象,并且存在一些空闲 的, 用来修改⑶iameterMessage对象结构的时候用。6)stack: :push,对象压栈把修改操作(增加或删除⑶iameterAVP对象)放入栈中,为⑶iameterMessage 对象恢复时用。7) stack pop,对象出栈把修改操作(增加或删除CDiameterAVP对象)从栈中取出,用来恢复 CDiameterMessage 对象。对于每一种Diameter消息,有两种原始状态,分别为发起方和接收方使用消息的 状态。发送方使用的原始消息结构(消息模板)是由“ ”、“ {} ”和一个“[],,的AVP组 成。应用通过CDiameterMessage的add方法进行消息结构的调整,通过CDiameterMessage 的recover方法把消息恢复成原始消息结构。当对应的“ □”部分不需要时,通过 CDiameterMessage 的 add 方法把 CDiameterGroup 对应位置的 CDiameterAVP 删除;当对 应的“[]”需要多组(n组)时,通过CDiameterMessage的add方法把CDiameterGroup对 应位置的CDiameterAVP增加n_l个。CDiameterMessage的每个add操作都会生成一个 CMemoryElem 压入栈中,当调用 CDiameterMessage 的 recover 方法时,依次把 CMemoryElem 出栈,并执行CMemoryElem的逆向操作。如图2所示,其为本发明处理Diameter协议消息的方法一较佳实施例中发送消息 的记忆和恢复处理流程图。发送消息的记忆和恢复处理流程如下1)build(),CDiameterMessage对象结构的构建,把该结构(Diameter消息模板) 作为初始状态,以后的恢复操作就恢复到这个状态。2) get (),应用获取到 CDiameterMessage 对象的句柄。3) add(),根据实际的消息结构,应用修改CDiameterMessage对象,为其增加一个 ⑶iameterAVP对象(本例程中仅仅是增加一个对象,实际上支持增加⑶iameterGroup对 象,可通过递归实现),从而生成满足应用需求的Diameter消息。4) get (),获取一个CDiameterAVP对象,用于表示新增加的CDiameterAVP对象。5) get (),获取一个CMemoryElem对象,用于记录刚才的增加操作。6)push(),把 CMemoryElem 对象压栈,用于 CDiameterMessage 对象的恢复操作。7)recover (),把CDiameterMessage对象恢复成初始状态,也就是恢复为模板的 状态。8) pop 0,把栈中的CMemoryElem对象弹出,并根据这个对象获取对应的add ()操作。9) put (),把CMemoryElem对象释放,该方法名与get ()配对,主要是考虑工整。10) put (),释放 CDiameterAVP 对象。
整个操作过程就是AVP的增加和删除的过程。通过这个过程简单的展示了智能记 忆和恢复过程,实际情况可能会复杂的多,例如增加一个Grouped类型的AVP,需要递归的 处理完所有的AVP。可以把智能记忆理解为正操作和逆操作两个过程,应用修改消息结构是 正操作,恢复操作就是对应的逆操作,堆栈是辅助完成逆操作的工具。另一方面,接收方使用的原始消息结构(消息模板)是一个空结构,没有 ⑶iameterGroup和⑶iameterAVP。接收方在网络数据的解析过程中生成消息结构,遇到 Gouped类型的AVP时则增加CDiameterGroup,其它情况则增加CDiameterAVP。当应用回收 消息时,调用⑶iameterGroup的recover方法,把消息恢复到空结构状态。接受消息的处 理流程与发送消息类似这里就不再赘述。综上,可得出本发明处理Diameter协议消息的方法。如图3所示,其为本发明处 理Diameter协议消息的方法的流程图,本发明的处理Diameter协议消息的方法包括如下 步骤 步骤1、应用根据Diameter消息的id获取内存中预先存储的Diameter消息模 板,以该Diameter消息模板为基础构建Diameter消息对象的结构,并把该结构作为初始状 态;步骤2、根据实际的消息结构,增加或删除Diameter消息对象结构中的AVP对象, 从而修改Diameter消息对象的结构;步骤3、用栈来记录步骤2中对Diameter消息结构的每次操作;步骤4、应用使用完消息后,根据栈中的记录,将Diameter消息对象的结构恢复为 初始状态,也就是恢复了消息模板的原始结构,从而可以使该模板再次使用。步骤1中,如果内存中该Diameter消息模板数量为1,则先克隆该Diameter消息 模板,然后在克隆的Diameter消息模板基础上构建Diameter消息对象的结构,从而可以保 证内存中总是存在可用的Diameter消息模板。在步骤3中,将步骤2中对Diameter消息结构的每次操作依次压栈;步骤4中恢 复Diameter消息对象的结构时,将步骤3中记录的操作依次出栈。在处理具体Diameter消息的方式上,本发明提供了这种具有智能记忆功能的 Diameter消息,该消息是基于文档对象模型(Document Obiect Model)的机制设计,用于存 储树状结构的AVP (Attribute-Length-Value),方便Diameter应用的消息操作,增删消息 中的AVP和修改对应AVP的值;同时该消息具有记忆功能,能从修改操作中还原回来。对于Diameter消息模板的集合,可进一步采用对象池的方式来处理。对象池是一 组对象的集合,对应用提供获取和释放接口,实现对象的重用功能。但是,一般的对象池只 能存放一类对象,如果需要管理多种对象,就必须创建多个对象池,大大增加的应用的复杂 度。同时对象池的容量是固定的,容易造成对象不够用和资源的浪费的情况。对于Diameter 消息模板组成的对象池来说,如何才能动态的增加对象的种类,满足业务不断的扩展的需 要?如何动态的控制对象的数目,合理有效的利用资源?本发明提供了以下的解决办法在内存中以Diameter消息模板为对象建立对象池,同一种的Diameter消息模板 存放于同一对象池中,多种Diameter消息模板分别以多个对象池来管理,用图来管理这些 不同的对象池,以邻接表来表示该图,邻接表中的每个链表都表示一个对象池,通过增加或 减少邻接表实现对象种类的增加或减少;
在任一链表中,把链表中的第一个Diameter消息模板对象作为种子,该种子具备 自身的克隆功能,外部的应用从链表中获取Diameter消息模板对象时,当该链表中只有种 子对象时,则返回一个种子克隆的对象,否则从该链表的队列中取一个对象返回。如图4所示,其为本发明处理Diameter协议消息的方法一较佳实施例中动态 对象池的设计图。本发明引入了图的概念和克隆技术,解决了动态的增加对象的种类和 动态的控制对象的数目这两个问题。根据以上描述结合图4,在此较佳实施例中,用类 CObjectGraph实现图,用来管理不同的对象池;用CObjectPool实现对象池,用来管理相同 类别的对象;通过模板机制定义的CObjectGraph和CObjectPool,提供了更大扩展空间。 CObjectGraph提供了 add和del方法,实现链表的动态增加和减少,也就是说,该图通过控 制链表长度的增加和减少来动态控制对象池中的对象数目。通过out和in方法实现对象 的获取和回收。CObiectPool继承了标准库的list,实现了单链表功能,也就是说,邻接表 中的链表具有单链表功能。CObiectPool同时对外提供out和in方法,实现相同对象的获 取和回收,也就是说,链表对外部应用提供获取和释放Diameter消息模板对象的接口。普通的对象池创建时指定对象的种类和池的大小,缺乏了灵活性和扩展性。本发 明所提供的存放Diameter消息模板的动态对象池,有别于普通的对象池,对象的种类和池 的大小可以进行动态的调整,在合理利用系统资源的同时大大的增加的应用的扩展性。与 普通的对象池类似,本发明所应用的动态对象池在对外提供对象前,首先需要进行必要的 初始化。有所不同的是,该动态对象池不需要创建最大数目的对象,只需要为每类对象创建 一个种子,对象池会随着使用趋于平衡(找到对象的最大数目)。对象初始化完成后,就是 对象的重复利用,直至对象池的销毁。也就是说,应用所获取的Diameter消息模板对象按 照图3经过步骤1-4的处理后,应用释放该Diameter消息模板对象,并将该Diameter消息 模板对象加入相应的对象池,也就是使用过的Diameter消息模板对象会重新加入对象池 中,从而保证Diameter消息模板可以重复应用,而且Diameter消息模板的数量随着系统应 用的需求而动态增加或减少,直至达到平衡状态。如图5所示,其为本发明处理Diameter协议消息的方法一较佳实施例中动态对象 池和智能记忆消息的时序图。消息流转时序如下1) out (),应用根据id从动态对象池中获取Diameter消息模板。2) out (),从id对应的链表中获取Diameter消息模板。3)siZe(),判断id对应的链表大小,如果大小为1,则进行对象的克隆操作即操作 步骤4);否则执行操作步骤6)。4) clone (),进行消息的克隆操作。5) return (),消息克隆操作返回。6) return (),链表操作返回。7) return (),动态对象池操作返回。8) operation (),修改Diameter消息的结构,增加或删除消息中的avp。调用 CDiameterMessage :add()卞法。9) in (),应用释放 Diameter 消息。10) in (),执行链表的回收操作。11) recover (),Diameter 消息模板恢复。
12) return (),消息恢复返回。13) return (),链表操作返回。14) return (),动态对象池操作返回。综上,本发明所提供的处理Diameter协议消息的方法,通过具备智能记忆功能的 Diameter消息管理方式,以及能够动态增加对象种类和对象池大小的存放Diameter消息 的动态对象池,方便应用对消息的管理,降低系统资源的消耗。以上所述,对于本领域的普通技术人员来说,可以根据本发明的技术方案和技术 构思作出其他各种相应的改变和变形,而所有这些改变和变形都应属于本发明后附的权利 要求的保护范围。
权利要求
一种处理Diameter协议消息的方法,其特征在于,包括如下步骤步骤1、应用根据Diameter消息的id获取内存中预先存储的Diameter消息模板,并把该Diameter消息模板的结构作为构建Diameter消息对象结构的初始状态;步骤2、根据实际的消息结构,增加或删除Diameter消息对象结构中的AVP对象,从而修改Diameter消息对象的结构;步骤3、用栈来记录步骤2中对Diameter消息结构的每次操作;步骤4、应用使用完消息后,根据栈中的记录,将Diameter消息对象的结构恢复为初始状态。
2.如权利要求1所述的处理Diameter协议消息的方法,其特征在于,步骤2中,如果增 加或删除的AVP对象为Grouped类型的AVP对象,采用递归方式处理所有的AVP对象。
3.如权利要求1所述的处理Diameter协议消息的方法,其特征在于,对于Diameter消 息的接收方来说,步骤1中使用的Diameter消息模板为空结构。
4.如权利要求1所述的处理Diameter协议消息的方法,其特征在于,步骤1中,如 果内存中该Diameter消息模板数量为1,则先克隆该Diameter消息模板,然后在克隆的 Diameter消息模板基础上构建Diameter消息对象的结构。
5.如权利要求1所述的处理Diameter协议消息的方法,其特征在于,在步骤3中,将步 骤2中对Diameter消息结构的每次操作依次压栈;步骤4中恢复Diameter消息对象的结 构时,将步骤3中记录的操作依次出栈。
6.如权利要求1所述的处理Diameter协议消息的方法,其特征在于,在内存中以 Diameter消息模板为对象建立对象池,同一种的Diameter消息模板存放于同一对象池中, 多种Diameter消息模板分别以多个对象池来管理,用图来管理这些不同的对象池,以邻接 表来表示该图,邻接表中的每个链表都表示一个对象池,通过增加或减少邻接表实现对象 种类的增加或减少;在任一链表中,把链表中的第一个Diameter消息模板对象作为种子,该种子具备自身 的克隆功能,外部的应用从链表中获取Diameter消息模板对象时,当该链表中只有种子对 象时,则返回一个种子克隆的对象,否则从该链表的队列中取一个对象返回。
7.如权利要求6所述的处理Diameter协议消息的方法,其特征在于,应用所获取的 Diameter消息模板对象经过步骤1_4的处理后,应用释放该Diameter消息模板对象,并将 该Diameter消息模板对象加入相应的对象池。
8.如权利要求6所述的处理Diameter协议消息的方法,其特征在于,该图通过控制链 表长度的增加和减少来动态控制对象池中的对象数目。
9.如权利要求6所述的处理Diameter协议消息的方法,其特征在于,所述链表具有单 链表功能。
10.如权利要求6所述的处理Diameter协议消息的方法,其特征在于,所述链表对外部 应用提供获取和释放Diameter消息模板对象的接口。
全文摘要
本发明涉及一种处理Diameter协议消息的方法,包括如下步骤步骤1、应用根据Diameter消息的id获取内存中预先存储的Diameter消息模板,并把该Diameter消息模板的结构作为构建Diameter消息对象结构的初始状态;步骤2、根据实际的消息结构,增加或删除Diameter消息对象结构中的AVP对象,从而修改Diameter消息对象的结构;步骤3、用栈来记录步骤2中对Diameter消息结构的每次操作;步骤4、应用使用完消息后,根据栈中的记录,将Diameter消息对象的结构恢复为初始状态。本发明所提供的处理Diameter协议消息的方法,方便应用对消息的管理,降低系统资源的消耗。
文档编号G06F9/44GK101872303SQ20101019139
公开日2010年10月27日 申请日期2010年6月3日 优先权日2010年6月3日
发明者周发军, 杨海, 梁林志, 汪东升, 蒋述庭 申请人:深圳天源迪科信息技术股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1