首页 / 通信网络

通信网络失效专利 发明

技术内容

本发明涉及一种通信网络,尤其是涉及在该网络内的收费机制, 它包括本申请人1998年6月5日提交的待审的英国专利申请 9812161.9中所揭示和声明的权益(申请人参考号:A25547),以及 更早的申请的内容结合在此作为参考。 在常规通信网络中,如国内PSTN(公共交换电话网),网络资源 的很大比例部分要用于测量网络的使用并对其进行记帐。研究表明 这些资源将消耗电信公司运行费用的6%。而因特网则一般地不为各 个客户溶合测量和记帐装置。相对于传统的电话网络来说,缺少用 于支持测量和记帐所要求的网络基础结构会降低因特网的运行费 用,并有利于因特网的快速发展。但是,缺少合适的记帐装置在由 因特网所运载的流量特性方面却有很大的缺点:它鼓励了网络资源 的浪费使用,减少了在网络基础结构上的投资以支持新的应用要求 的的动机,如服务质量(QoS)所保证的。 发明概述 按照本发明的第一方面,提供了一种操作通信通信网络的方法, 包括根据在用户终端处检测的网络负载而改变该用户终端的网络使 用的资费。 在该文档中,对改变资费的参考包括改变价格,如作为堵塞参 数的函数。资费的结构是不能改变的。 本发明提供了一种对网络使用收费的方法,其涉及很少或不涉 及网络的开销,此外能反映网络负载的本地变化,这是通过检测在 用户终端对网络的测量来获取的。该终端将反映那些在特定时间内 用户终端正在使用的资源。例如,在包括多个子域的联盟数据网络 中,如因特网,在从一个子域上的用户终端到另一个子域上的服务 器的路径上的某一路由器存在过载时,该用户终端可能试图访问该 服务器。这时,即便网络的平均负载作为整体很低,由该用户终端 所感觉到的负载是很高的,该用户终端的网络使用资费就要增加以 反映相关网络资源的缺乏。类似地,其它的试图通过同一路由器访 问数据的终端也会感觉到网络负载很高,也会将它们的资费作出相 应的增加。对于在资费方面相对急剧的增长,至少某些用户终端会 选择放弃或延迟那些有问题的网络资源,并由此减缓路由器的负载。 本发明的该方面也可以用于其端用户仅是被通知价格和记帐的 系统,而收费是通过网络提供商来完成的,以及用于其端用户测量 他们的使用并把该信息提供给网络提供商的系统,以及用于其端用 户既测量使用也计算应付给网络提供商的费用的系统。 该方法包括在用户终端检测取决于网络负载的网络性能参数, 并根据该网络性能参数改变资费。当网络是一个数据包网络时,那 么网络性能参数可以是在数据源与用户终端间传送的数据包的丢失 数量。该方法的优点在于,它适于使用数据包网络中已有的堵塞控 制机制实施。例如,在因特网中,路由器通过丢弃数据包来响应堵 塞,然后,使用TCP(传输控制协议)的用户终端检测包损失并相应 地在该终端处控制堵塞窗。本发明可以使用所检测的包损失来触发 适用于该网络的资费的增长,这可以伴随由接收终端发送堵塞信号 给数据源。 在可替换的和优选的方法中,当在网络内检测到堵塞时,可以 产生一个明显的堵塞信号并传送给用户终端,并且在用户终端处对 明显的堵塞信号的接收可以随后触发该资费的增长。该方法的优点 在于,相应的堵塞信号可以在网络性能出现重大下降之前而产生, 因此就很容易地维持报务质量。最好,该明显的堵塞信号在通信网 络上与数据包一些携带。最好,当在一个路由器上检测到堵塞时由 该路由器将一个明显的堵塞信号写到一个包中。 作为一替换,该堵塞通知信号可以是在该路由器产生并发送回 该数据源的源熄灭信号。 最好在资费增长与所检测的网络负载间存在着一个非线性关 系。最好,当首先检测到负载时,该方法首先进行一个相对小的增 长,随后,如果该堵塞一直存在,再进行至少一个相对较大的增长。 这样的行为可能预先编程在该资费算法中。以该方式,可以避免网 络的摆动,同时可发保证做出足够的增长以便对网络资源的需求具 有期望的影响。 最好,该方法包括利用用户定义的价格标准对在用户终端处的 决策代理进行编该程,以及将利用该资费计算的价格与所述的价格 基准进行对比。例如,如要每包收费为零或小于一个预定的阈值, 则该决策代理可以被编程为进行数据通信。然后,如果堵塞导致收 费增长超过该阈值,则中断数据通信并且决策代理修改用户终端的 操作。例如,一旦超过了费用阈值,该决策代理可以减缓通信。随 后,该用户可以选择继续进行通信,或者也可以选择放弃试图访问 来自一个特定源的数据。该决策代理也可以用这样一个规则来进行 编程,该规则涉及多个同步传输的整体价格,并使不同的权重符合 各自的应用要求。 最好,该方法包括通过该通信网络该一项资费分布到多个终端, 并在每一个终端处利用该资费计算该终端对网络使用的收费。在这 种情况下,最好该方法包括由网络操作员实施的、间歇地对用户终 端与网络间的流量进行采样的步骤,并且作为采样的一部份,记录 影响该用户终端的网络负载。 对于所采样的流量,对比由该用户终端计算的收费和所期望的 收费,并据此而检测任何偏差。 记录网络负载的步骤可以涉及如记录包丢失或明显的堵塞通知 (ECN)或源熄灭消息。 本发明也包括由按照本发明的第一方面的方法操作的网络以及 在这样的网络中使用的用户终端、网络路由器和其它的网络节点。 附图描述 下面仅通过例子的形式参照附图详细描述采用本发明的系统,其 中 图1是采用本发明的网络的示意图; 图2a和2b是表示资费函数的图表; 图3表示不同服务字节的格式; 图4是表示与图1的网络一起使用的收费结构(archtechture) 的部件对象的示意图; 图5表示在图4的计费对象间通过的数据; 图6是表示在一个用户终端和一个网络域内的协议堆栈的示意 图; 图7是表示资费随时间变化的图; 图8a-8e是软件实施记费和测量对象的类图; 图9是表示与图8a-8e的对象一起使用的图形用户接口的图; 图10是软件实施资费对象的类图; 图11是表示替代实施例的图; 如图1所示,一个通信网络包括多个网络子域2A-C,该网络子 域可以处于彼此不信任的不同的操作员的控制下。该网络子域通过 网关路由器3、4互连。在本实施例中,该通信网络是因特网,并支 持单点和多点传送因特网协议(IP)及相关的协议。用户终端5通 过一个公共交换电话网(PSTN)和一个访问路由器7连接到子域2A。 一个单一的堵塞测试被施加到该访问节点上的流量。网关路由器3、 4和访问路由器7是商业上可得到的设备,如CISCO的7500系列路 由器以及CISCO的AS5800系列统一访问服务器。其它用户终端被连 接到该网络上,包括被Java使能的移动终端8和数据服务器9。该 用户终端5可以通过LAN连接到一个计帐服务器。该计帐服务器可 包括一个下面将描述的、用于从该用户终端接收测量数据的计帐对 象。 除了下面描述的本地资费变化机制,该网络可以使用基于网络 的多个资费联合(band)的控制。一个网络管理平台连接到每个子 域。每个网络管理平台可以包括,例如,包含有运行UNIX(Solaris) 和网络管理程序的SPARC工作站的计算系统。该网络管理平台10主 持管理本体(entity)和资费本体。该网络管理平台使用SNMP(简 单网络管理协议)与连接到各子域的所管理的装置内的代理100进 行通信,该管理平台监视在各个子域内的网络资源的整体负载,这 一点将在下面描述,相应地调整网络使用的资费。该网络管理平台 (NMP)指示代理监视该装置,并以有规律的间隔汇报所汇集的结果 给该NMP,因此该NMP可以监视所有报告的集合。 该资费数据被传送给在其它子域内的平等资费本体,也传送给 用户终端。该资费数据使用如距离向量多点传送路由协议(DVMRP) 或独立协议多点传送(PIM)密集模式来进行多点传送。该资费数据 信道基于SDP(会话描述协议)来进行声明和监视,SAP(会话声明 协议)收费是在‘付费与显示’模式上来实施的。每个用户终端通过例 如记数它通过该网络接口发送和接收的数据包以及在这些数据包中 的数据数量(以字节形式)来监视它自己的网络使用。它使用通过 网络接收的资费计算应归于该网络操作员的付款,并把相应的付款 存进网络操作员的帐户。该网络操作员通过立即采样到或来自一个 特定的用户的流量并将该使用与用户已付费的使用进行对比来管辖 (police)该终端用户的使用。 提供给该用户终端的资费可以被分成不同的易变性 (volatility)的组合。该资费在网络操作员的控制下变化以反映 该网络的整体负载。也就是说,如果网络负载很高,就可以增加资 费以反映网络资源的缺乏。 服务提供商可以提供由不同的服务级别协议和/或不同的价格易 变性定义的不同的产品。例如产品A可以以固定的价格提供最佳的 服务,而另一个产品B可以在一个可变的价位上提供最佳的服务。 服务提供商可以根据下列参数调整产品价格:服务提供商付给整销 商的价格;竞争者的价格;当前网络的使用;对不同产品的相关的 需求。响应这些参数的变化,可以以三种方式之一来进行资费的调 整。首先,资费可以根据网络负载的本地观测来调整价格,而不必 显式地从该提供商进行传送。该方法(下面将详述)需要在一开始 (outset)建在该项资费内,并受限于唯一地取决于本地观测的价 格变化。第二,该提供商可以通过调整的某些参数而调谐该项资费。 当决策依赖于不能直接由该用户观测到的参数(如网络资源的整销 价格的变化)时就需要这种调整。第三,该提供商可以完整地取代 一个资费,当已有的资费不能适应所要求的变化时需要这种方式。 上面描述的资费变化中的第一个有必要自动地实施,而第二类 型的变化可以手动地来执行,或通过响应该服务提供商系统的观察 而自动发布调整的代理来执行,第三种类型的变化可能要手动执行, 因为替换新的资费一般地需要人工输入的设计元素。但也有可能根 据一组特定的规则,使用代理来自动地为一项产品交换资费。 该部分描述了一个我们实施的原型,以便说明该资费系统的概 况。其设计特点包括: ●使用移动码代表资费和相关的用户接口部件; ●使用可重复的多点传送宣告协议来有效地传送资费和资费调 整; ●使用动态类负载和反射以便接收和调谐资费,该原型包括通 用Java类库和两个特定的应用程序,即, ●提供商系统,允许提供商为多项产品引入、替换、和调谐资 费; ●用户系统,使用户能跟踪它们正在使用的产品所采用的收费。 在多点传送的网络内该提供商系统服务于多个运行在不同的主 机上的用户系统的实例。使用多点传送宣告协议来将通信资费变化 从该提供商系统传送到用户系统。 为了相对于该项资费的定义最大化其灵活性,我们选择利用Java 类代表资费。该项技术也用于将用户接口部件提供给用户以便支持 一个资费的行为的可视化。 Tariff(资费)接口作为所有资费的基类,这就定义了一个单一 操作getGUI(),它作为一个可以溶合进该用户的GUI的Java的SWING 部件而返回。该GUI部件利用与该项资费相适应的技术可以使用户 看见资费的行为。 Tariff接口的子类建立了一套资费类型,每一套类型与一套不 同的测量与输入参数相关,这些参数通过在GetCharge()方法的签名 中列出它们而得到标识。例如,接口RSVPTariff将GetCharge()定 义为接收n个RSVP TSPEC,允许定义基于RSVP保留BLB98的特性计 算价格的资费。另一方面,接口PacketCountTariff将GetCharge() 定义为接收包输入、包输出和当前的堵塞(一般作为丢包函数而测量) 的测量,允许定义依赖于包计数和对堵塞敏感的资费。也可以填加 其它的资费作为新形式的使用测量的出现。 资费可以通过提供各种资费接口的实施来定义。例如,资费 PacketCountLinear实施PacketCountTariff来计算与包计数成比例 的收费。另一个资费CongestionSensitiveLinear以简单的方式工 作,但是如果用户在出现堵塞时没有停留在规定的资费限制内,则 要对其增加处罚收费。 除了使用资费接口实施外,一项资费也可以使用其它的‘帮助 器’类以辅助其操作,以及一个或多个用于用户可视化目的的用户 接口部件。也可以要求一个提供商方的用户接口以便使能该提供商 进行资费的调整。 完整的资费描述包括一套Java类,其中一些指定给用户系统, 而另一些则指定给提供商系统使用,用户方的类被约束(bundle) 进一个Java存档(JAR)文件以便于提供商系统处理。 为了配置新的资费类,提供商系统首先装载资费类,它在其执 行条件中需要这些类,然后装载用户方的约束,对其进行串行化, 并用一个密钥来签名,并使用一个宣告协议将其分发给用户系统, 利用签名可以使用户验证所接收的资费是经过授权的。 在接收到该约束后,每个用户系统验证签名(利用公共密钥匹配 提供商的私人密钥),并且在宣告协议头标内规定的激发时间(可能 很靠后,发几小时或几天)解包该约束,使用目标创建动态类装载器 将类装进运行条件。生成所接收的资费类的一个实例,并将其安装 在先前资费的位置处。如果该资费有一个用户接口部件(通过调用资 费对象的GetGUI()方法),然后替代先前资费的用户接口。在用户接 口上的变化发送服务以通知用户该资费已经改变了。 资费调整涉及一个操作的远程调用,该操作对于当前有效的资 费来说是特定的。这意味着一个用户系统在事先接收该资费时不能 知道该操作的签名,也就是说,该操作不会出现在对该用户系统是 已知的任何资费接口中。 为了解决这个问题,使用由Java支持的‘反射’特征。为了散布 资费调整,该提供商生成一个Invocation(调用)对象的实例,该实 例存储了要调用的操作的名称,以及要提供给它的参数,该对象然 后进行串行化、签名和使用该宣告协议进行宣告。当用户系统接收 和验证了该调整后,该调用对象被去串行化,并通过使用反射来调 用所描述的操作而施加给该当前的资费。 为了简单化该宣告协议,要求该调整是等幂且完整的。等幂保 证如果不只一次地进行一项调整则该资费不会被反向影响。完整则 意味着调整可以确定资费对象的整套参数,因此,一项调整可以完 整地消除任何前面施加的调整的影响。 该用户系统可以通过每秒重复调用由资费支持的GetCharge()操 作而施加该资费,并把该返回的值加到累积收费。提供给GetCharge ()的参数依赖于当前有效的资费的种类。例如,如果该项资费是 实现PacketCountTariff,则要求对过去的秒内的入站包、出站包和 堵塞进行测量;但如果该项资费是实现RsvpTariff,则需要描述当 前保留的仅有的TSPEC。这意味着一个用户系统可以仅订阅一个产 品,如果它能提供由与帽子产品相关的资费所要求的参数。 GetCharge()方法的每一次调用都会导致对特定资费用户接口 的更新。例如,在CongestionSensitiveLinear资费中,提供给 GetCharge()的使用参数用于更新资费和堵塞的图形显示。 该宣告协议用于将被串行化了的资费和调整由一个提供商系统 传送到多个用户系统。假定用户系统的数量很大,并采用可重复的 多点传送方案。 由一个提供商提供的每个产品都被分配一个用于宣告目的的多 点传送的信道。用户系统听取对应它们正在使用的产品的信道。在 当前的实施中,假定每个用户系统都具有针对它所感兴趣的产品的 多点传送地址方面的知识。 对于每一个产品信道,提供商重复性向其宣告当前的资费和最 新的调整模式(如果有的话)。每一个宣告都携带一个版本号,该版 本号在每次改变该宣告时都增加。仅当检测到版本号变化时用户系 统才处理该宣告。如果一个新用户加入到一个信道,它将在处理任 何调整宣告前一直等到接收了一个资费。而且,仅当它的宣告版本 大于当前的资费时才进行该调整,由此保证一个丢失的资费宣告不 会导致一个随后的对旧资费调整的应用。 当网络管理平台的对资费的中央化监视和控制在响应该网络的 负载的全局变化方面是有效时,以这种方式很难处理本地化的堵塞, 很难使一个价格增长信号以这样一种方式进行多点传送,该方式是 指信号仅由那些试图通过堵塞点传送包的进行接收,这就要求对因 特网上每一个元素都有一个独立的多点传送的传输。可替代地,可 以使用由本地资源负载触发的价格增长的集合。但这意味着价格增 长信号会发送给并不使用该堵塞资源的用户,依此,就有必要让价 格增长信号衰减,降低价格增长的能力来减少对堵塞资源的需求。 为了克服这些困难,安装在用户终端上的资费算法被配置成自 动地响应正被该终端使用的网络资源的堵塞,每一个算法包括一个 根据所检测的堵塞的级别而改变网络使用价格的函数。该函数可集 成在主资费算法中,或者作为下面将要描述的一个例子,可以是一 个独立的算法,用于计算要加到按照主资费算法计算的价格上的额 外费用。 该主资费算法将价格P作为多个质量参数Q1、Q2、Q3的函数而计 算,在此,例如,Q1是针对在用户终端与该网络间的接口上通信的包 的规定延迟,Q2是用于传输的预留带宽,而Q3是对应于最大容许级 别包损失的规定可靠级别。 价格P由下式给出: P=f(Q1,Q2,Q3) 按照一个质量参数Q的定价(pticing)函数的例子在图2a中示 意性地给出。 堵塞资费算法计算一个额外费用ΔP,它是一个或多个堵塞参数C 的函数: ΔP=f(C1,C2…) 堵塞参数可以测量一个用户终端在任意时间内的使用的资源的 负载,在本例中,损失的包与接收的包的比率用为堵塞参数。该参 数对于象使用TCP(传输控制协议)、或在UDP(用户数据报协议)上的 RTP(实时协议)的包是很容易计算的,因为这些包包括一个序列号。 图2b给出了一个生成额外费用的函数的例子。在这种情况下,额外 费用大概是按照堵塞的指数函数形式增长,因此,在较低的堵塞级 别下,会对一个较小的额外费用进行收费,而同时如果堵塞仍然在 增长,那么,在较高的堵塞级别下,额外费用就会增长得特别快。 在可替换的实施中,一个很明显的堵塞信号就会被网络内的堵 塞路由器加到发送给该用户终端的包。不管堵塞是不是通过包丢失 明显或暗中地用信号通知,该价格算法不可能直接地对堵塞指示进 行收费,相反,它可以对在用户响应堵塞指示时没有平分(halve) 该堵塞窗进行收费。平分该堵塞窗口就是平分传输速率,这是在TCP 以及其它兼容堵塞控制协议中使用的对堵塞指示的标准响应。传输 速率的变化可以由该提供商以及在用户终端处测量,仅管这对路由 器处理资源来说是一个很重的负载。如果提供商仅对某用户采样以 便审核其自己的测量,这就会导致一个可接受的负载。 仅管在此仅描述一个单一的主资费和额外费用,在实践中,不 同的子域以及与每一个子域联系的不同的服务提供商都可以有不同 的定价结构,并具有不同的主资费和额外费用。但是,对于所有的 子域,在网络负载级别和堵塞信令之间都有一个通用的关系。 此第二实施的操作将在下面的利用一个差分服务运行的网络条 件中进行描述,该差分服务在因特网工程任务协会草案“有差分服 务的运行模式和定义”以及David D Clark(MIT)的论文“因特网中 费用分配和定价模型”中有所描述,这些都可以在因特网上的MIT 站点URL:http://press.umich.edu/jep/works/clarkmodel.htmlk上 提供。在实施差分服务的网络内,节点被配置成可以区分包以便提 供不同级别的服务。这种能力可以用于调和对延迟敏感的数据,如 由IP电话客户产生的数据,与其它数据相比更高的优先级,如电子 邮件数据。在网络边缘,例如在运行IP电话客户的客户终端处,包 含在每一个包头内的TOS(服务类型)八位位组内的各个位可以设置成 指示相应的服务级别,这些位可被网络内的路由器使用以确定如何 处理相关的数据包。 以这种方式使用的TOS八位组被称作为DS(差分服务)字节。在 图3中示出了差分服务字节的格式。标有‘IN’的零位指示该包是 在所定义配置文件内还是外;标有“PHB”的1-5位定义一个‘每 跳数行为(per-hop-behaviour)’,也就是说,它们指示例如一个路 由器如何处理该包,例如,使其符合较低或较高的优先级;在此特 定的DS字节形式中,6-7位用于明显地指示堵塞(ECN)。设置这些 位中的一位来指示是否在包的路径上的路由器能设置ECN字段,而 另一位用作在出现堵塞或当出现潜在地会导致堵塞的负载时被设置 (由能设置ECN的路由器设置)的标志。随机早期检测(RED)算法 目前在路由器上已实施,这些算法会测量路由器的包缓冲区内的平 均队列长度。计算其指数移动平均。当平均队列长度超过一个预定 的阈值时,该路由器发送信号通知发生了堵塞。常规地,该信令的 发送是简单地通过丢掉一个包来实施的。但是在ECN方案中,该路 由器不是通过丢掉一个包而是通过在一个包的头标部份设置一个ECN 位来指示堵塞发生的。这是概率性完成的:即仅有通过路由器的的 包被加以标记。这种被加以标记的包的概率随着平均队列尺寸增加 而增加。在队列增加到路由器缓冲区满的较少见的情况下,这些包 被丢弃,而不是设置一个ECN位,此时对所有的剩余包设置ECN位。 在操作中,如果客户终端5正访问服务器9上的数据源,堵塞 就可能发生在如连接了网络子域2B和2C的路由器4上,路由器4 中的类似RED的算法检测路由器缓冲区的队列长度(利用指数移动 平均所计算的)是否超过一个预定的阈值。相应地,从服务器9到 客户终端的一些数据包具有由该路由器9设置的DS字节的ECN位, 以便标记已发生了堵塞。在用户终端读取输入包的头标中的DS字节。 计算包含被加以标记的ECN位的包的数量的移动平均,该平均随后 提供堵塞参数C1,该参数用于计算额外的费用: ΔP=f(C1) 通过把由主资费算法确定的价格与额外算法确定的价格加在一 起来计算用户的整体价格PTOT: PTOT=P+ΔP 整体价格被传递给运行在客户终端上的费用决策代理,该费用 决策代理用用户定义的规则进行编程。这些规则可能会要求,只要 在某一段时期内的平均整体费用低于一个预定的阈值,如每分钟0.01 英镑,则该费用决策代理应授权该系统进行一个连接,以及当费用 高于阈值时,该费用决策代理应挂起一个连接并警告该用户其费用 已超出了阈值。可替换地,如前面指出的,该费用决策代理也可以 同时处理几个应用,并且也可以编程为随着针对利用其中一个应用 访问的数据源的额外费用增加而减缓该应用。 对于某些条件下的一些用户,网络使用资费的变化性可能会引 起一些问题。例如,一个用户可能期望规划一个多点传送的视听会 议,具有比如说20个与会者,以及用户想为每一个与会者支付网络 的使用费,该会议可能事先规划为一天或更长时间,但由于资费是 随时间而变化的,在规划会议的时间点,该用户可能并不知道会导 致费用。本发明的优选实施为用户克服了该问题,并为网络提供商 提供了一个附加的收费源,这是通过采用另一个资费来实现的。该 项资费为一个给定用户终端定义了一个针对价格稳定性的额外费 用,额外费用的值随着所要求的稳定性周期持续时间的增加而增加。 在参照上述的例子中,事先规划一天会议的用户参照当前资费确定 所需要网络的当前费用,包括任何当前可用堵塞额外费用,然后参 照另外一个资费确定用于将当前值处的费用维持一天的时间的额外 费用。然后,如果用户决定使用该固定的资费,则从用户处发送一 条消息给网络操作员,该消息可通过例如为各与会者之间的音频与 视频数据流规定IP地址和服务级别而标识有问题的数据流、用户正 在订立合同要求一个固定周期的当前时间、该固定周期所需要的持 续时间以及一个针对该消息的标识码。可选地,具有这些细节的该 消息可以用一个合适的、用密码写的函数(如MD5)和最初传送给提 供商并随后用于校正记帐数据的散列值进行跟踪。随后对于规定周 期的持续时间,例如在本例中一天的情况下,用户可采用固定的资 费。在用户自己负责产生记帐数据并计算该网络使用的收费的系统 中,用户使用该固定的资费计算收费,并将计帐数据连同针对该固 定资费合同的标识码返回给网络操作员。 本发明的该方面并不是仅仅用于在响应检测到堵塞时在本地实 施资费变化,也可以用于例如由网络操作员来做出这种资费变化的 系统。 针对稳定性额外费用的资费可以与上面针对其它资费讨论的同 样原方式,通过多点传送由位于网络操作员平台的资费本体分布到 用户终端。与其它资费一样,不同的资费和可选的不同的稳定性周 期可以施加到不同的业务级别。对于象前面段落描述的情形,不同 的业务级别可以用于多点传送会议所需的音频和视频数据流的不同 元素。 图2c给出了一种可用的稳定性额外费用的资费,该资费可以嵌 入Java函数多路广播给用户。曲线C作为另一个辅助算法传送给用 户终端,该算法有助于辅助算法。用户可以选择一个价格稳定性周 期并计算在该点价格上的额外费用,这就要求使用曲线C。曲线B是 在这样一个特定情况下选择的稳定价格的一个例子,一旦稳定周期 过期,则可以在此时在该点价格之上以额外费用购买一个新的。为 了购买一个价格稳定周期,用户可以声明所要求的周期以及施加给 其提供商的地址范围。它也可以要求一个地址(因特网电话呼叫一 个单个人)或一个地址范围(如对于一个视频会议)。某些有风险防 范意识的用户可以对于所有时间的所有地址要求稳定的价格。 为了便于描述,前述的部分在响应堵塞时独立地处理了本地资 费的变化。在实际中,该机制也可以与其它的对堵塞的响应结合在 一起,以及与资费中其它的变化源结合在一起。而且对于不管堵塞 进行传输的决策要求在传输两端的双方都同意。考虑到数据源、网 络、路由器和数据接收器的整个系统,响应本地检测的堵塞的资费 (也称为罚款)增加的实施会作为最后手段,其它响应按照下列序 列号首先进行实施: 1、围绕堵塞的网络再路由; 2、网络从包含最佳服务的低级服务(在相关的QoS中的 相关决策中较低的)中借用性能; 3、网络引进额外的性能(可能是自动地) 4、端系统确定该堵塞是在共亨网络上,而不只是在该访 问链接或端系统上; 5、端系统将QoS规格设置为更高的级别(如果比忽略在 当前级别上的堵塞的罚款更便宜的话)。 6、端系统决定有必要忽略该堵塞,假定这样做的罚款可 能会很高的话。 7、两个(所有)端系统都同意忽略该堵塞。 一般地在步骤4产生一个ECN信号,步骤1-3是在该信号的产 生之前完成,而步骤5-7是信号产生之后。 在进行一个连接以及为此连接而付费之前的最后的一步是在双 方之间建立一个协议。相应地,当用户终端通过一个接收明显的堵 塞通知或检测到相关的参数如包损失而检测到堵塞时,该用户终端 将这一事实发送信号回给每一个其它的端系统。因此在本实施例中, 客户终端5发送信号给数据服务器5,通知已经发生的堵塞。该服务 器是按照一定的规则来编程,其在用户处可以作为一个代理来实施, 并决定了对这样一个信号的响应。例如,服务器可以拒绝在这些条 件中的服务。如前面相对于图1所描述的,在本实施例中,资费是 通过该网络从网络操作员多点传送给用户终端,并使用一个‘付费 和显示,的进程来进行收费。图4a和4b给出一个实现本情况的收 费结构的对象。图4a给出了一个较高级别的对象,而图4b给出在 软件实施图4b的结构中使用的部件对象。在图4a中,以该图的一 半给出了标有‘用户’的用户终端上的对象,而在访问路由器7上 的对象和相应的网络子域是以标有‘边缘网络’的图形的一半来表 示的。在用户终端上的对象包括一个会话控制对象S,一个客户商业 规则对象BC,客户定价对象PrC,QoS字处理器Q,客户记费对象ActC 和一个用户测量对象MC。该商业规则对象BC接收关于涉及付费责任 的会话方面的信息以及接收来自定价对象PrC的当前定价数据。该客 户商业对象在用户策略控制下对使用哪一个能收费的服务、以及使 用多少可收费的服务做出决策,该项决策被馈送回QoS管理器Q,该 管理器决定采用哪一种机制来达到该要求。该QoS管理器然后控制 用户测量对象MC来确定要测量流量和服务的哪一方面以及忽略哪一 方面。该测量对象然后记录流量的所选择的方面,例如计数用户终 端接收的包的数量以及针对这些包的QoS的级别。这些数据连同当 前的资费,包括用于堵塞的所有额外费用,被用户终端用于确定可 付给网络操作员的收费。该测量对象MC也用指令进行编程,该指令 确定它将数据传送给用户计费对象ActC的频率,该用户计费对象ActC 将付费传递给在网络提供商的域内的计费对象Actp。 在用户终端上的计帐对象可以使用一个小的加密平文件(flat- file)数据库来实现。在网络提供商方,可以使用一个更大的数据 库来实施相当的对象,该数据库可以调整成处理比如成千上万的用 户帐户。一个对象请求经纪人(ORB)可用于在用户方对象与该网络 方对象间通信,这可以通过采用商业上可用的工具如lona Technologies plc的ORBIX(商标)来实现。 在网络提供商方,也就是在用户终端连接的子域内,用户的流 量由M的版本来测量,标记为MP,但是仅是在采样的基础上由管辖 函数PO来确定。也就是说,网络操作员仅是间歇地对用户的流量进 行采样。PO控制在网络的何处进行测量以便捕获所有的特定的用户 流量。一个大块(bulk)测量函数MB负责报告在路由器队列长度的 移动平均中反映的、汇集的流量级别给定价对象PrP,大块的测量一 般地是从整个提供商域搜集到一个中央化的定价函数(为了可靠会 被复制)。PrP从该网络提供商的商业对象BP设置考虑了该商业规则 的价格,和由Mb报告的当前流量的级别,以及来自相邻提供商(见 下)的定价。定价函数PO将来自MP的样本测量与在ActP处接收的、 作为用户自己测量的结果的记费消息进行对比。如果确定该帐户不 够,它就可能会限制在访问控制网关Acs处服务,或者启动某些其 它的惩罚。包装在该记费对象内的另一个管辖对象检查该帐户是否 匹配在所签订合同的付款时间内的付款。最后,一致性匹配函数I 在用户的标识(帐户,数字签名等)与它们的当前网络地址(一般 地是由ISP提供的,不管是多点传送或单点传送)间进行映射。 图5表示在记费对象间传递的数据。在本例中,该帐户数据包 括:帐户标识,帐单记录标识,服务类型标识,源地址,目标地址, 资费标识和货币。而且,该付款数据包括钱的数量和付款的货币。 图6给出了在用户终端与网络域的协议堆栈内的测量区域。理 想地,在该区域内有两个测量点,在图中被标注了(a)的两点。为了 便于实施,可以使用双方都信任的单个测量点(b)。这可以在例如一 安全模块(如在用户终端上的用密码写的卡)内实现。作为替换, 也可以在测量间可能具有偏差的不同点上进行测量。在网络上,实 际的第一测量点是位于第一访问设备上,该设备对每一个用户检测 网络层头标(c)(在此是IP)。ISP对该网络(d)不会测量得更深, 因为它们的访问网络和系统会引入延迟和损耗。 对于各个用户(如拨号连接),要测量的实际点是沿着网络层, 但是在它们的端系统堆栈(e)内。理想地,这些测量点将位于每个堆 栈中更低处,以便靠近双方间的接口,以及不太可能被堆栈的内容 影响。但是在链接层(f-f)的测量将是不合适的,因为在网络层设 置的某些可收费的参数将不断地在链接层帧内反映出来;网络级别 的多点传送,端到端延迟要求等在链接层永远是不可见的。而且, 当测量包尺寸用于带宽的计算以便避免明显的偏差时也需要忽略链 接层头标,在此可能不同的链接技术交织在一起。 在接收方向(堆栈之上),这种测量点的选择暗示着低层必须被 定尺寸(缓冲区的大小,中断以及线程规划的优先级),以便应付高 层的最严历的QoS要求。随着将帧剥离该物理媒介,该机器必须能 把数据传递到堆栈之上,而不会存在任何机会导致在数据到达网络 层之前把使用收费数据丢失(如由中断冲突引起的缓冲区溢出)。就 是在网络层,要测量ISP的服务,也就是在网络层,QoS要求是最方 便控制各种流的差分处理,因为它们进一步地要传递到堆栈之上(在 端系统)或转发(在路由器上)。 上面描述的测量对象可以使用作过相应的修改的、公众可以得 到的测量软件如Nevil Brownlee的NetTraMet系统来实现。这是一 个软件测量器,它符合在RFC2063和RFC 2064中描述的IETF因特 网记费结构。该软件使用‘包嗅(sniffing)’技术对流量流增加包和 字节的计数,这是由它们的端点地址定义的。仅管一般来说,地址 可以是以太网地址,协议地址(IP,DECnet,Ethertalk,IPX或CLNS) 或传输地址(IP端口号等),或所有这些的组合,但在本发明中仅使 用了IP地址。要观测的流量流由一套规则来规定,它们是通过一个‘管 理器’程序下载到NetTraMet的。流量流数据通过SNMP由‘搜集器’程 序来进行搜集。 图7表示由该网络的操作员确定的主资费是如何随时间而变化 的。在图中,曲线A是计算的点价格以便反映在任意时刻的网络负 载。曲线B是多个不同的资费组合中的一个。不同的资费组合具有 不同的易变性,并且用户要对提供更大稳定性的组合付额外费用。 利用由该网络携带的信道的一个层级将资费传送给用户终端。在用 户与服务提供商间的初始合同,一个拥有分布在几个月的新宣告 的单一信道地址(例如,对于合同变化或对于规定哪一个第二级别 信道监听资费或用于下载新的代码来处理新的资费结构)。此第二级 别的信道可以传送按小时间隔的更新,这些更新只是对大多数的易 变信息简单地声明了第三级别信道的地址。这些第三级别的信道可 以携带小于一秒的更新,在一个信道上可以携带针对这些服务的价 格。为了获得最大的效率,这一个信道可以按照最高易变性分成几 个信道,并在更稳定的周期重新集合成一个单一信道。 表1到表7列出了用于实施两个不同的资费的Java源代码。表 1的代码建立了在用户系统与由用户系统下载的一个资费算法间通信 的操作。表2给了一个线性资算法,其中该项资费取决于发送的所 有的包以及由用户接收的包和堵塞参数。表3给出了在本例中用于 用户显示的代码。表4给出了用于在网络操作员服务器上显示资费 的代码。表5给出了一个指数资费算法。表6产生了用户显示以及 表7是该指数资费算法的操作员显示。通过下载Java代码来产生用 户接口,该接口可以被适应成特定资费的要求,并且可以按照资费 的变化而做出调整。 仅管在联盟数据包网络如因特网的条件中描述了这些实施例, 本明的很多方面可以与其它类型的网络优点一起使用,如在电话交 换PSTN(公共交换电话网络)。图11给出了在该网络中所采用的本 发明的一个实施例。在该网络中,用户终端8(在此例中被称为智能 电话机,也就是电话机将微处理器与数据接口结合在一起)通过本 地交换机82和主干交换机3互连到电话网络。主干交换机83通过 一个通用信道SS7(第7信令系统)信令网络连接到一个服务控制点 85,该服务控制点85负责执行高级呼叫控制功能。该服务控制点85 也连接到一个操作支持服务器86,该服务器负责对操作记帐,并且 在本例中控制对该网络的资费设置。OSS服务器和用户终端包括资费 本体(TE)。固定的PST网络也通过一个网关87互连到一蜂窝GSM 网络88。在蜂窝网络中的基站BS将信号传送给智能的移动电话89, 在操作中,网络资费通过PSTN网络和GSM网络分布到用户终端。很 方便地,资费可以再次地采用Java函数的形式,该函数可以在用户 终端的处理器上执行,该Java函数可以按照因特网包而流化。在一 种实施方式中,这些因特网包可以通过PSTN网络与GSM网络而自行 分布。例如,这些包可以使用MTP(消息传送部份)传输层被包装和 传输到主干交换机并向外使用带外信号传送到用户终端。可替换地, 可以通过因特网在OSS服务器与用户终端间建立独立的数据通信。 如在上面的例子,该网络操作员监视该网络内的资源负载,并将信 号传输给在用户终端内资费本体,以改变资费来反映相关资源的其 它的不足。用户终端可以自己监视网络负载并自动地产生资费中的 变化。网络资源的使用可以由该用户终端本地测量,而不是采用在 网络内实施的传统的记帐。网络操作员可以通过实施采样来管辖使 用数据的测量,如前面所述的。 表1 //Generated by Together package com.bt.jungle.lsma.charging.pricing; import com.sun.java.swing,JComponent; /**This establishes the operations used for communication between the customer system and the downloaded algorithm. @author Mike Rizzo*/ public interface Tariff { Jcomponenet getGUl( ); Float getPrice (int pkin,int pkout,int cng); 表2 package algorithms.linear; import com.sun,java.swing.JComponent; import com.sun.java.swing.JTextField; import com.bt.jungle.lsma.charging.pricing,Tariff; public class LinearAlgorithm implements Tariff { private float rate; private LinearAlgorithnDisplay display; public LinearAlgorithm ( ) { display=new LinearAlgorithmDisplay ( ); serRate (new Float(1)); } public float getPrice (int pkin,int pkout,int cng) { return (pkin + pkout + cng) * rate; } public JComponent getGUl( ) { return display; } public void setRate (Float f) { rate = f.floatValue( ); display.setRate (rate); } } 表3 // Generated by Together package algorithms.linear; import com.sun,java.swing.JPanel; import com.sun.java.swing.JTextField; import com.sun.java.swing.Box; import com.sun,java.swing.JLabel; public class LinearAlgorithmDisplay extends Jpanel { private JTextField tfRate=new JTextField (4); public LinearAlgorithmiDisplay ( ) { Box vbox=Box.createVerticalBox ( ); Box hbox=Box.createHorizontalBox ( ); hbox.add (Box.createHorizontalGlue ( )); hbox.add (new Jlabel ("Rate:")); hbox.add (Box.createHorizontalGlue( )); hbox.add (tfRate); tfRate.setEditable (false); hbox.add (Box.createHorizontalGlue( )) vbox.add (hbox); add (vbox( )); } public void setRate (float f) { tfRate.setText (String.valueOf (f)); } } 表4 //Generated by Together package algorithms.linear; import com.sun.java.swing. *; import java.awt. event. *; import com.bt.jungle.lsma.charging.pricing.provider.*; import com.bt.jungle.util. *; public class LinearAlgorithmGUl extends Jpanel { private JTextField tfRate-new JTextField ( ); private TuningMessageListener tuningMessageListener; private final static String DEFAULT_RATE="1.0"; public LinearAlgorithmGUl(TuninglMessageListener tml) { tuningMessageListener=tml; tfRate.setText(DEFAULT_RATE); Box vbox=Box.createVerticalBox( ); Box hbox=Box.createHorizontalBox ( ); hbox.add (new Jlabel ("Rate:")); hbox.add (Box.createHorizontalGlue( )); hbox.add (tfRate); hbox.add (Box.createHorizontalGlue( )); hbox.add (hbox); JButton bTransmit=new JButton ("Transmit"); bTransmit.addActionListener ( new ActionListener ( ) { public void actionPerformed (ActiornEvent e) { transmit ( ); } } ); hbox=Box.createHorizontalBox( ); hbox.add.(Box.createHorizontalGlue( )); hbox.add (bTransmit); hbox.add (Box.createHorizontalGlue( )); vbox.add (hbox); add (vbox); } void transmit ( ) { try { Float f=new Float(tfRate.getText( )); Object args[]=new Object [1]; Args [O]=f; TuningMessageListener.notify( new Invocation ("SetRate", args) ); } catch (Exception e) { e.printStackTrace ( ); } } } 表5 package algorithms.exp; import com.sun.java.swing.JComponent; import com.sun.java.swing.JTextField; import com.sun.java.lsma.charging.pricing.Tariff; public class ExpAlgorithm implements tariff { private float min; private float base; private float divisor; private ExpAlgorithmDisplay display( ); public ExpAlgorithm( ) { display=new ExpAlgorithmDisplay ( ); setMin (new Float (1)); setBase(new Float (2)); setDivisor(new Float(10)); } public float getPrice (int pkin,int pkout,int cng) { return min+(float)math.pow (base,(pkin+pkout+cng)/divisor); } public JComponent getGUl( ) {return display;} public void setMin (Float f) { min=f.floatValue( ); display.setMin(min); } public void setBase (Float f) { base=f.floatValue( ); display.setBase(base); } public void set Divisor (Float f) { base=f.floatValue( ); display.setBase (divisor); } } 表6 //Generated by Together package algorithms.exp; import java.awt. GridLayout; import com.sun.java.swing JPanel; import com.sun.java.swing.JTextField; import com.sun.java.swing. Box; import com.sun.java.swing.JLabel; public class ExpAlgorithmDisplay extends Jpanel { private JLabel tfDisplay=new JLabel ( ); private float min,base,div; public ExpAlgorithmDisplay( ) { add (tfDisplay); // tfDisplay.setEditable (false); updateDisplay( ); } private void updateDisplay ( ) { tfDisplay.setText ("price="+min+"+"+ base+ "^((pkin+pkout+cng)/" + div +")"); } public void setMin (float f) { min=f; updateDisplay ( ); } public void setBase (float f) { base=f; updateDisplay( ); public void setDivisor (float f) { div=f; updateDisplay ( ); } } 表7 //Generated by Together package algorithms.exp; import java.awt. GridLayout; import com.sun.java.swing. *; import java.awt.event.*; import com.bt.jungle.lsma.charging.pricing.provider. *; import com.bt.jungle.util. *; public class ExpAlgorithmGUI extends Jpanel { private JTextField tfMin=new JTextField ( ); private JTextField tfBase=new JtextFfield ( ); private JTextField tfDivisor=new JTextField ( ); private TuningMessageListener tuningMessageListener; private final static String DEFAULT_MIN="1.0"; private final static String DEFAULT_BASE= "2.0"; private final static String DEFAULT_DIV= "10.0"; public ExpAlgorithmGUI (TuningMessageListener tml) { tuningMessageListener=tml; tfMin.setText(DEFAULT_MIN); tfBase.setText(DEFAULT_BASE); tfDivisor.setText (DEFAULT_DIV); Box vbox = Box.createVerticalBox ( ); vbox.add(new JLabel("price=min+pow (base, (pkin+pkout+cng)/divisor)")); vbox.add (Box.createVerticalGlue ( )); Jpanel panel=new JPanel(new GridLayout (3,2)); panel.add (new JLabel ("Minimum")); panel.add (tfMin); tfMin.addActionListener ( new ActionListener ( ) { public void actionPerformed (ActionEvent e) { transmit ("setMin",tfMin); } } }; panel.add (new JLabel ("Base")); panel.add (tfBase) tfBase.addActionListener ( new ActionListener ( ) { public void actionPerformed (ActionEvent e) { transmit ("setBase", tfBase); } } }; panel.add (new JLabel ("Divisor")); panel.add (tfDivisor); tfDivisor.addActionListener ( new ActionListner ( ) { public void actionPerformed (ActionEvent e) { transmit ("setDivisor", tfDivisor); } } ); vbox.add (panel); add (vbox) } void transmit (String m, JTextField tf) { try { Float f=new Float (tf.getText ( )); Object args[ ]=new Object [1]; args [O]=f; tuningMessageListener.notify( new Invocation (m,args) ); } catch (Exception e) { e.printStackTrace ( ); } } }