本申请是2004年10月22日提交的名为“Rendezvousing Resource RequestsWith Corresponding Resources(将资源请求与对应的资源会合)”的美国专利申请第10/971,451号的延续,该申请通过整体引用结合于此。
具体实施方式
本发明的原理克服了现有技术的上述问题,本发明针对用于将资源请求与对应的资源会合的方法、系统和计算机程序产品。在某些实施例中,划分联盟基础结构的节点。访问包含分配给联盟基础结构中的节点的节点ID的已排序链表。访问表示用于划分该已排序链表的多个不同的邻近性准则的邻近性类别。该已排序链表基于第一邻近性准则被划分成一个或多个第一子列表,这一个或多个第一子列表中的每一个包含来自该已排序链表的节点ID的至少一个子集。从一个或多个第一子列表中选择的第一子列表基于第二邻近性准则被划分成一个或多个第二子列表,这一个或多个第二子列表的每一个包含第一子列表中包含的节点ID的至少一个子集。
在其它实施例中,例如,如图3所示,填充节点路由表。将一直接前导节点插入到该路由表中。将一直接后继节点插入到该路由表中。将适当的邻域节点标识符插入到该路由表中,邻域节点是基于预定或估算的邻域范围和邻域大小在第一方向和第二相反方向上从已排序链表中标识的。将适当的路由节点标识符插入到该路由表中,路由节点是基于联盟基础结构的ID空间的数基和字段大小在第一和第二方向上从已排序链表中标识的,路由节点表示已排序链表在第一和第二方向上的对数索引。
在又一些其它实施例中,可考虑到邻近性准则来填充节点路由表。将当前节点所参与的每一分层划分的路由环的前导节点插入到路由表中,每一分层划分的路由环是依照对应的邻近性来划分的,且包含父环的双向链表的至少一个子集。将当前节点所参与的每一分层划分的路由环的后继节点插入到该路由表中。将当前节点所参与的每一分层划分的路由环的适当的邻域节点插入到该路由表中。将当前节点所参与的每一分层划分的路由环的适当的路由节点插入到该路由表中。
在再一些其它实施例中,潜在地基于定义对应的一个或多个节点类的一个或多个邻近性准则将消息向目的地节点路由。接收节点接收消息以及指示目的地节点的目的地号和可任选的一个或多个邻近性准则。可能在当前节点类的节点之中的接收节点确定它在数字上比对应的前导节点离目的地号更远,并在数字上比对应的后继节点离目的地号更远。确定目的地不在对应于接收节点的一组邻域节点中,该组邻域节点可能在当前节点类的节点中。
从路由表中标识对应于接收节点的中间节点,该中间节点在数字上比对应的路由表中的其它路由节点离目的地号更近。消息被发送到该中间节点。该中间节点可继续路由消息。当接收该消息的节点在数字上比其后继或前导节点离目的地号更近时,该消息最终到达目的地节点。在路由是基于一个或多个邻近性准则的实施例中,该数字接近性可以相对于选中节点类中的节点。
由此,基于邻近性准则路由消息包括通过在给定的邻近环(节点类)中渐进地移向离目的地节点更近,直到无法通过在该环内路由来做出更多的前进,来路由到目的地节点(ID)。确定无法做出更多的前进是在目的地号位于当前节点的ID与其后继或前导节点的ID之间时发生的。在这一点上,当前节点通过它所参与的下一更大的邻近环中其父节点来开始路由。通过沿朝向根环的划分路径攀爬来渐进地移向目的地的这一过程在到达目的地节点时终止。
本发明范围内的实施例包括用于承载或其上具有计算机可执行指令或数据结构的计算机可读介质。这一计算机可读介质可以是可由通用或专用计算机系统访问的任何可用介质。作为示例而非局限,这一计算机可读介质可包括诸如RAM、ROM、EPROM、CD-ROM或其它光盘存储、磁盘存储或其它磁存储设备等物理存储介质,或可用于以计算机可执行指令、计算机可读指令或数据结构的形式承载或储存期望的程序代码手段并可由通用或专用计算机系统访问的任何其它介质。
在本说明书以及所附权利要求书中,“网络”被定义为允许在计算机系统和/或模块(例如,硬件和/或软件模块)之间传输电子数据的一个或多个数据链路(可能具有不同的速度)。当信息通过网络或另一通信连接(硬布线、无线或硬布线和无线的组合)传输或提供给计算机系统时,该连接被适当地视为计算机可读介质。由此,任何这样的连接被适当地称为计算机可读介质。上述组合也应当被包括在计算机可读介质的范围之内。计算机可执行指令包括,例如使通用计算机系统或专用计算机系统执行某一个功能或一组功能的指令和数据。计算机可执行指令可以是,例如二进制代码、诸如汇编语言等中间格式指令、或甚至是源代码。在某些实施例中,例如,诸如专用集成电路或门阵列等硬件模块被优化成实现本发明的原理。
在本说明书以及所附权利要求书中,“节点”被定义为共同工作以在电子数据上执行操作的一个或多个软件模块、一个或多个硬件模块或其组合。例如,节点的定义包括个人计算机的硬件组件,以及诸如个人计算机的操作系统等软件模块。模块的物理布局不是重要的。节点可包括通过网络耦合的一个或多个计算机。同样,节点可包括单个物理设备(诸如移动电话或个人数字助理“PDA”),其中内部模块(诸如存储器和处理器)共同工作以在电子数据上执行操作。此外,节点可包括例如,诸如包括专用集成电路的路由器等专用硬件。
本领域的技术人员可以理解,本发明可以在具有许多类型的节点配置的网络计算环境中实施,包括个人计算机、膝上型计算机、手持式设备、多处理器系统、基于微处理器或可编程消费者电子产品、网络PC、小型机、大型计算机、移动电话、PDA、寻呼机、路由器、网关、代理程序、代理服务器、防火墙、重定向器、网络地址转换器等等。本发明也可在分布式系统环境中实施,其中通过网络连接(经由硬布线数据链路、无线数据链路或通过硬布线和无线数据链路的组合)的本地和远程节点都执行任务。在分布式系统环境中,程序模块可位于本地和远程存储器存储设备两者中。
联盟基础结构
图1示出了联盟基础结构100的一个示例。联盟基础结构100包括可形成不同类型的联盟伙伴关系的节点101、102、103。例如,节点101、102、103可以作为对等体在彼此之间联盟而不需要根节点。节点101、102和103的每一个分别具有对应的ID 171、182和193。
一般而言,节点101、102、103可利用联盟协议来形成伙伴关系并交换信息(例如,涉及与其它节点的交互的状态信息)。伙伴关系的形成和信息的交换便于更有效且更可靠地访问资源。其它中间节点(未示出)可存在于节点101、102和103(例如,具有171和193之间的ID的节点)之间。由此,例如,在节点101和103之间路由的消息可以通过一个或多个其它中间节点。
联盟基础结构100中的节点(包括其它中间节点)可包括对应的会合协议栈。例如,节点101、102和103分别包括对应的会合协议栈141、142和143。协议栈141、142和143的每一个包括一应用层(例如,应用层121、122和123)以及其它较低层(例如,对应的其它较低层131、132和133)。会合协议栈中的每一层负责涉及将资源请求与对应的资源会合的不同功能。
例如,其它较低层可包括信道层、路由层和功能层。一般而言,信道层负责将消息(例如使用WS可靠消息通信(WS-ReliableMessaging)和简单对象访问协议(“SOAP”)从一个端点可靠地传输到另一端点(例如,从节点101传输到节点103)。信道层也负责处理传入和传出的可靠消息通信报头和维护涉及可靠消息通信会话的状态。
一般而言,路由层负责计算朝向目的地的下一中继段。路由层也负责处理传入和传出的寻址和路由消息报头和维护路由状态。一般而言,功能层负责发出和处理诸如加入和离开请求、查验、更新和其它消息等会合协议消息,以及对这些消息的响应的生成。功能层处理来自路由层的请求消息,并且如果有任何对应的响应消息,使用路由层将其发送回始发节点。功能层也起动请求消息,并使用路由层来传送请求消息。
一般而言,应用层处理从功能层传送的非会合协议专用数据(即,应用消息)。功能层可访问来自应用层的应用程序数据,并获得应用数据并将其放置在会合协议消息中(例如,查验和更新)。即,功能层可使应用程序数据在会合协议消息上捎带确认,并可使应用数据被传回到接收会合协议节点中的应用层。在某些实施例中,应用数据用于标识资源和资源兴趣。由此,应用层可包括处理从其它较低层接收到和发往其它较低层的数据的应用专用逻辑和状态,用于标识资源和资源兴趣。
联盟机制
节点可使用各种不同的机制来联盟。第一种联盟机制包括对等节点将信息转发到所有其它对等节点。当节点要加入一联盟基础结构时,该节点利用诸如WS发现(WS-Discovery)等广播/组播发现协议来通告其存在,并发出一广播/组播查找来检测其它节点。该节点然后与已经存在于网络上的其它节点建立简单的转发伙伴关系,并接受与新加入的节点的新伙伴关系。之后,该节点只需将所有的应用专用消息转发到所有其伙伴节点。
第二种联盟机制包括对等节点将应用专用消息最有效地发送到其目的地。当新节点要加入联盟基础结构时,该新节点利用诸如WS发现等广播/组播发现协议来通告其存在,并发出一广播/组播查找以检测作为该联盟基础结构的一部分的其它节点。在检测到另一节点之后,该新节点与该另一节点建立伙伴关系。从所建立的伙伴关系,该新节点获知已经参与到联盟基础结构中的其它节点的存在。它然后与这些新获知的节点建立伙伴关系,并接受任何新传入的伙伴关系请求。
节点的到达/离开和对某些应用专用消息中感兴趣的注册都通过联盟基础结构来洪泛,导致每一节点具有关于其它伙伴节点以及对应用专用消息感兴趣的注册的全局知识。有了这一全局知识,任何节点可向已表达了对应用专用消息的兴趣的节点直接发送应用专用消息。
第三种联盟机制包括对等节点将所有应用专用消息间接转发到其一个或多个目的地。在第三种机制中,向节点分配标识符(ID),例如128位或160位ID。负责维护对给定应用专用消息感兴趣的注册的节点可被确定为其ID最接近于通过将应用专用消息的目的地身份(例如,URI)映射(例如,散列)到该128位或160位ID空间而获得的节点。
在该第三种机制中,节点到达和离开在整个组织上洪泛。另一方面,对某些应用专用消息感兴趣的注册被转发到被认为是负责这一注册信息的节点。对于可伸缩性、负载平衡和容错,接受对某些应用专用消息感兴趣的注册节点能够可靠地将该注册信息在其邻域集中洪泛。指定节点的邻域集可被确定为具有在指定节点的ID的任一侧上的预定义范围内的ID的节点集。
类似于第二种机制,新加入的节点利用诸如WS发现等广播/组播发现协议来通告其存在,并发出一本地广播/组播查找以检测已经是该联盟基础结构的一部分的节点。该新节点与所发现的节点建立伙伴关系,并使用该伙伴关系来获知参与该联盟基础结构的其它新节点的存在。该新节点然后与新发现的节点建立进一步的伙伴关系,并接受任何新的传入伙伴关系请求。该新节点接受来自它所负责的伙伴的对某些应用层专用消息感兴趣的传入注册,并可将它们在其邻域集中洪泛。由此,消息一般可通过中间路由节点(例如,新加入的节点与其建立伙伴关系的节点或伙伴节点知道的节点)被转发到其最终目的地。
响应于接收传入的应用专用消息,新节点将该消息转发到可能负责维护该消息中指定的目的地的注册信息的伙伴节点。由此,当使用该第三种机制时,联盟基础结构中的每一节点具有关于所有其它节点的全局知识,但是注册信息被有效地在节点之间划分。应用专用消息仅通过可能负责维护对那些应用专用消息感兴趣的注册信息的伙伴节点被发送到其最终目的地。由此,通过仅转发到具有关于所处理的消息的感兴趣的注册信息的全局消息的伙伴节点,实现了间接性。这与第一种机制相反,在第一种机制中,间接性是通过转发到所有伙伴节点来实现的。
第四种联盟机制包括对等节点将消息路由到其它对等节点。该第四种机制至少在节点到达/离开和对某些应用专用消息感兴趣的注册都被路由而非被洪泛的方面与第三种机制不同。路由协议被设计成确保应用专用消息和表达对那些应用专用消息的兴趣的注册消息之间的会合。
图2示出了便于将请求直接路由到伙伴的计算机体系结构200的一个示例。计算机体系结构200描述了不同类型的计算机系统和设备,它们可能在参与联盟基础结构的多个本地发现范围内分布。
工作站233可包括已注册的PnP提供者实例。为向其伙伴通知该PnP提供者实例的存在,工作站233通过联盟基础结构路由注册请求201。注册请求201最初被转发到膝上型计算机231,膝上型计算机231进而将注册请求201转发到消息代理程序237,消息代理程序237进而将注册请求201转发到消息网关241。消息网关241将注册信息注册请求201保存在其数据库中,并向工作站233返回成功消息204。
随后,另一已注册提供者实例(这次是运行服务的实例)在工作站233中活跃起来。这一次,该节点知道消息网关241负责注册,并将注册请求205直接转发到消息网关241。消息网关241将注册信息注册请求205保存在其数据库中,并向工作站233返回成功消息206。
随后,打印机236(例如,UPnP打印机)被通电,并发送通告207。服务器234检测到通告207,并将注册请求208路由到消息代理程序237。消息代理程序237将注册请求208转发到消息网关241。消息网关241将注册信息注册请求208保存在其数据库中,并向服务器234返回成功消息210。
随后,个人计算机242发出查找请求211以发现所有设备。由于个人计算机242不知道将查找请求211转发到何处,因此它通过工作站243路由查找请求211。当注册和查找请求被路由到同一目的地时,路由协议本质上确保了这两个请求之间的会合,导致工作站243将查找请求211转发到消息网关241。消息网关241查找由其维护的注册信息,并将查找请求211转发到工作站233和服务器234。工作站233和服务器234分别向个人计算机242发送响应消息214和216。
该第四种机制通过将请求路由(而非洪泛)到具有关于请求中指定的注册的全局知识的节点(消息网关241)来工作。如下文将详细描述的该第四种机制本质上确保路由可以在O(log N)个中继段内实现,其中N是参与联盟基础结构的节点数。由于该第四种机制本质上划分了节点伙伴关系和注册信息,因此它能够伸缩至非常大的网络,甚至是因特网。
尽管描述了多种联盟机制,然而本领域的技术人员在阅读了本说明书之后可以清楚,其它联盟机制是可能的。
联盟中节点之间的关系
因此,联盟由一组节点构成,这些节点在它们之间协调以形成其中可以系统地且有效地散布和定位信息的动态且可伸缩网络。节点使用一种二元关系被组织成已排序列表来参与联盟,该二元关系是自反的、反对称的、传递的、总的、且在节点身份的域上定义的。已排序列表的两端被连接,由此形成一个环。因此,列表中的每一节点可将其本身视为处于该已排序列表的中间(作为使用模运算的结果)。此外,该列表是双向链接的,使得任何节点可在任何方向上遍历该列表。
每一联盟节点可被分配一个ID(例如,由具有重复检测的随机数生成器),该ID来自0和某一固定上限的一组固定的ID。由此,固定上限的ID加1将导致ID 0(即,从链表的末端移回到链表的始端)。另外,定义了从节点身份的值域到节点本身的1∶1映射函数。
图3描述了示例性链表304和对应的环306。给定这一环,可定义以下函数:
RouteNumerically(V,Msg):给定来自节点身份的值域的值V和消息“Msg”,将该消息传递到其身份可使用映射函数被映射到V的节点X。
Neighborhood(X,S):邻域(Neighborhood)是基数等于S的节点X的任意侧上的一组节点。
当联盟中的每一节点具有关于环的全局知识时,通过将Msg直接发送到节点X实现RouteNumerically(V,Msg),该节点X的身份可通过向V应用映射函数来获得。或者,当节点具有关于其它节点(例如,仅直接相邻的节点)的有限知识时,通过沿环将消息转发到相继的节点直到它到达目的地节点X来实现RouteNumerically(V,Msg)。
作为替代(且有利地),节点可储存关于环的足够知识,来执行分布式二分搜索(而无需具有全局知识或实现直接相邻节点之间的路由)。环知识的量是可配置的,使得维护环知识对于每一节点有足够小的影响,但允许从减少路由中继段数所得的提高的路由性能。
如上所述,可使用在足够大的一组有界自然数上定义的“<”(小于)关系来分配ID,这意味着其范围是在0和某一固定值之间的一组有穷的数字上,包括0和该固定值。由此,参与联盟的每一节点被分配位于0和某一适当选择的上界之间(0和该上界包括在内)的自然数。该范围不必是紧凑的,在分配给节点的数字之问可以有间隙。分配给节点的数字担当节点在环中的身份。映射函数通过将落入两个节点身份之间的数字映射到其身份在数字上最接近于该数字的节点,解决了数字空间之间的间隙。
该方法具有若干优点。通过向每一节点分配均匀分布的数字,更可能使得环的所有分段都是均匀地填充的。此外,可以使用模运算来有效地完成后继、前导和邻域计算。
在某些实施例中,向联盟节点分配来自一ID空间内的ID,该ID空间足够大,使得向两个节点分配同一ID的机会是极其不可能的(例如,当使用随机数生成时)。例如,可向一个节点分配在0到bn-1之间的ID,其中b等于例如8或16,而n等于例如128位或160位的等效位数。因此,可向节点分配例如来自0到1640-1(或约为1.461502E48)范围内的ID。0到1640的范围可提供例如足够的ID数以向因特网上的每一节点分配唯一的ID。
由此,联盟中的每一节点可具有:
一ID,它是在0到bn-1的范围内均匀分布的数字值;以及
一路由表,它由以下各项构成(所有的运算都是模bn来完成的):
后继节点(s);
前导节点(p);
邻域节点(pk,...,p1,p,s,s1,...,sj),使得sj.s.id>(id+u/2),j≥v/2-1,且pk.p.id<(id-u/2),且k≥v/2-1;以及
路由节点(r-(n-1),...,r-1,r1,...,rn-1),使得r±i=RouteNumerically(id±bi,Msg)。其中,b是数基,n是用位数来标识的字段大小,u是邻域范围,v是邻域大小,且运算是模bn来执行的。对于好的路由效率和容错,u和v的值可以是u=b且v≥max(log2(N),4),其中N是物理地参与该联盟的节点的总数。N可以从其长度大于或等于b的环分段上存在的节点数中估算,例如,当存在I的均匀分布时。b和n的典型值是b=8或16,而n=128位或160位的等效位数。
因此,路由节点可以形成跨越环的对数索引。取决于节点在环上的位置,精确的对数索引是可能的,例如,当在id±b1的集合中的每一数字上有一现有节点时,其中i=(1,2,...(n-1))。然而,情况可以是在该集合中的每一数字上没有现有节点。在这些情况下,可选择最接近于id±bi的节点作为路由节点。所得的对数索引是不精确的,且对于集合中的某些数字可能缺少唯一的路由节点。
再次参考图3,图3示出了联盟基础结构中节点之间已排序列表304和对应的环306形式的二元关系的一个示例。已排序列表304的ID空间在0到28-1(或255)的范围之内。即,b=2且n=8。由此,图3所描述的节点被分配范围从0到255的ID。已排序列表304使用了一种二元关系,该二元关系是自反的、反对称的、传导的、总的、且在节点身份的域上定义的。已排序列表304的两端被连接,由此形成了环306。这使得图3中的每一节点可能将其自身视为在已排序列表304的中间。已排序列表304是被双向链接的,使得任一节点可以在任何方向上遍历已排序列表304。用于遍历已排序列表304(或环306)的运算是模28来执行的。由此,255(或已排序列表304的末端)+1=0(或已排序列表304的始端)。
该路由表指出ID 64的后继节点是ID 76(从ID 64开始顺时针第一个ID)。例如,当新节点(例如,具有ID 71)加入或现有节点(例如,ID 76)离开联盟基础结构时,后继节点可以改变。同样,该路由表指出,ID 64的前导节点是ID 50(从ID 64开始逆时针第一个ID)。例如,当新节点(例如,具有ID 59)加入或现有节点(例如,ID 50)离开联盟基础结构时,前导节点可以改变。
该路由表还指出,ID 64的一组邻域节点具有ID 83、76、50和46。一组邻域节点可以是处于ID 64的指定范围(即,邻域范围u)之内的指定数量的节点(即,邻域大小v)。可能能够使用各种不同的邻域大小和邻域范围,诸如V=4且U=10,来标识该组邻域节点。例如,当节点加入或离开联盟基础结构或当指定的节点数或指定范围改变时,邻域集合可以改变。
该路由表还指出,ID 64可以路由到具有ID 200、2、30、46、50、64、64、64、64、76、83、98、135和200的节点。该列表是通过标识id±2i的集合中最接近于每一数字的节点来生成的,其中i=(1,2,3,4,5,6,7)。即,b=2且n=8。例如,具有ID 76的节点可以通过计算最接近于64+23,即72的节点来标识。
节点可将消息(例如,对资源的访问请求)直接路由到前导节点、后继节点、一组邻域节点中的任一节点、或任一路由节点。在某些实施例中,节点实现一数字路由函数来路由消息。由此,RouteNumerically(V,Msg)可以在节点X处实现以将Msg传送到联盟中其ID在数字上最接近于V的节点Y,并将节点Y的ID返回给节点X。例如,具有ID 64的节点可实现RouteNumerically(243,Msg)以使消息被路由到具有ID 250的节点。然而,由于ID 250不是ID 64的路由节点,因此ID 64可将该消息路由至ID 2(最接近于243的路由节点)。具有ID 2的节点进而可实现RouteNumerically(243,Msg)以使消息被路由(直接或通过更多的中间节点)到具有ID 250的节点。由此,情况可以是递归地调用RouteNumerically函数,其中每一调用将消息路由到更接近于目的地之处。
有利的是,本发明的其它实施例便于基于一个或多个邻近性类别(例如,地理边界、路由特征(例如,IP路由中继段)、管理域、组织边界等)中的多个邻近性准则将环划分成环的环或环的树。应当理解,使用同一类型的邻近性准则,环可以被划分一次以上。例如,环可以基于陆地邻近性准则和国家邻近性准则(地理边界邻近性准则)来划分。
由于ID可在ID空间中均匀地分布(随机数生成的结果),环形ID空间的任一给定分段很有可能包含属于不同邻近性类的节点,只要那些类具有近似相同的基数。这一概率在有足够数量的节点时进一步增长以获取有意义的统计行为。
由此,任一给定节点的邻域节点通常是从邻近性的观点较好地散布的。由于所发布的应用程序状态可以在邻域节点之间重复,因此所发布的信息可以与从邻近性观点一样好地散布。
图4示出了便于邻近路由的环的环400。环401可以被视为主环或根环,并包含环402、403和404的每一个中的所有节点,环402、403和404的每一个包含来自环401的节点的一个子集,环401基于一指定的邻近性准则来划分。例如,环401可以基于地理位置来划分,其中环402包含北美洲的节点,环403包含欧洲的节点,环404包含亚洲的节点。
在包含65,536(216)个ID的数字空间中,将消息从具有ID 5,345的北美洲节点路由到具有ID 23,345的亚洲节点可包括在环402内路由该消息,直到标识了亚洲节点的一个相邻节点。该相邻节点然后可将该消息路由到亚洲节点。由此,在北美洲节点和亚洲节点之间做出单个中继段(与多个中继段相反)。因此,路由是以资源有效的方式来执行的。
图5示出了便于邻近路由的一个示例性由邻近性导出的环的分区树500。如图所示,环的分区树500包括多个环。每一个环表示已排序链表的一个分区。每一个环包括具有已排序链表中的ID的多个节点。然而,为清楚起见,由于潜在节点的个数,节点未在环上明确地描述(例如,分区树500的ID空间可以是b=16且n=40)。
在分区树500内,基于准则571(第一管理域边界准则),根环501被划分成多个子环,包括子环511、512、513和514。例如,DNS名的每一分量可被认为是一种邻近性准则,它们之中的局部顺序是根据其在DNS名中从左读到右的出现顺序来导出的。因此,基于准则581(第二管理域边界准则),子环511可被进一步划分成多个子环,包括子环521、522和523。
基于准则572(地理边界准则),子环522可被进一步划分成多个子环,包括子环531、532和533。可按照大陆、国家、邮政编码等对基于位置的邻近性准则进行局部排序。邮政编码本身是分层地组织的,意味着它们可被视为进一步导出邻近性准则的局部排序的子列表。
基于准则573(第一组织边界准则),子环531可以被进一步划分成多个子环,包括子环541、542、543和544。邻近性准则的局部排序列表可以按照给定公司是如何在组织上结构化的来导出,诸如分公司、部门和产品组。因此,基于准则583(第二组织边界准则),子环543可以被进一步划分成多个子环,包括子环551和552。
在分区树500内,每一节点具有单个ID,并沿着从根到叶子的对应分区路径参与各环。例如,参与子环552的每一节点也参与子环543、531、522、511和根501。路由到目的地节点(ID)可以通过如下实现RouteProximally函数来完成:
RouteProximally(V,Msg,P):给定来自节点身份域的值V和消息“Msg”,将该消息传送到被邻近性准则P认为是等效的节点中其身份可以被映射到V的节点Y。
由此,路由可以如下完成:在给定环内渐进地移至更接近于目的地节点,直到如从目的地节点位于当前节点及其后继或前导节点之间的条件中所确定的不能通过在该环内路由来做出更多前进。在这一点上,当前节点通过它所参与的下一更大的环中的伙伴节点开始路由。通过沿朝向根节点的分区路径攀爬来渐进地移向目的地节点的这一过程在所请求的邻近环境内到达与目的地节点最接近的节点时终止,如最初由RouteProximally调用所指定的。
路由中继段可以保留在始发该请求的节点的邻近邻域中,直到目的地节点位于该邻域中之外而在该邻域中不能做出更多的前进。在这一点上,放松邻近性准则,以增加邻近邻域的大小来做出更多前进。重复该过程,直到足够地扩展了邻近邻域以包括目的地节点(ID)。在邻近邻域准则的每一次连续的放松之后做出的路由中继段可以是邻近空间中可能更大的跳跃,同时在数字空间中做出与前一中继段相比相应较小的跳跃。由此,在到达目的地之前,仅做出绝对需要的数量的这些(环间)中继段。
情况可以是避免某些中继段来查找消息,因为当发布的应用程序数据在目的地节点的邻域节点之间重复时,该数据沿分区树向下重复。
为实现邻近路由,每一联盟节点维护对它作为成员参与的所有环中其后继节点和前导节点(类似于单个环的后继节点和前导节点),即邻近前导节点、邻近后继节点和邻近邻域的引用。为使路由有效,节点也可维护对最接近于在环的任一半上的指数增长距离的作为路由伙伴的其它节点(类似于单个环的路由节点)的引用。在某些实施例中,位于一对连续的后继节点或前导节点之间的路由伙伴节点参与同一较低的环,该环由当前节点和数字上分别最接近于后继节点或前导节点对的节点共享。由此,仅当绝对需要做出更多的前进时,路由使用放松的邻近性准则(即,转移到更高的环)跳向朝向目的地节点的转移。因此,消息可以与对应的联盟节点有效地会合。
在某些实施例中,节点实现一邻近路由函数以基于等效的准则关系来路由消息。由此,给定数字V和消息“Msg”,节点可实现RouteProximally(V,Msg,P)以将消息传送到被邻近性准则P认为是等效的节点中其身份可被映射到V的节点Y。邻近性准则P标识了分区树中最低的环,该环是被它认为邻近性上等效的所有节点的公共祖先。它可被表示为通过串接沿根环到由其标识的环的路径找到的邻近性准则而获得的串,用路径分隔符“/”来分隔。例如,标识子环542的邻近性准则可以被表示为“Proximity:/.COM/Corp2/LocationA/Div2”。分区树500中的每一个环可以例如通过用基于SHA的算法来散列其表示串而被分配唯一的数字。如果保留数字0用于根环,则可以推导出RouteNumerically(V,Msg)≡RouteProximally(V,Msg,0)。
例如,子环544中的节点可以实现RouteProximally来标识子环531中更接近的节点(例如,对于子环513中的节点)。进而,子环531可实现RouteProximally来标识子环522中更接近的节点。同样,子环522可实现RouteProximally来标识子环511中更接近的节点。类似地,子环511可实现RouteProximally来标识子环501中更接近的节点。由此,情况可以是递归地调用RouteProximally函数,每一次调用将消息路由到更接近于目的地之处。
由此,当考虑邻近性准则时,到最终目的地的路径上的路由中继段可以保留在始发请求的节点的附近,同时在数字空间中在始发节点和目的地节点之间做出显著的前进,直到到达目的地节点或在所选择的邻近性准则下不能做出更多的前进,此时,将准则放松到刚好足够以做出朝向目的地的更多前进。例如,可足够放松邻近性准则以使消息能够从环531向上路由到522等等。
使用上述邻近性方法,可能将发布的信息限制到给定的环。例如,组织可能希望确保组织专用信息对于其信任域之外的实体是不可用的,这些实体或者(1)隐含地以对其域之外的节点的邻域复制的形式,或者(2)明确地以对这一信息的服务查找请求的形式。第一方面是通过仅在指定环内目标ID邻近的节点之间复制发布的信息来满足的。由于由一个节点始发的所有消息都是通过连续地攀爬它所属的环到根环来路由的,因此在一个组织内始发的所有查找请求很有可能能够定位限定到它的所发布信息,由此隐含地满足了第二方面。
同样,与节点不同,组织自动地与其信任域之外的节点联盟。例如,当在顾客的前提下访问的销售人员将他/她的膝上型计算机连接到网络时,可发生这一情况。理想的是,属于该销售人员的膝上型计算机希望定位在其主域中发布的信息和/或与其主域中在其最低的较佳邻近性环中开始的节点联盟。通常准许与顾客域中的节点联盟。假定这一情形需要定位主域中的种子节点的能力。这一种子节点可用于定位主域中发布的信息、加入主联盟、以及选择性地导入和导出跨域所发布的信息。种子节点有时候也被称为消息网关。
在其它实施例中,实体发布对根环中种子节点的引用。种子节点可以在与该环相关联的唯一数字(诸如通过散列其表示串而获得的数字)(作为目标ID)处发布。种子节点信息还可以由各环中的节点按需高速缓存,这些节点在通往根环中的对应目标ID的路径上。这一按需高速缓存提供了改进的性能,以及当相当频繁地查找半静态信息可能出现的热点的减少。种子节点信息也可以通过诸如DNS等其它手段来获得。
为向限定的发布信息提供容错,每一节点可维护它所参与的所有环中的一组邻域节点。给定以上内容,由节点维护的状态可被总结如下:
●ID,它是在0到bn-1的范围内均匀分布的数字值。
●路由表,它由下列各项构成(所有运算都是模bn来完成的):
○节点所参与的对于每一个环,如环d:
■后继节点(sd)
■前导节点(pd)
■邻域节点(Pkd,...,P1d,pd,sd,s1d,...,sjd),使得sjd.sd.id>(id+u/2),j≥v/2-1,Pkd.Pd.id<(id-u/2),且k≥v/2-1。
○路由节点(r-(n-1),...,r-1,r1,...,rn-1),使得r±i=RouteProximally(id±bi,updateMsg,d),使得在适当时sd≤id+bi≤sd+1或Pd+1≤id-bi≤pd。
其中b是数基,n是按位数表示的字段大小,u是邻域范围,v是邻域大小。
注意,由环“d”中的给定节点维护的邻域节点的子集可以再次作为给定节点也参与的子环“d+1”中的邻域节点出现。由此,可导出给定节点在它所参与的所有D环中维护的邻域节点的总数的上界,为D*max(u,v)/2。这考虑仅保持对给定节点的一个引用,且最坏情况的上界是用于平衡树。
应当注意,当环被划分成多个对应的兄弟子环时,可例如通过起别名,准许指定的节点同时参与多个对应兄弟子环中一个以上子环。起别名可以被实现以将例如来自不同子环的不同状态与给定节点相关联。由此,尽管对给定节点的别名具有相同的ID,每一别名可具有与其相关联的不同状态。起别名允许指定的节点参与具有不同邻近性准则的多个环,这些邻近性准则不必要是更特定邻近性准则的公共祖先。即,指定的节点可参与邻近性树的多个分支。
例如,双NIC(有线和无线)膝上型计算机可被认为是在邻近性上等效于与膝上型计算机通向同一LAN的其它无线和有线节点。但是,这两个不同的邻近性准则可被建模为子准则,这些子准则仅在应用了诸如基于组织成员资格的准则等不同的更高优先级邻近性准则之后才适用。当膝上型计算机属于同一组织时,两个子环中表示(1)有线LAN段中的成员资格,以及2)无线LAN段中的成员资格的起别名的节点合并成环中表示该膝上型计算机所属的组织的单个节点。应当理解,RouteProximally如所预期地工作,而不会对起别名的存在有任何修改。
每一邻近性环可以依照(可能不同的)环参数来配置。环参数可用于定义邻域(例如,环参数可表示邻域范围、邻域大小、查验消息和离开消息定时以及查验和离开消息的的分布模式)、指示特定的联盟机制(例如,来自先前所描述的上述第一到第四联盟机制,或来自其它联盟机制)、或定义同一邻近环中的路由伙伴之间的通信细节。某些环参数可以更一般,从而适用于多个不同的联盟机制,而其它环参数是更具体的,并适用于特定类型的联盟机制。
用于配置较高级邻近环的环参数在某些实施例中可以由较低级邻近环继承,例如,环543可以继承环531的某些环参数(环531进而从环522继承,等等)。由此,与环531相关联的邻域大小和邻域范围也与环541相关联。
然而,继承的环参数可以被更改,和/或邻近环可以依照不同的环参数来个别地配置。例如,环511可以用于包含大量节点的管理域,由此上述第四种联盟机制更适用于环511。另一方面,环521可以用于具有相对较少数量的节点的小企业环境,由此上述第二种联盟机制更适用于环521。由此,与环521相关联的环参数可以被设为(或者继承的参数可以被改为)与关联于环511的环参数不同的值。例如,指示特定类型的联盟机制的环参数可以在环511和521之间不同。定义邻域的类似参数可以在环511和521之间不同。此外,环521可以依照对上述第二种联盟机制专用的特定参数来配置,而环511另外依照对上述第四种联盟机制专用的特定参数来配置。
因此,邻近环可以基于该邻近环中节点的特征(例如,号码、包括的资源等)来灵活地配置。例如,管理员可使用一配置过程(例如,通过用户界面)为邻近环选择环参数。配置过程可便于邻近环之间的继承关系的配置,以及个别邻近环的配置,诸如用于覆盖以其它方式继承的环参数。
图8示出了划分联盟基础结构的节点的方法800的示例流程图。方法800将相对于图5中的分区树500的环来描述。方法800包括访问包含被分配给联盟基础结构中的节点的节点ID的已排序链表的动作(动作801)。例如,可访问由环501表示的已排序链表。已排序链表的节点ID(在环501上描述的节点)可表示联盟基础结构(例如,联盟基础结构100)中的节点。
方法800包括访问表示用于划分已排序链表的多个不同邻近性准则的邻近性类别的动作(动作802)。例如,可访问表示域边界561、地理边界562和组织边界563的邻近性准则。然而,在所访问的邻近性准则中也可表示诸如信任域边界等其它邻近性准则。邻近性类别可包括先前所创建的邻近性准则的局部排序的列表。环可以基于该邻近性准则的局部排序的列表来划分。
方法800包括基于第一邻近性准则将已排序链表划分成一个或多个第一子列表的动作(动作803),这一个或多个第一子列表的每一个包含来自己排序链表的节点ID的至少一个子集。例如,环501可以基于准则571被划分成子环511、512、513和514。子环511、512、513和514的每一个可包含来自环501的节点ID的一个不同的子集。
方法800包括基于第二邻近性准则将从一个或多个第一子列表中选择的第一子列表划分成一个或多个第二子列表的动作(动作804),这一个或多个第二子列表的每一个包含第一子列表中包含的节点ID的至少一个子集。例如,子环511可以基于准则581被划分成子环521、522和523。子环521、522和523的每一个可包含来自子环511的节点ID的一个不同的子集。
图9示出了填充节点的路由表的方法900的示例流程图。方法900将相对于图3中的已排序链表304和环306来描述。方法900包括将一前导节点插入到路由表中的动作(动作901),该前导节点相对于当前节点在已排序链表的第一方向上在该当前节点之前。例如,具有ID 50的节点可作为具有ID 64的节点(当前节点)的前导节点被插入到路由表中。在顺时针方向321上移动(从已排序链表304的一端A移动向已排序链表304的一端B移动),具有ID 50的节点在具有ID 64的节点之前。插入前导节点可以建立当前节点与前导节点之间的对称伙伴关系,使得当前节点是前导节点的伙伴,而前导节点是当前节点的伙伴。
方法900包括将一后继节点插入到路由表中的动作(动作902),该后继节点相对于当前节点在已排序链表的第一方向上在当前节点之后。例如,具有ID 76的节点可作为具有ID 64的节点(当前节点)的后继节点被插入到路由表中。在逆时针方向322上移动,具有ID 76的节点在具有ID 64的节点之后。插入后继节点可建立当前节点和后继节点之间的对称伙伴关系,使得当前节点是后继节点的伙伴,后继节点是当前节点的伙伴。
方法900包括将适当的邻域节点插入到路由表中的动作(动作903),该邻域节点是基于邻域范围和邻域大小在第一方向和相反的第二方向上从已排序链表中标识的。例如,具有ID 83、76、50和46的节点可作为具有ID 64(当前节点)的邻域节点被插入到路由表中。基于邻域范围20和邻域大小4,具有ID 83和76的节点可在顺时针方向321上标识而具有ID 50和46的节点可在逆时针方向322上标识(从已排序链表304的一端B向已排序链表304的一端A移动)。在某些环境中,可能无法标识适当的邻域节点。插入邻域节点可建立当前节点和邻域节点的对称伙伴关系,使得当前节点是邻域节点的伙伴,邻域节点是当前节点的伙伴。
方法900包括将适当的路由节点插入到路由表中的动作(动作904),该路由节点是基于联盟基础结构的ID空间的数基和字段大小在第一和第二方向上从已排序链表中标识的,该路由节点表示已排序链表在第一和第二方向上的对数索引。例如,具有ID 200、2、30、46、50、64、64、64、64、64、76、83、98、135和200的节点可作为具有ID 64的节点的路由节点被插入到路由表中。基于数基2和字段大小8,具有ID 64、64、76、83、98、135和200的节点可在方向321上标识,而具有ID 64、64、50、46、30、2和200的节点可在方向322上标识。如在环306内所描绘的,路由节点表示已排序链表304在顺时针方向321和逆时针方向322上的对数索引。插入路由节点可建立当前节点和路由节点之间的对称伙伴关系,使得当前节点是路由节点的伙伴,路由节点是当前节点的伙伴。
图7示出了考虑邻近性准则来填充节点路由表的方法700的示例流程图。方法700将相对于图5中的环来描述。方法700包括对当前节点所参与的每一分层划分的路由环将一前导节点插入到路由表中的动作(动作701)。每一前导节点在当前节点所参与的每一分层划分的路由环中在第一方向(例如,顺时针)上在当前节点之前。分层划分的路由环依照对应的邻近性准则来划分,并包含双向链接的列表的至少一个子集(可能是整个双向链接的列表)。例如,指定的节点可以参与根环501和子环511、522、523、531和542。由此,从环501和子环511、522、523、531和542的每一个中对指定的节点选择前导节点。
方法700包括对当前节点所参与的每一分层划分的路由环将一后继节点插入到路由表中的动作(动作702)。每一后继节点在当前节点所参与的每一分层划分的路由环中在第一方向上在当前节点之后。例如,从环501和子环511、522、523、531和542的每一个中对指定的节点选择后继节点。
方法700包括对当前节点所参与的每一分层划分的路由环将适当的邻域节点插入到路由表中的动作(动作703)。邻域节点可以基于邻域范围和邻域大小在第一方向(例如,顺时针)和相反的第二方向(例如,逆时针)上从当前节点所参与的分层划分的路由环中标识。例如,可以从环501和子环511、522、523、531和542的每一个中对指定节点标识邻域节点。
方法700包括对当前节点所参与的每一分层划分的路由环将适当的路由节点插入到路由表中的动作(动作704)。例如,可以从环501和子环511、522、523、531和542的每一个中对指定的节点标识路由节点。
在某些实施例中,对节点Y所参与的除叶子环(或在使用别名的实施例中的叶子环)之外的每一邻近性环插入适当的路由节点。适当的路由节点可基于以下表达式来插入:
如果Y.sd.id<Y.id+bi<Y.sd+1.id为真,则使用环d;或者
如果Y.pd.id<Y.id-bi<Y.pd+1.id为真,则使用环d。
如果在前一步骤中尚未标识环,则使用领导环(例如,环501)作为环d。现在,环d是其中节点Y应当查找最接近于z的路由伙伴的邻近性环。
图10示出了将消息朝向目的地节点路由的方法1000的示例流程图。方法1000将相对于图3中的已排序链表304和环306来描述。方法1000包括接收节点接收消息以及指示目的地的数字的动作(动作1001)。例如,具有ID 64的节点可接收指示目的地212的消息。
方法1000包括确定接收节点是在数字上比对应的前导节点离目的地更远以及在数字上比对应的后继节点离目的地更远的至少一种的动作(动作1002)。例如,在方向322上,ID 64比ID 50离目的地212更远,在方向321上,ID 64比ID 76离目的地212更远。方法1000包括确定目的地不在对应于接收节点的邻域节点集内的动作(动作1003)。例如,具有ID 64的节点可确定目的地212不在83、76、50和46的邻域集内。
方法1000包括从对应于接收节点的路由表中标识中间节点的动作(动作1004),该中间节点数字上比对应的路由表中的其它路由节点更接近于目的地。例如,具有ID 64的节点可将具有ID 200的路由节点标识为在数字上比其它路由节点更接近于目的地212。方法1000包括将消息发送到中间节点的动作(动作1005)。例如,具有ID 64的节点可将消息发送到具有ID 200的节点。
图11示出了基于邻近性准则将消息朝向目的地节点路由的方法1100的示例流程图。方法1100将相对于图4和图5中的环来描述。方法1100包括接收节点接收消息以及指示目的地的数字以及邻近性准则的动作(动作1101)。邻近性准则定义了一个或多个节点类。接收节点接收作为基于邻近性准则从一个或多个节点类中选择的当前节点类的一部分的消息。例如,具有ID 172的节点可接收指示目的地201的消息以及指示目的地节点是由环401所表示的类的一部分的邻近性准则。具有ID 172的节点可接收作为环404的一部分的消息。
方法1100包括确定在所选择的节点类的节点中,接收节点是在数字上比对应的前导节点离目的地更远以及在数字上比对应的后继节点离目的地更远中的至少一种的动作(动作1102)。例如,在环404内,具有ID 172的节点在顺时针方向上比具有ID 174的节点离目的地201更远,且在逆时针方向上比具有ID 153的节点离目的地201更远。
方法1100包括对于由邻近性准则定义的一个或多个节点类的任一个,确定目的地不在接收节点的邻域节点集之内的动作(动作1103)。例如,具有ID 172的节点可确定目的地201不在环404或环401中对应的邻域集内。
方法1100包括从接收节点的路由表中标识中间节点的动作(动作1104),该中间节点在数字上比路由表中的其它路由节点更接近于目的地。例如,具有ID 172的节点可将具有ID 194的节点标识为在数字上比环404中的其它路由节点更接近于目的地201。方法1100包括将消息发送到中间节点的动作(动作1105)。例如,具有ID 172的节点可将接收到的消息发送到具有ID 194的节点。具有ID 172的节点可将接收到的消息发送到具有ID 194的节点,以遵从先前定义的邻近性准则的局部排序列表。
节点194可以在环404内尽可能地接近于目的地201。由此,可以放松邻近性到刚好足够的程度,以使在下一路段中在环401内作出朝向目的地的进一步路由。即,路由从环404转移到环401,因为在环404上不能做出朝向目的地的进一步前进。或者,情况可以是具有ID 201的节点在环401内在具有ID 194的节点的邻域内,导致没有进一步的路由。由此,在某些实施例中,放松邻近性准则以到达下一较高的环足以引起进一步的路由。
然而,在其它实施例中,促使转移到下一较高环的邻近性准则的递增放松继续,直到可发生进一步的路由(或直到遇到根环)。即,在可做出进一步的路由前进之前发生到较高环的多次转移。例如,现在参考图5,当在环531上不能做出进一步的路由前进时,可足够放松邻近性准则以转移到环511或甚至转移到根环501。
图6及以下讨论旨在提供对适于在其中实现本发明的计算环境的简要概括描述。尽管并非所需,但本发明将在诸如由计算机系统执行的程序模块等计算机可执行指令的一般上下文中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据类型。计算机可执行指令、相关联的数据结构以及程序模块表示了用于执行此处所揭示的方法的步骤的程序代码手段的示例。
参考图6,用于实现本发明的示例系统包括计算机系统620形式的通用计算设备,包括处理单元621、系统存储器622以及将包括系统存储器622的各类系统组件耦合至处理单元621的系统总线623。处理单元621可以执行被设计成实现计算机系统620的特征的计算机可执行指令,包括本发明的特征。系统总线623可以是若干种总线结构类型的任一种,包括存储器总线或存储器控制器、外围总线以及使用各类总线体系结构的局部总线。系统存储器包括只读存储器(ROM)624和随机存取存储器(RAM)625。基本输入/输出系统(BIOS)626,包含如在启动时协助在计算机620内的元件之间传输信息的基本例程,可储存在ROM 624中。
计算机系统620也可包括用于对磁硬盘639进行读写的磁硬盘驱动器627、用于对可移动磁盘629进行读写的磁盘驱动器628以及用于对可移动光盘631,如CD-ROM或其它光介质进行读写的光盘驱动器630。磁硬盘驱动器627、磁盘驱动器628以及光盘驱动器630分别通过硬盘驱动器接口632、磁盘驱动器接口633和光盘驱动器接口634连接至系统总线623。驱动器及其相关的计算机可读介质为计算机系统620提供了计算机可执行指令、数据结构、程序模块和其它数据的非易失性存储。尽管这里描述的示例环境采用了磁硬盘639、可移动磁盘629以及可移动光盘631,然而也可以使用用于储存数据的其它类型的计算机可读介质,包括盒式磁带、闪存卡、数字多功能盘、Bernoulli盒式磁盘、RAM、ROM等等。
包括一个或多个程序模块的程序代码装置可储存在硬盘639、磁盘629、光盘631、ROM 624或RAM 625中,包括操作系统635、一个或多个应用程序636、其它程序模块637以及程序数据638。用户可以通过键盘640、指点设备642或其它输入设备(未示出),如麦克风、操纵杆、游戏垫、扫描仪等等向计算机系统620输入命令和信息。这些和其它输入设备可以通过耦合至系统总线623的输入/输出接口646连接到处理单元621。输入/输出接口646逻辑上表示各种各样不同的接口中的任一种,诸如串行端口接口、PS/2接口、并行端口接口、通用串行总线(USB)接口、或电子与电器工程师协会(“IEEE”)1394接口(即,火线接口)、或甚至在逻辑上表示不同接口的组合。
监视器647或其它显示设备也通过视频接口648连接到系统总线623。扬声器669或其它音频输出设备也通过音频接口649连接到系统总线623。其它外围输出设备(未示出),如打印机也可连接到计算机系统620。
计算机系统620可连接到网络,诸如办公室范围或企业范围计算机网络、家庭网络、内联网和/或因特网。计算机系统620可通过这类网络与诸如远程计算机系统、远程应用程序和/或远程数据库等外部源交换数据。
计算机系统620包括网络接口653,通过该接口,计算机系统620从外部源接收数据和/或将数据发送到外部源。如图6所示,网络接口653便于通过链路651与远程计算机系统683交换数据。网络接口653逻辑上可表示一个或多个软件和/或硬件模块,诸如网络接口卡和对应的网络驱动器接口规范(“NDIS”)栈。链路651表示网络的一部分(例如,以太网段),而远程计算机系统683表示网络的节点。
同样,计算机系统620包括输入/输出接口646,通过该接口,计算机系统620从外部源接收数据和/或将数据发送到外部源。输入/输出接口646通过链路659耦合至调制解调器654(例如,标准调制解调器、电缆调制解调器或数字用户线(“DSL”)调制解调器),通过链路659,计算机系统620从外部源接收数据和/或将数据发送到外部源。如图6所示,输入/输出接口646和调制解调器654便于通过链路652与远程计算机系统693交换数据。链路652表示网络的一部分,而远程计算机系统693表示网络的节点。
尽管图6表示了用于本发明的合适的操作环境,然而本发明的原理可用于在适当的修改下(如有必要)能够实现本发明的原理的任一系统。图6所示的环境仅是说明性的,并且决不表示其中可实现本发明的原理的各种各样的环境中的即使一小部分。
依照本发明,节点、应用层和其它较低层、以及包括路由表和节点ID的相关联的数据可被储存并从与计算机系统620相关联的任一计算机可读介质中访问。例如,这些模块的各部分以及相关联的程序数据的各部分可包括在操作系统635、应用程序636、程序模块637和/或程序数据638中,以储存在系统存储器622中。
当诸如磁硬盘639等大容量存储设备耦合至计算机系统620时,这些模块和相关联的程序数据也可被储存在大容量存储设备中。在联网环境中,相对于计算机系统620所描述的程序模块或其部分可被储存在远程存储器存储设备中,诸如与远程计算机系统683和/或远程计算机系统693相关联的系统存储器和/或大容量存储设备。这些模块的执行可如上所述地在分布式环境中执行。
本发明可以用其它具体形式来实施而不脱离其精神或本质特征。所描述的实施例在各方面都被认为仅是说明性而非限制性的。因此,本发明的范围由所附权利要求书而非以上说明书来标识。落入权利要求书的等效技术方案的意义和范围之内的所有改变都包含在其范围之内。