CN1961531A - 网络体系结构 - Google Patents

网络体系结构 Download PDF

Info

Publication number
CN1961531A
CN1961531A CNA2005800113846A CN200580011384A CN1961531A CN 1961531 A CN1961531 A CN 1961531A CN A2005800113846 A CNA2005800113846 A CN A2005800113846A CN 200580011384 A CN200580011384 A CN 200580011384A CN 1961531 A CN1961531 A CN 1961531A
Authority
CN
China
Prior art keywords
node
network
message
hspp
nodes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CNA2005800113846A
Other languages
English (en)
Inventor
克里斯多佛·迈克尔·戴维斯
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Individual
Original Assignee
Individual
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Individual filed Critical Individual
Publication of CN1961531A publication Critical patent/CN1961531A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L41/00Arrangements for maintenance, administration or management of data switching networks, e.g. of packet switching networks
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L12/00Data switching networks
    • H04L12/54Store-and-forward switching systems 
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04LTRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
    • H04L45/00Routing or path finding of packets in data switching networks
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04WWIRELESS COMMUNICATION NETWORKS
    • H04W84/00Network topologies
    • H04W84/18Self-organising networks, e.g. ad-hoc networks or sensor networks

Abstract

本发明提供了一种网络体系结构。一个实施方案包括通过链路互连的多个节点,每个节点可在数据库中维持其他节点的消息。该数据库包括网络中其他节点的列表,以及对于那些其他节点中的每个节点的“下一最佳步骤”,指向到达那个其他节点的下一最佳步骤的相邻节点。当网络的特定节点不在列表中,那么该下一最佳步骤被假定为数据库中最通常被标识的下一最佳步骤。这样的网络将形成一个“核心”,其中网络中的任何节点可通过首先搜出核心上的其他节点找到网络中的任何其他节点。一旦节点通过核心互相定位,根据那些节点之间的最期望的路径在网络中形成更合适的路由。

Description

网络体系结构
优先权要求
本申请要求以下申请的优先权:2004年2月16日提交的加拿大专利申请NO.2,457,909;2004年2月17日提交的美国临时专利申请NO.60/544,341;2004年4月20日提交的加拿大专利申请NO.2,464,274;2004年5月17日提交的加拿大专利申请NO.2,467,063;2004年6月22日提交的加拿大专利申请NO.2,471,929;2004年8月16日提交的加拿大专利申请NO.2,476,928和2004年9月20日提交的加拿大专利申请NO.2,479,485,以上所有申请的内容通过引用的方式纳入本说明书。
技术领域
本发明一般涉及互相通信的电子、电信和计算设备,更具体而言,为此涉及一种网络体系结构。
背景技术
如今网络设备是我们社会组织的一个非常重要的方面。公共交换电话网(“PSTN”)可能是改变人们交互方式的普遍存在的电信设备网络的最早示例。现在,移动电话网络、因特网、局域网(“LAN”)、广域网(“WAN”)、基于网际协议的语音传输(“VOIP”)网络被广泛部署并正在逐渐形成。
老一套的观点认为,为了实现联网功能,这些设备中的每种设备必须能够互相到达。就PSTN来说,要采用电话号码系统,包括国家代码、地区码、本地交换机等。至少在北美,电话设备的激增已经使标准10位数字号码方案受到了压力。就因特网来说,网际协议版本4(“IPV4”)公布了网际协议(“IP”)地址系统以便识别因特网上的点,因此每个已互联的设备拥有一个使它在因特网上可达的地址。至少部分地因为IPV4地址字段的有限长度,IP地址几乎不能提供与它们的物理位置有关的地理关系。结果,整个因特网的路由器和路由表急速膨胀,增加了通信量路由选择的复杂性,也增大了网络时延。IPV6提供了可能的救济地址,但是升级到IPV6预计很慢。
概括来说,许多现有技术网络体系结构依靠路由设备维持整个网络的设备地址和位置。这样的路由设备实质上作为交通警察,沿着适合的路径路由通信量。随着网络的增长,这样的体系结构变得庞大而难以使用。
已经提出了不同的“无路由器”网络体系结构。这些体系结构中的一些被称为对等网络,而其他的被称为自组织(ad-hoc)网络。无论如何,这些现有技术的体系结构也易于遭受规模和/或其他限制。一种改进网络体系结构的尝试是Ad Hoc按需距离矢量(“AODV”)。AODV是一种反应式协议,它利用广播泛洪以便建立新的连接或修复已断的连接。在因特网工程任务组(“IETF”)文档中详细描述了AODV,该文档可在http://www.ietf.org/rfc/rfc3561.txt上找到。尽管AODV具有能够容易地将节点组织成一个ad-hoc网络的优点,但是它的一个问题在于最大网络规模非常有限。
另一种改进网络体系结构的尝试是“目的序列距离矢量”(“DSDV”)。DSDV是一种先验式协议,它利用固定的更新泛洪以便创建和维持到达和来自网络中所有节点的路由。在http://citeseer.ist.psu.edu/cache/papers/cs/2258/http:zSzzSzwww.srvloc.orgzSzcharliepzSztxtzSzsigcomm94zSzpaper.pdf/perkins94highly.pdf或http://citeseer.ist.psu.edu/perkins94highly.html上可找到DSDV的详细描述。尽管DSDV具有提供无回路路由的优点,但是它有着只能在小型网络中工作的缺点。在大型网络中控制通信量容易超出可用带宽。
另一种改进网络体系结构的尝试是“优化链路状态路由”(“OLSR”)。OLSR是一种先验式协议,它试图建立网络拓扑信息。在IETF草案http://hipercom.inria.fr/olsr/draft-ietf-manet-olsr-11.txt上可找到OLSR的详细描述。尽管OLSR具有作为一种更有效链路状态协议的优点,但是它仍然不能支持更大型的网络。
另一种改进网络体系结构的尝试是“开放最短路径优先”(“OSPF”)。OSPF是一种先验式链路状态协议,它被一些因特网核心路由器所使用。在IETF草案http://www.ietf.org/rfc/rfc1247.txt上可找到OSPF的详细描述。尽管OSPF允许核心因特网路由器绕过故障路由,但是它能够支持的网络规模是有限制的。
尽管AODV、DSDV、OLSR和OSPF相互之间存在差异,但是它们都存在一些相同的问题,例如很难对超过几百个节点进行扩展。因为随着网络的增长,所需要的控制通信量的数量增长得更快,于是出现了上述局限性。所需要的控制通信量的数量将迅速地超出网络容量。
通常,现有技术网络体系结构既不提供好的可扩展性,也不提供允许低容量设备与更大型网络完全交互的能力,并且在移动环境中,现有技术体系结构不能总是提供无缝移动。
发明内容
本发明的目的是提供一种用于联网的新型系统和方法,该系统和方法消除或减轻上述已确定的现有技术缺陷中的至少一个缺陷。
本发明的第一方面提供一种网络,该网络包括多个节点和多条将所述节点的相邻节点互连的链路。每个所述节点可操作地维持有关在所述节点第一部分中的每个所述节点的信息。该信息包括:在第一部分中的所述节点中的另一个节点的第一标识;以及对于每个第一标识,表示相邻节点的第二标识,所述相邻节点是到达相应于第一标识的所述节点中的另一个节点的期望步骤。每个所述节点可操作地确定一个相邻节点,所述相邻节点是将所述节点定位在不包括在第一部分中的所述节点的第二部分中的期望步骤。
在第一方面的一个具体实现中,所述确定是基于哪个相邻节点在每个第二标识中出现最频繁。
在第一方面的一个具体实现中,每个所述节点可操作地与其相邻节点交换信息。
在第一方面的一个具体实现中,每条链路具有一组服务特征,使得所述节点中的两个节点之间的任何一条路径具有服务特征的一个累积组;并且其中所述期望步骤是基于哪条路径具有一个期望的服务特征累积组。
在第一方面的一个具体实现中,所述服务特征包括带宽、时延和比特误码率中的至少一个。
在第一方面的一个具体实现中,所述节点是计算机、电话、传感器和个人数字助理中的至少一种。
在第一方面的一个具体实现中,所述链路是基于有线和无线连接中的至少一种。
在第一方面的一个具体实现中,网络核心在相邻节点之间形成,所述相邻节点互相确定对方到达第二部分中节点的期望步骤。
在第一方面的一个具体实现中,每个节点可操作地指示在核心和该节点之间的其他节点以维持有关该节点的信息。
在第一方面的一个具体实现中,每个节点可操作地请求有关第二部分中节点的信息;每个节点可操作地向核心和该节点之间的其他节点发出该请求。
本发明优于现有技术的一个优势在于,在此所教导的网络体系结构考虑了大规模自组织网络。对于某些实施方案,由于网络中个别的节点实际上需要拥有整个网络消息,于是本功能被激活。总的来说,网络中的所有节点拥有整个网络消息,而不知道其他节点却需要找到这样的其他节点的节点通过从网络中拥有相关消息的其他节点那里寻找这样的消息,从而被提供了定位那些其他节点的方法。由于这些原因和其他原因,本发明是一种新型自组织网络体系结构,与现有技术自组织网络体系结构相比,它能够用于大得多的自组织网络。因此,本发明的第二方面提供一种自组织网络,它包括通过多条链路互连的至少2,000个节点。本发明的第三方面提供一种自组织网络,它包括通过多条链路互连的至少5,000个节点。本发明的第四方面提供一种自组织网络,它包括通过多条链路互连的至少10,000个节点。本发明的第五方面提供一种自组织网络,它包括通过多条链路互连的至少100,000个节点。
附图说明
现在,将参照附图仅通过实施例的方式描述本发明,其中:
图1是根据本发明一个实施方案的网络示意图;
图2示出根据本发明一个实施方案的描述传播网络消息的方法的流程图;
图3是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图4是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图5是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图6是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图7是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图8是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图9是根据本发明一个实施方案的网络示意图,描述图2方法的步骤的执行;
图10是根据本发明另一个实施方案的网络示意图;
图11是根据本发明另一个实施方案的网络示意图;
图12是图11网络的另一个示意图;
图13是根据本发明另一个实施方案的网络示意图;
图14是根据本发明另一个实施方案的网络示意图;
图15是图14网络的另一个示意图;
图16是图14网络的另一个示意图;
图17是根据本发明另一个实施方案的网络示意图;
图18示出根据本发明另一个实施方案描述获得网络消息的方法的流程图;
图19是根据本发明另一个实施方案的网络示意图;
图20示出根据本发明另一个实施方案的流程图,描述交换信息以在节点之间建立连接的方法;
图21示出根据本发明另一个实施方案的流程图,描述在节点之间建立连接的方法的初始化过程;
图22是根据本发明另一个实施方案的传播节点消息方法的网络示意图,示出累积链路成本的可加性;
图23示出根据本发明一个实施方案的传播节点消息方法的流程图,描述通过网络的节点消息流;
图24示出根据本发明一个实施方案的传播节点消息方法的流程图,描述通过网络的节点消息流;
图25示出根据本发明一个实施方案的传播节点消息方法的流程图,描述通过网络的节点消息流;
图26示出根据本发明一个实施方案的传播节点消息方法的流程图,描述通过网络的节点消息流;
图27是根据本发明一个实施方案示出用来检测一个孤立核心的方法的网络示意图;
图28示出根据本发明一个实施方案描述利用TCP/IP作为可仿真的协议示例通过网络路由的方法的流程图;
图29是一个网络示意图,示出节点A直接连接到节点B和C;节点C只连接到节点A;以及节点B直接连接到4个节点;
图30示出根据本发明一个实施方案描述如何计算队列上的服务时间的流程图;
图31是根据本发明一个实施方案说明节点和队列的排列的网络示意图;
图32示出根据本发明一个实施方案描述说明队列消息传播到网络的一系列步骤的若干流程图;
图33是根据本发明一个实施方案的网络示意图,示出网络中恰好已经知道EUS所创建的队列的每个节点;
图34是图33网络的示意图,其中具有EUS所创建的队列的节点之间的连接中的一个连接被删除;
图35是图33网络的示意图,其中与具有EUS所创建的队列的节点失去连接的直接连接节点被设置为无穷大时延;
图36是图33网络的示意图,其中所有节点的“选定目的地”为无穷大;
图37是图33网络的示意图,其中所有能被设置成无穷大的节点被设置成无穷大;
图38是图33网络的示意图,其中已经被设置成无穷大的每个节点暂停一段固定的时间,然后挑选它所能发现的非无穷大的最低时延目的地;
图39是图33网络的示意图,示出一个处于无穷大的节点一旦变成非无穷大,就立即通知与它直接连接的节点;
图40示出一个流程图,描述在图33-39示意图中概述的输入时延更新;
图41示出一个流程图,描述处于无穷大的时延;
图42是一个网络示意图,说明在最终发送者和最终接收者之间的节点上的数据流;
图43是一个网络示意图,示出一个要被避免的潜在回路的示例;
图44示出一个将一段时间期间的中间时延和另一段时间期间的最大时延进行比较的图表;
图45是一个曲线图,描述随时间的队列中的数据字节数,并示出在时间间隔期间最小的队列水平;
图46是一个网络示意图,示出当一个满负荷节点发现它发送给可能的另外选定的目的地的GUID时,它就知道该选择将是错误的选择;
图47示出一个流程图,描述当非“满负荷”的时候,决定何时添加/删除选定的目的地的方法;
图48是一个网络示意图,示出在节点中而不是在数据流中被意外创建的回路;
图49是一个网络示意图,示出节点A和节点B协商以便节点A能发送到节点B;
图50是一个网络示意图,示出节点A怎样表示它想要发送更多数据;
图51是一个网络示意图,示出当配额有限时,两个节点怎样能够协商消息传送;
图52是一个网络示意图,示出当配额有限时,两个节点怎样能够协商消息传送;
图53是一个网络示意图,示出当配额有限时,两个节点怎样能够协商消息传送;以及
图54是一个网络示意图,示出每个节点到达核心的下一最佳步骤,以及为更好图示这个过程创建的分级结构而重排的相同网络。
具体实施方式
现在参照图1,根据本发明一个实施方案的网络一般表示为30。网络30包括多个节点N1、N2和N3。总的来说,节点N1、N2和N3被称为节点N(nodes N),并且一般地它们被称为节点N(node N)。这种命名法被用于在此讨论的其它元素。
节点N1通过第一物理链路L1连接到节点N2。节点N2通过第二链路L2连接到节点N3。节点N1与节点N2相邻,同样地节点N2与节点N1相邻,因为它们通过链路L1连接。出于同样原因,节点N3与节点N2相邻,同样地节点N2与节点N3相邻,因为它们通过链路L2连接。因此,在此所用的术语“相邻”(以及在上下文需要时它的变体)是指节点N通过单条链路L连接另一个节点N。
每个节点N是通过相应链路L可操作地与另一个节点N通信的任何类型的计算设备。可以考虑任何类型的计算设备,如个人计算机(“PC”)、便携型计算机、个人数字助理(“PDA”)、基于网际协议的语音传输(“VOIP”)有线电话、蜂窝电话、灵敏传感器等,或者它们的组合。每个节点N可以是不同类型的计算设备。
每条链路L是基于任何类型的通信链路、或它们的组合或混合,它们是有线或无线的,包括但不局限于OC3、T1、码分多址(“CDMA”)、正交频分多址(“OFDM”)、全球移动通信系统(“GSM”)、全球分组中继业务(Global Packet Relay Service“GPRS”)、以太网、802.11以及它的变体、蓝牙等。
现在,应该理解的是,用来实现特定节点N的计算设备的类型,以及它们之间的链路L的类型是没有特别限制的,概括地说,每个节点N通过它们之间的相应链路L可操作地与任何相邻节点N连接并通信。
每个节点N维持一个网络信息数据库D,该数据库被配置用来维持网络30中有关至少一些其它节点N的消息。在与数据库的相应节点N有关的计算环境中,每个数据库D被维持在易失性存储器(例如随机访问存储器(“RAM”))和/或非易失性存储器(例如硬盘驱动器)或易失性和非易失性存储器的组合中。每个节点N利用数据库D定位网络30中的其它节点N,使得该特定节点N可发送通信量给该其它节点N和/或共享有关其它节点N的消息。
图1示出用带有标号D的椭圆表示的并位于它的相应节点N中的各数据库D,以表示节点N维持它自己的相应数据库D。更具体而言,数据库D1在节点N1中示出,数据库D2在节点N2中示出,数据库D3在节点N3中示出。选择定义每个数据库D结构的大小、复杂性和其它开销度量标准,使得特定数据库D只占用在它的相应节点N中可利用的全部计算资源的一部分。因此,尽管不是必要的,但是可典型地选择数据库D的结构,以便留出节点N的计算资源的相当部分不被占用,以执行该节点N的常规计算任务。有关上述开销度量标准的更多细节将在下面进行更详细地论述。
然而,对于图1中的示例性网络30,将假定所有节点N拥有基本相等的计算资源,以及所有链路L具有基本相同的服务特征。(当用在此处时,应用于链路L的术语“服务特征”包括任何已知的服务质量(“QOS”)度量标准,该标准包括带宽、时延、比特误码率等能用来评估链路L质量的方面。服务特征还可包括定价,因为在一条链路上传送通信量所引起的财务费用与在另一条链路上传送通信量所引起的费用可能是不同的)。因此,将假定每个数据库D具有基本相同的结构——这种结构的一个示例在表I中示出。
                   表I
         每个数据库D的示例性结构
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
概括地说,每个数据库D提供除了维持该特定数据库D的节点N之外的网络30中至少一部分节点N(“其它节点N”)的列表。每个数据库D还根据那些其它节点N在网络30中的重要性对它们进行排名。反映重要性的度量标准包括但不局限于,这些其它节点N的接近度,和/或其它节点N中的哪个节点在网络30中传送成比例的更大份额的通信量,和/或节点N和流入另一个节点N的数据流的接近度。现在,本领域技术人员会想起其它度量标准,其中一些将在下文中进行更详细地论述。每个数据库D还标识那些其它节点N,以及表示到达相应其它节点N的下一最佳步骤的相邻节点N。
更详细地说明表I,在表I的列1中,“排名”表示一个数字,该数字值基于在该特定数据库D中维持的其它节点N的数量而在数据库D中每行递增。
在表I的列2中,“节点名”标识特定的其它节点N。这样的节点名可基于任何已知的或未来的网络寻址方案。已知节点寻址方案的示例包括电话号码、或媒体访问控制(“MAC”)地址、或网际协议(“IP”)地址。这种寻址方案可根据影响网络30和/或在网络30里的节点N的设计的其它因素而被选定。然而,值得注意的是,在寻址方案中,每个节点N的名字不必反映节点N在网络中的位置,在其它寻址方案——例如具有对应于地理位置的区域码的电话号码中可发现这一点。在此为了简化实施方案的说明,节点名根据附图中的标号字符被标识。例如,列2下的节点名表项表示“N1”,那么节点N1被标识。
在表I的列3中,“最佳邻居”表示哪个相邻节点N提供到达列2中命名的其它节点N的整个路由中的下一最佳步骤。[在本实施方案中,使用了“最佳邻居”这一术语,但是这不应该被解释为对于本发明的所有实施方案有限定的意思,因为可以选定任何期望的标准来确定“最佳邻居”或其他的期望邻居。]因此,列3将总是标识一个相邻节点N,而列2不必表示一个相邻节点N。根据列2所用的相同的寻址方案,应该理解,列3中的表项实际上不必是相邻节点N的名字,而可以是该特定相邻节点N的任何指示符。不过,在此为了简化实施方案的说明,列3中的表项实际上将反映该相邻节点N的名字。
当网络30被初始化时(例如当所有节点N都根据图1所示的拓扑相互连接时),每个数据库D的内容将是空的,除了每个数据库D将包含一个“空”表项,标识拥有该特定数据库D的特定节点N。因此表II示出数据库D1最初是怎样被填充一个“空”表项来标识节点N1的。
                     表II
              数据库D1的初始内容
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N1   N/A
更详细地说明表II,在表II列1行0中,该表项被赋予空表项“0”,以表示数据库D1中这个特定信息是关于拥有数据库D1的实际节点N1的。在表II列2行0中,表项为“N1”,以标识名为N1的节点N1。在表II列3行0中,表项为“N/A”,以表示最佳邻居不适用,因为表II的这个表项是指数据库D1的拥有者。
因而同样地,表III示出数据库D2最初是怎样被填充一个“空”表项,标识节点N2的。
                  表III
            数据库D2的初始内容
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N2   N/A
因而同样地,表IV示出数据库D3最初是怎样被填充一个“空”表项,标识节点N3的。
                   表IV
             数据库D3的初始内容
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N3   N/A
为了填充每个数据库D的剩余项,并维持它们的内容,在每个节点N上的微处理器将执行一组程序指令。对于每个节点N,那些指令可以是基本相同的。现在参照图2,用200一般性地表示根据本发明一个实施方案的表示维持网络消息方法的流程图。方法200可被实现为在每个节点N上的微处理器上执行的一组程序指令,用来填充和维持每个数据库D的内容。为了有助于说明该方法,从而假定方法200在系统30中的每个节点N上运行,以便维持节点N相应的数据库D。因而,对方法200的下述论述将会进一步理解系统30和它的各种元素。(然而,要理解的是,可以改变系统30和/或方法200,并且不必按照图2中所示的严格顺序执行,系统30和/或方法200不必严格按照在此所述的那样工作,并且这些变体是在本发明的范围之内。)
因此,在开始说明方法200之前,将假定每个节点N的数据库D仅根据表II、III和IV被填充,并且每个节点N已经被激活并根据图1中所示的链路L的结构物理地相互连接。
首先从步骤210开始,确定邻居的存在。概括地说,在步骤210中,每个节点N确定它是否拥有任何新的相邻节点N,或者是否有任何现有相邻节点N已经终止了和该节点N的连接。因此,当节点N1首先执行步骤210时,节点N1将在链路L1上发送出一个初始化消息给节点N2,以询问节点N2的存在和链路L1的终结。可根据与用来实现链路L1的协议类型相应的任何已知方法来实现这样的初始化消息。
同样地,步骤210也将被节点N2执行,因此节点N2将在链路L1上发送出一个网络初始化信号给节点N1,以询问节点N1的存在。出于同样原因,节点N2将在链路L2上发送出一个网络初始化信号给节点N3,以询问节点N3的存在。
最后,步骤210还将被节点N3执行,因此节点N3将在链路L2上发送出一个网络初始化信号给节点N2,以询问节点N2的存在。
现在参照图3,通过示出根据上文被发送的多个初始化消息IM来表示每个节点N对步骤210的最初执行。具体地,初始化消息IM1-2正从节点N1发送到节点N2;初始化消息IM3-2正从节点N3发送到节点N2;初始化消息IM2-3正从节点N2发送到节点N3;初始化消息IM2-1正从节点N2发送到节点N1。在本实施方案中,初始化消息IM不交换节点消息,以简化初始化消息IM,并允许节点N的节点消息以对所有节点N基本相同的方式传播。由于初始化消息IM与节点维持网络消息的能力有关,所以该初始化消息IM可包括节点N的处理和存储器特征。这样的处理和存储器特征可包括:用来维持网络消息的节点N的存储器等等。然而在本实施方案中,节点名字N本身不会作为初始化消息IM的一部分被交换。
由于利用了初始化消息IM来定位邻居,现在每个节点N将会知道它的相邻节点N,从而能够通过利用相邻数据库D来开始填充和维持它的相应数据库D。
这样,再次参照图2,方法200将从步骤210前进到步骤220,在步骤220,网络消息将在相邻节点N之间被交换,这些相邻节点已经在步骤210中被标识。现在每个节点N可以利用相邻数据库D来得到有关网络N的更多消息。
现在参照图4,通过示出一组双向消息交换消息KEM,表示每个节点N对步骤220的最初执行。在节点N1和节点N2之间的消息交换被表示为消息交换消息KEM1-2,同时在节点N2和节点N3之间的消息交换被表示为消息交换消息KEM2-3。
再次参照图2,方法200接着从步骤220前进到步骤230,在步骤230,由于来自步骤220的信息交换,本地消息被更新。作为交换消息KEM的结果,数据库D1、D2和D3能被更新以反映有关相邻节点N的信息,分别如表V、VI、VII所示。因此,表V示出数据库D1在节点N1最初执行步骤230后现在是怎样被填充的。
                  表V
             (从表III更新)
                数据库D1
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N1   N/A
  行1   1   N2   N2
更详细地说明表V,在行0中保留了来自表III中的相同内容。但是,现在行1被填充,示出现在节点N1拥有名为节点N2的节点的消息,并且节点N2是最佳邻居,通过该最佳邻居可以到达节点N2。
因此同样地,表VI示出数据库D2在节点N2最初执行步骤230后现在是怎样被填充的。
               表VI
           (从表IV更新)
             数据库D2
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N2   N/A
  行1   1   N1   N1
  行2   2   N3   N3
更详细地说明表VI,在行0中保留了来自表IV中的相同内容。但是,现在行1被填充,示出现在节点N2拥有名为节点N1的节点的消息,并且节点N1是最佳邻居,通过该最佳邻居可以到达节点N1。出于同样原因,现在行2被填充,示出现在节点N2拥有名为节点N3的节点的消息,并且节点N3是最佳邻居,通过该最佳邻居可以到达节点N3。注意到节点N1被分配了排名“1”,而节点N3被分配了排名“2”。在本实施例中,考虑到并不存在实际上选择哪个排名更高的度量标准,这种排名的制定纯粹是为了方便起见。然而,对于基于更复杂标准的排名制定,将在下文中进行更为详细的论述。
因此同样地,表VII示出数据库D3在节点N3最初执行步骤230后是怎样被填充的。
                  表VII
               (从表V更新)
                 数据库D3
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N3   N/A
  行1   1   N2   N2
更详细地说明表VII,在行0中保留了来自表V的相同内容。但是,现在行1被填充,示出现在节点N3拥有名为节点N2的节点的消息,并且节点N2是最佳邻居,通过该最佳邻居可以到达节点N2。
表V、VI和VII的内容如消息路径K所示,由图5中点线表示。消息路径K1-2对应表V的行1,表示节点N1拥有N2的消息;消息路径K2-1对应表VI的行1,表示节点N2拥有N1的消息;同样地,消息路径K2-3对应表VI的行2,表示节点N2拥有节点N3的消息;消息路径K3-2对应表VII的行1,表示节点N3拥有节点N2的消息。
在起始节点N上产生的供目的地节点N使用的有效载荷通信量现在可以根据消息路径K真正被发送给节点N,该路径K也就是在起始节点N和目的地节点N之间存在的消息路径。这种有效载荷通信量的发送可通过列3中所示的最佳邻居路由选择实现,在此意义上,起始节点N的数据库D中列2被有关目的地节点N的网络消息填充。
(当用在此处时,“有效载荷通信量”或“有效载荷”指的是供目的地节点N使用的在起始节点N上执行的应用所产生的任何数据。例如,在节点N是计算机的情况下,那么有效载荷通信量可包括电子邮件、网页、应用文件、打印机文件、音频文件、视频文件等。在节点N是电话的情况下,那么有效载荷通信量可包括声音传输。现在本领域技术人员会想起其它类型的有效载荷数据。)
更具体而言,节点N1和节点N2现在能交换有效载荷通信量,因为它们拥有彼此的消息。节点N2和节点N3也能交换有效载荷通信量,因为它们拥有彼此的消息。然而,在这种情况下,节点N1和节点N3不能交换通信量,因为它们没有拥有彼此的消息。
现在,方法200已经完全执行一次,于是方法200从步骤230循环回到步骤200,在步骤200方法200重新开始第二次。再回到步骤210,确定邻居的存在。在贯穿方法200的第二次示例性循环过程中,将假定没有添加新的节点N到网络30,也没有现有节点N被删除。相应地,既然没有发生变化,那么在步骤210什么也没有发生,于是方法200从步骤210前进到步骤220。
继续本实施例,再参照图2,方法200将再次从步骤210前进到步骤220,在步骤220,将在相邻节点N之间交换附加网络消息。每个节点N现在可再一次利用相邻数据库D来获得有关网络N的更多消息。
现在参照图6,再次通过双向消息交换消息KEM表示每个节点N对步骤220的第二次执行。节点N1和节点N2之间的消息交换被表示为消息交换消息KEM1-2,而节点N2和节点N3之间的消息交换被表示为消息交换消息KEM2-3。
再次参照图2,接着方法200第二次从步骤220前进到步骤230,在步骤230,由于来自步骤220的信息交换,本地消息被更新。由于交换的消息KEM,数据库D1、D2和D3可被更新以反映有关相邻节点N的信息,分别如表VIII、IX、X中所示。因此,表VIII示出数据库D1在节点N1第二次执行步骤230后现在是怎样被填充的。
                  表VIII
               (从表V更新)
                 数据库D1
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N1   N/A
  行1   1   N2   N2
  行2   2   N3   N2
更详细地说明表VIII,在行0和行1中保留了来自表V的相同内容。然而,现在行2被填充,示出现在节点N1拥有名为节点N3的节点的消息,并且节点N2是最佳邻居,通过该最佳邻居可以到达节点N3。
因此同样地,表IX示出数据库D2在节点N2最初执行步骤230后现在是怎样被填充的。
                   表IX
               (从表VI更新)
                 数据库D2
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N2   N/A
  行1   1   N1   N1
  行2   2   N3   N3
更详细地说明表IX,在行0、行1和行2中保留了来自表VI的相同内容,因为网络30中不存在节点N2通过与它的相邻节点N交换消息可知道的新节点N。
因此同样地,表X示出数据库D3在节点N3最初执行步骤230后是怎样被填充的。
              表X
         (从表VII更新)
            数据库D3
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N3   N/A
  行1   1   N2   N2
  行2   2   N1   N2
更详细地说明表X,在行0和行1中保留了来自表VII的相同内容。然而,现在行2被填充,示出现在节点N3拥有名为节点N1的节点的消息,并且节点N2是最佳邻居,通过该最佳邻居可以到达节点N1。
表VIII、IX和X的内容如消息路径K所示,由图7中点线表示。在图7中,(以及如前面图5中所示),消息路径K1-2表示节点N1拥有N2的消息;消息路径K2-1表示节点N2拥有N1的消息;同样地,消息路径K2-3表示节点N2拥有节点N3的消息;以及消息路径K3-2表示节点N3拥有节点N2的消息。然而,现在图7还包括两条附加消息路径:消息路径K1-3表示节点N1现在拥有节点N3的消息,以及同样地,消息路径K3-1表示节点N3现在拥有节点N1的消息。
在起始节点N上产生的供目的地节点N使用的有效载荷通信量现在可以根据消息路径K真正被发送给节点N,该路径K也就是在起始节点N和目的地节点N之间存在的消息路径。这种有效载荷通信量的发送可通过列3中所示的最佳邻居路由选择实现,在此意义上,起始节点N的数据库D中列2被有关目的地节点N的网络消息填充。因此,更具体而言,现在所有节点N都能交换有效载荷通信量,因为它们拥有彼此的消息。特别注意,在通过方法200的这次操作后,节点N1和节点N3可以通过节点N2作为它们之间的步骤相互发送有效载荷通信量给对方。
现在方法200已经完全执行两遍,于是方法200从步骤230循环回到步骤200,在步骤200方法200重新开始。在贯穿方法200的第三次示例性循环执行之前,将假定由于链路L2的故障,节点N3从网络30中被删除,如图8中所示。重新回到步骤210,确定邻居的存在。第三次,在初始化消息IM的交换过程中,节点N2和N3将确定它们相互不再是邻居。在步骤220,根据在步骤210找到的存在邻居,与邻居交换消息。最后,在步骤230,基于此交换更新本地消息。
如图8所示,在步骤230后,由于传播到数据库D1的节点N3的遗失,发生了方法200的不充分循环,结果是数据库D1保持不变,保留如表VIII中所示的内容。然而,数据库D2根据表XI现在被更新。
                  表XI
              (从表IX更新)
                数据库D2
  行号   列1   列2   列3
  标题   排名   节点名   最佳邻居
  行0   Φ   N2   N/A
  行1   1   N1   N1
数据库D3也被更新以反映在表IV中得到的初始数据。这表示在图8中,并且没有现有节点被删除。相应地,既然没有发生变化,那么在步骤210什么也没有发生,于是方法200从步骤210前进到步骤220。
在方法200执行第三遍后,数据库D的内容通过图8中所示的消息路径K被反映出来。
在方法200执行第四遍的过程中,节点N3的遗失将最终传播到节点N1,导致图9中所示的消息路径K。
(本领域技术人员会认识到前面的论述出于说明的目的被简化说明,在执行时可引入琐细的回路。为了说明这点,可引入“毒素反向”(poison reverse)以避免当节点被删除时引入到任何网络中的琐细回路。毒素反向在下文中被更详细地论述。为了进一步减少回路的引入,当执行节点消息的“零”延迟(例如,基本瞬时)删除时,在传播网络消息过程中可引入延迟。最后当离数据流的距离(下文更详细论述)达到某个界限时,节点通知它的相邻节点删除那个特定节点的消息,即使该节点依然拥有那个节点的有效消息。下文进一步提供节点删除的更详细论述。)
现在应该理解,此处的教导可应用到比网络30更加复杂的网络。例如,现在参照图10,根据本发明另一个实施方案的一个稍微复杂些的网络被一般表示为30a。网络30a包括与网络30基本相同的元素,并且相似的元素包括相似的标号只是在后面加上后缀“a”。更具体而言,网络30a包括更多节点Na和链路La,但是那些节点Na和链路La的基本结构与系统30中它们的对应物基本相同。不过,为了简化说明,网络30a不用示出数据库Da内容的特定表格示出。
网络30a包括节点Na1、Na2和Na3,如同在网络30中它们各自的对应节点N1、N2和N3,节点Na1、Na2和Na3通过链路La1和La2连接。在这个实施例中,一开始就假定网络30a已经经历了两次方法200的完整执行,因而数据库D处于图7中网络30所示的同样状态。然而,与网络30不同地,还假定网络30a包括第四节点Na4,Na4一开始还没有连接到任何其它节点Na。
现在参照图11,假定节点N4a通过形成跨越在节点N4a和节点N2a上的链路L3a以及形成跨越在节点N4a和节点N3a上的链路L4a连接网络30a的其余节点。在每个节点N执行足够数量的方法200循环后,将根据数据库D中被更新的内容形成附加消息路径K(如图11中所示),如表XII中被集中表示。
                                                          表XII
                                                         数据库Da
  行   数据库D1a   数据库D2a   数据库D3a   数据库D4a
  1   2   3   4   5   6   7   8   9   10   11   12
1234   排名Φ123   节点名N1aN2aN3aN4a   最佳邻居N/AN2aN2aN2a   排名Φ123   节点名N2aN3aN4aN1a   最佳邻居N/AN3aN4aN1a   排名Φ123   节点名N3aN2aN4aN1a   最佳邻居N/AN2aN4aN2a   排名Φ123   节点名N4aN2aN3aN1a   最佳邻居N/AN2aN3aN2a
在起始节点Na上产生的供目的地节点Na使用的有效载荷通信量现在可以根据消息路径Ka真正被发送。例如,假定节点N4a希望发送有效载荷通信量给节点N1a。利用表XII中的信息,可以发现通信量将通过节点N2a从节点N4a被路由到节点N1a。这一通信量路径P在图12中示出,图12说明网络30a处于和图11同样的状态中,但是由于消息路径Ka被删除,所以通信量路径P可被看得更清楚。
在这种情况下,可以注意到不同的节点可以通过不同路径,甚至通过某些已标识的优选路径到达其它节点。这样的优选路径已经被选定,因为迄今为止的实施方案已经假定所有链路L和La具有基本相同的服务特征。例如,在图11和图12中,相应于表XII,节点N4a通过节点N2a到达节点N1a。这被反映在表XII的列12行4中,其中节点N2a被反映为从节点N4a到达节点N1a的下一最佳邻居。然而,当在表XII所示的实施例中优选路径较少时,有效载荷通信量在最终发送给节点N1a之前,沿着从节点N4a,通过节点N3a和节点N2a的路径发送,在物理上是可能的,如果链路L3a不存在,这条路径将被利用。
然而,在另一个实施方案中,每条链路的服务特征可以改变,并且当选择一个最佳邻居作为通过其来路由有效载荷通信量的下一最佳步骤时,每个节点的数据库引入这些服务特征的消息。例如,现在参照图13,根据本发明另一个实施方案的另一网络被一般表示为30b。网络30b与网络30a基本相同,并且相似的元素包括相似的标号只是在后面加上后缀“b”。更具体而言,网络30b包括链路Lb,链路Lb有着和网络30a中链路La相同的路径。同样,网络30b包括4个节点Nb,它们与网络30a中的节点Na基本相同。然而,在网络30b中每条链路Lb具有不同的服务特征,相反在网络30a中每条链路La具有相同的服务特征。表XIII示出每条链路Lb的一组示例性服务特征。
                     表XIII
                链路Lb的服务特征
  列1   列2   列3
  行   链路   带宽   费用
  1   L1b   1兆比特/秒   $0.10每千字节
  2   L2b   10兆比特/秒   $0.05每千字节
  3   L3b   0.5兆比特/秒   $0.10每千字节
  4   L4b   10兆比特/秒   $0.20每千字节
更详细地说明表XIII,列1标识了讨论中的特定链路Lb。列2标识了在同一行中标识的链路Lb的带宽。列3表示在特定链路Lb上传送通信量的财务费用,按照每千字节美分计算。(现在应该理解,表XIII可包括期望的任何其它服务特征,例如比特误码率、时延等。)因此每条链路Lb的信息可以作为每个数据库Db的一部分,并且利用方法200或它的适当变体,以与节点消息通过整个网络30b传播在很大程度上相同的方式经过网络30b传播。
相应于每个节点Nb的数据库Db知道它们直接连接到的每条链路Lb的细节。例如,节点N4b将知道表XIII中所示的链路L3b和L4b的细节。出于同样的原因,节点N3b将知道链路L4b和L2b的细节。在本实施方案中,每个节点Nb仅知道它本身和它必须直接连接节点Nb的链路Lb。但是每个节点Nb不必知道整个网络拓扑的任何情况。
然而,一旦相应于特定路径任一端上的每个节点Nb的每个节点Nb数据库Db拥有那个节点的消息,该数据库Db将知道与定义该路径的链路Lb有关的累积服务特征。因此,一旦节点N4b知道节点N1b,节点N4b也将知道节点N4b和节点N1b之间的所有链路Lb的累积服务特征(以及为此的累积“费用”)。
因此,一旦特定节点Nb拥有有关特定链路的特征的信息,那么该节点Nb可利用这种信息以便确定“最佳邻居”作为通过其来路由通信量的下一最佳步骤。例如,在表XIII中,可以发现链路L3b的带宽只有0.5兆比特/秒——而链路L4b和链路L2b的带宽都是10兆比特/秒。因此,从节点N4b发送到节点N2b的有效载荷通信量如果通过节点N3b,而不是直接在链路L3b上发送将被更快地发送到节点N2b。
因此,如果优先考虑有效载荷通信量的发送速度,那么利用表XIII节点N4b可以确定节点N3b是到达节点N2b和节点N1b的下一最佳步骤。因此,表XIV示出如果节点N4b做出这样的决定,数据库Db的一部分是怎样产生的(假定表XIII中信息并未在表XIV中示出)。
                                                 表XIV
                                                数据库Db
  行   数据库D1b   数据库D2b   数据库D3b   数据库D4b
  1   2   3   4   5   6   7   8   9   10   11   12
1   排名Φ   节点名N1b   最佳邻居N/A   排名Φ   节点名N2b   最佳邻居N/A   排名Φ   节点名N3b   最佳邻居N/A   排名Φ   节点名N4b   最佳邻居N/A
  234   123   N2bN3bN4b  N2bN2bN2b   123   N3bN4bN1b   N3bN4bN1b   123   N2bN4bN1b   N2bN4bN2b   123   N2bN3bN1b   N3bN3bN3b
出于同样的原因,图13示出基于表XIV中所示数据库D4b的内容,从节点N4b产生的以节点Nb为目的地的通信量的有效载荷通信量的路径Pb。在图13中,路径Pb不通过链路L3b行进,而是通过链路L4b和L2b行进。现在应该理解,当确定最佳邻居通过其来路由通信量时,可采用复杂的、多重的标准。因此,表XIV可被填充链路Lb的优化服务特征,对带宽、费用、比特误码率等进行优化。
当然,如果基于具有最少财务费用的下一最佳步骤,并且完全不考虑带宽来选定最佳邻居,那么表XIV将改变。假如这样的话,重新参照表XIII,因为链路L3b比链路L4b费用便宜,那么节点N4b会选择节点N2b作为它到达节点N2b和节点N1b的下一最佳步骤,并且因此数据库D1b将表现得和表XII中数据库D1a一样。
现在,显而易见的是,下一最佳步骤可基于评估每一链路的一组复杂的标准——例如,可通过组合表XIII的列2和列3来确定链路Lb总级别,以提供用于特定链路的带宽和财务费用两者组合的服务特征级别。
再次强调的是,此处的教导可应用到比网络30、30a和30b更加复杂的网络。例如,现在参照图14,根据本发明另一个实施方案的更加复杂的网络被一般表示为30c。网络30c包括和网络30、30a和30b相同类型的元素,并且相似的元素包括相似的标号只是在后面加上后缀“c”。值得注意的是,在这个实施方案中,假定所有链路Lc具有基本相同的长度和基本相同的服务特征,尽管在其它实施方案中,链路Lc类似于链路Lb,可以具有不同的长度和服务特征。网络30c包括更多的节点Na和链路La,然而,为了简化说明,网络30c在不采用说明数据库Dc内容的特定表格的情况下示出。
然而,与网络30、30a和30b不同,为了设置由每个节点Nc相应的数据库Dc所消耗的节点Nc的存储器资源上限,在网络30c中假定数据库Dc仅具有数量有限的行。因此,在本网络30c中,每个节点并不维持关于整个网络30c的消息,而仅维持一部分网络30c的消息。(当此处的教导被应用到一定规模的网络,在该网络中整个网络的消息导致一给定节点的全部计算资源无法执行的巨大消耗,此时这样的配置实际上是优选的。)为了有助于说明,将假定每个数据库Dc可保存11行信息。第一行如前面对表II的相关描述一样是空行,它标识特定数据库Dc属于哪个节点Nc。其余9行允许数据库Dc维持网络30c中的九个其它节点Nc的消息。
注意的是,每个节点Nc不必具有相同的存储器容量,并且这样的容量不必是固定的,而是根据特定节点Nc改变的需要可以动态分配,可以是自动地或者人工分配,但是为了说明的目的,网络30c中的节点Nc由有限的9个其它节点构成。
每个节点Nc的数据库Dc维持一个“核心”的概念。如果一个特定节点Nc没有被包括在一个特定数据库Dc中,那么该核心表示给定节点Nc可被定位的默认路径。如图14中所示,网络30c包括沿链路L6c的核心Cc,其细节将在下文中更详细地论述。通常,目前优选的是,确保至少包括核心Cc的数据库Dc的总存储容量足以确保定义该核心Cc的数据库Dc拥有网络30c中每个节点Nc的消息。因此相应地,根据网络30c体系结构而定的网络规模将补足定义该核心Cc的两个节点Nc的共同存储器容量。因此,在本实施例中,总的来说,节点N6c和节点N9c具有足够的容量,使得数据库D6c和D9c中的每个数据库中的9行足够维持网络30c中每个节点的消息。
因此,当每个节点Nc执行方法200时,它将“听到”比节点Nc将要存储的更多的其它节点Nc。相应地,每个节点Nc还可操作地执行优选操作以选择在它的数据库Dc中维持网络30c中哪九个其它节点Nc的消息。这样的优选操作可基于任何优选准则或标准、或它们的组合,诸如哪些其它节点Nc最近,哪些其它节点Nc传送最大通信量,特定节点通常发送有效载荷通信量给哪些其它节点Nc等,以及现在本领域技术人员会想到的这样一些其它标准。因此,这样的优选标准也提供了按照重要性顺序的每个节点Nc的“排名”,由此定义数据库Dc被填充的顺序,以及节点消息应该被发送给网络中其它节点Nc的顺序。
在本实施例中,将假定每个节点Nc的优选标准为按顺序填充它的数据库Dc维持以下的消息:
(a)离节点Nc最近的其它节点Nc(“最近节点Nc”)。最近节点Nc按照接近度顺序排列;
(b)节点Nc必须拥有其消息以便代表它们传送有效载荷通信量的起始或目的地节点Nc;(“起始或目的地节点Nc”)。起始和目的地节点根据代表它们传送的有效载荷通信量的数量而排名,并且取代最近节点;
(c)节点Nc与其发送或接收有效载荷通信量的其他节点Nc;(“有效载荷通信量节点Nc”)。有效载荷通信量节点Nc根据与其它节点相关的特定有效载荷通信量的重要性而排名,并且取代所有最近节点和最多达一半的起始或目的地节点Nc。有效载荷通信量的重要性可基于通信量数量、或通信量速度等等;
(d)在方法200的任何特定循环过程中,最多达9个的其它节点Nc。
需要重申的是,出于说明本实施方案的目的,上述优选标准被简化。在另一个现在更优选的实施方案中,节点按照它们与标记数据流值的距离被排列,下面这些情况除外:
1、这个节点在通往此目的地节点的高速传播路径(“HSPP”,下文进行更详细地论述)的路径中,并且这个直接连接节点是:
在通向核心的路径中,并且该HSPP是一个通知HSPP。
通知我们这个HSPP的节点中的一个,并且该HSPP是一个请求HSPP。
2、这个节点被标记在通往此目的地节点的数据流中。
如果节点被标记在数据流中,它将通知没有将它标记在数据流中的直接连接节点数据流距离(在此也称为流距离或“DFS”)为0;对于将它标记在数据流中的直接连接节点,它将通知DFS与通往目的地节点的链路服务特征有关的链路费用(“LC”)相等。这在下文中将进行更加详细地说明。
现在将说明网络30c中核心Cc的形成。在网络30c中,一开始假定从节点N2c到节点N13c通过链路L1c至L11c连接,如图14中所示。还假定节点N1c和节点N14c最初没有和网络30c中的其余节点连接。
还假定,最初没有节点Nc试图发送有效载荷通信量给另外节点Nc,并且节点N2c和N13c中的每个节点已经执行方法200来按照上文描述的优选标准填充它们相应的数据库Dc。图15示出数据库D2c将被用以填充的其它节点Nc,用一个封闭的虚线图表示,并且在此称为消息路径框K2c-xc。消息路径框K2c-xc围住节点N2c知道的所有其它节点Nc,即,节点N3c-N10c,以及节点N12c。图16示出数据库D6c将被用以填充的其它节点Nc,用一个封闭的虚线图表示,并且在此称为消息路径框K6c-xc。消息路径框K6c-xc围住节点N6c知道的所有其它节点Nc,即,节点N2c-N5c,节点N7c-N11c,以及节点N12c。尽管没有在图中示出,现在本领域技术人员会意识到在这种情况下本实施例中其它数据库Dc的内容。
在这种情况下,有必要注意到在节点N2c-N6c中任何一个节点与节点N8c-N13c中任何一个节点之间的有效载荷通信量都将需要通过链路L6c。因此,对于该特定网络来说,在这种情况下本实施例中链路L6c表示网络30c的“核心”。该核心在图14中用一个椭圆环形链路L6c表示,并指示为Cc。不需要在每个数据库Dc中明确维持链路L6c特定地是网络30c的核心Cc这一事实。相反地,每个数据库Dc将确定“最佳邻居”,该“最佳邻居”表示为了到达核心Cc的下一最佳步骤的邻居。到达核心Cc的该“最佳邻居”可通过检查数据库Dc以找到哪个相邻节点Nc最频繁地被称为到达那些在数据库Dc中明确维持的其它节点的“最佳邻居”来确定。如果没有相邻节点Nc更频繁地作为最佳邻居出现,那么与排名最高的其它节点有关的出现在行1中的最佳邻居可被选择作为到达网络30c的最佳邻居。一旦两个相邻节点Nc互相指定对方作为到达核心的最佳邻居,核心就形成了。
(将这种确定核心的方法应用到前面的实施例,在表XII和图11中重新调用,对于节点N1a到达网络30a核心的最佳邻居将是节点N2a;对于节点N2a到达网络30a核心的最佳邻居将是节点N3a;对于节点N3a到达网络30a核心的最佳邻居将是节点N2a;对于节点N4a到达网络30a核心的最佳邻居将是节点N2a。由于节点N2a指定节点N3a,并且节点N3a指定节点N2a,那么链路L2a将是网络30a的“核心”。)
现在显而易见的是,当一个网络,例如网络30c,被一开始初始化后,多个核心将形成,直到方法200被执行足够多的遍数以使得数据库Dc被填充并维持基本稳定的状态。同样,当添加或删除节点Nc的时候,或者添加或删除链路Lc的时候,(和/或影响整个网络状态的其它因素改变的时候),核心Cc的位置可改变,和/或多个核心可形成。
现在基于图14-16中所示的实施例,并参照图17,将假定两条新链路被添加到网络30c。具体而言,链路12c现在连接节点N1c和N2c,而链路13c现在连接节点N13c和N14c。由于节点N1c和节点N14c执行了方法200,并且剩余节点Nc再次执行了方法200,位于链路L6c上的核心Cc的位置在网络30c的此特定结构中将最终不再改变。然而,每个数据库Dc的内容可根据上述优选标准改变。例如,节点N2c将把节点N1c添加到它的数据库D2c中,并从数据库D2c中删除节点N12c。
还要注意的是,节点N1c将用有关节点N2c-N10c的消息填充数据库D1c,而节点N14c将用有关节点N5c-N13c的消息填充数据库D14c。因此,节点N1c和节点N14c将相互不拥有对方的消息。现在假定节点N1c想要发送有效载荷通信量给节点N14c。
因为节点N1c没有节点N14c的消息,在这种情况下节点N1c可执行图18中所示的方法800以便得到这样的消息。从步骤810开始,起始节点N1c将接收请求以发送有效载荷通信量给目的地节点N14c。这样的请求可来自在与起始节点N1c有关的计算环境上执行的另一个应用。
(作为题外话,正如从此处进一步的教导中变得更显而易见的,为了用更通俗的方式描述整个方法,发送给相邻节点的请求可以是这样的形式:“如果你发现我的目的地节点的路由信息,你能否一定通知我这一信息,以便我能就发送我的有效载荷数据到何处做出好的选择。”如果节点有一些有效载荷要发送,但是没有地方发送,它将保存该有效载荷直到该有效载荷的暂留时间终止(如果有暂留时间的话),或它需要用于其它包的空间,或它得到一个路由更新,该路由更新允许它路由到直接连接节点。)
接着,在步骤820,判断有效载荷通信量指定的目的地节点是否位于本地数据库Dc中。在这个实施例中,回忆起数据库D1c不包括有关目的地节点N14c的信息,因此这一判断的结果将是“否”,于是方法800将从步骤820前进到步骤830。(然而,如果目的地节点在数据库D1c中,那么在步骤840,有效载荷通信量可通过在数据库中标识的最佳邻居被发送,该发送方式与图12中网络30a,或图13中网络30b相关的所描述方式在很大程度上相同。)
接着,在步骤830将向核心发送一个询问来索求目的地节点N14c的消息。这样的询问将由每个相邻节点Nc,沿着通向核心Cc的“最佳邻居”路径传向核心Cc,直到该询问到达拥有节点N14c消息的节点Nc。因此,每个节点Nc将接收到该询问,检查它自己的数据库Dc,并且,如果它拥有目的地节点N14c的消息,它将通过通往起始节点N1c的路径将这样的消息发回。如果接收该询问的节点Nc没有目的地节点N14c的消息,那么它将该询问传送给相邻节点Nc,该相邻节点Nc是它通往核心Cc的最佳邻居,直到该询问到达拥有节点N14c消息的节点Nc。在本实施例中,来自节点N1c的询问将顺着来自节点N2c的路径;到达节点N3c;到达节点N6c;最后到达节点N9c,因为由于上文所定义的优选标准,节点N9c将拥有节点N14c的消息。因此,节点N14c的消息将通过节点N6c被传回;到达节点N3c;到达节点N2c并最终到节点N1c,其中节点N6c、N3c以及N2c每一个都在它们相应的数据库Dc中保留节点N14c消息的记录,以便它们能代表节点N1c传送有效载荷通信量。
接着,在步骤840,起始节点Nc最终接收到了针对在步骤830产生的询问的响应。因此在本实施例中,节点N1c将接收从节点N9c返回的有关节点N14c的消息,并且在步骤850,节点N1c将用节点N14c的消息更新它的数据库D1c。然后方法800可从步骤850前进到步骤830,有效载荷通信量可从节点N1c发送到节点N14c,该发送方式与图12中网络30a,或图13中网络30b相关的所描述方式在很大程度上相同。
现在基于图17中所示的实施例,并参照图19,将假定3条新链路被添加到网络30c。具体而言,添加链路L14c以连接节点N12c和N8c;在节点N8c和N5c之间添加链路L15c;以及在节点N5c和N2c之间添加链路L16c。每个节点Nc执行许多遍方法200以便吸收这些新链路Lc的消息。当这些消息最终传遍网络30c,从节点N1c到节点N14c的有效载荷通信量的路径将通过节点N2c;N5c;N8c;N12c和N13c行进。
现在应该理解,在链路L14c、L15c和L16c于节点N1c和N14c相互得到对方消息之前就存在的地方,节点N1c将如有关图17和18所述最初通过核心Cc得到节点N14c的消息;接着最佳路径(即跳过最少数目的最佳邻居的路径)将汇聚为图19中所示的实施例。
方法800致力于从核心Cc“拉”起始节点不知道的目的地节点N的消息,但是现在还应该意识到,在一个新目的地节点Nc加入网络30c的情况下,该节点Nc还可将它自己的消息“推”向核心Cc上的节点,因此当方法800被执行时,起始节点Nc可确保它将在核心Cc上找到有关新的/目的地节点Nc的信息。在图14所给的实施例中,不需要这样“推”消息,因为执行标准自动确保核心Cc上的节点N9c将得到节点N14c的消息。然而,在网络30c的其它结构中,可能需要“推”核心Cc上节点Nc的消息。
尽管在此只论述了本发明不同特征和元件的特定组合,但是对本领域技术人员来说显而易见的是,可根据需要利用所公开的特征和元件的所需子集和/或这些特征和元件的替代组合。例如,尽管上文论述设想方法200被每个节点N(和它的变体)基本同步执行,但是应该理解这样的同步执行不是必须的,仅用来简化说明。
作为另一种变体,每个节点N(和它的变体)也可保留由相邻节点N(和它的变体)发送到该节点N(和它的变体)的所有信息的单独记录,即使该特定相邻节点N(和它的变体)没有被选定为最佳邻居而保存在该数据库D中。这可允许已删除最佳邻居的节点N不必重新运行方法200而从剩余相邻节点N中选择它的下一最佳邻居,或者不然,等待来自所有其它剩余相邻节点的更新。
因此本发明提供一种用于联网的新型系统、方法和装置。
可以设想本发明更多的实施方案,并且对这些实施方案中的某些方案的回顾,会使得进一步理解本发明。在以下实施方案中,某些术语或概念可能与前面部分有所差别。这些差别将被视为前面实施方案的替代和/或补充。
总的来说,本发明的网络体系结构可使网络中的单个节点能够协调它们的活动,使得它们活动的集合允许网络中节点之间的通信。
在无线环境网络中所用的现有ad-hoc网络的原则性局限在于对超过几百个节点的扩展能力,而该网络体系结构和相关方法至少缓和了以及在某些情况下克服了现有技术的扩展性问题。
因此,接下来给出示例性实施方案以澄清理解。当具体提到数字、他方软件或其它细节时,这些实施例并不意味着要限制在此所述的方法和系统的一般性。本领域技术人员将能够认识到何时两个或更多合并概念可被单独实现或单独有用,即使对此没有作明确地描述。除非特别声明,不应该认为替代实施方案是相互排他的。
在以下实施方案中,使用以下术语:
节点
网络中每个节点通过链路与一个或多个其他节点直接连接。节点可以是计算机、网络适配器、交换机、无线访问点或任何包含存储器并有能力处理数据的设备。然而,节点的形式没有被特定限制。
链路
链路是两个节点之间能够传送信息的连接。两个节点之间的链路可以是几条“被粘合”在一起的不同链路。链路可以是物理的(导线等)、实际物理制品(例如盒、小机械、液体等)、计算机总线、无线电波、微波、光波、量子相互作用、声波等。链路可以是一系列变化类型的独立链路。然而,链路的形式没有被特定限制。
链路费用计算
“链路费用”是能够在两条或多条链路之间进行比较的值。在本申请文件中,“链路费用”越低,链路越好。这是一种标准方法,本领域技术人员会知道可能有的变体。
链路费用是用来描述链路质量的值。链路的链路费用可基于(但不局限于):
1、线路质量
2、正常运行时间
3、链路一致性
4、时延
5、带宽
6、信噪比
7、节点上剩余电池电量
当链路费用所基于的因素改变时,链路费用将能随时间改变。
本领域技术人员将能给链路费用赋值,或建立动态发现机制。
建议整个网络上的链路费用的赋值要一致。例如,在网络不同部分中的两个相同链路应该具有相同或相似的链路费用。
建议同轴传输线的链路费用与它的品质有近于直接的关系。例如,1兆比特同轴传输线的链路费用应该是10兆比特同轴传输线链路费用的10倍。这些链路费用将被用来利用Dykstra类似算法找到通过网络的最佳路径。
一个替代实施方案涉及将计算的链路费用随机改变不超过总链路费用的1%(例如)的小随机数。
节点名
在网络中的每个节点拥有唯一的名字。
该唯一的名字可以是:
1、由该节点产生。
2、在节点激活前被赋值。
3、节点以一种方式从中央位置请求,该方式在结果上类似于DHCP(动态主机配置协议)服务器。如果节点要利用所述网络从中央位置请求名字,它将首先挑选一随机的唯一名字,然后利用该名字从中央位置请求一名字。
节点可永久地保留它的名字,或可在启动时产生一新名字,或可在它想产生新名字的任何时候产生一新名字。如果节点A知道节点B的名字,节点A可发送消息给节点B。
一个节点可拥有多个名字,以便模拟几个不同的节点。例如,一个节点可拥有两个名字:“Print_Server”和“File_Server”。
节点可为和它建立的每个新连接产生一个新名字。
端口被论述为消息的目的地,然而,在这些实施例中端口的利用不意味着限制本发明只能利用端口。本领域技术人员将能意识到,可利用其它机制作为消息目的地。例如,节点可为每个连接产生一唯一名字。
通常,节点应该拥有一个唯一名字。一个替代实施方案将允许一个节点与网络中另一个节点或另外多个节点共用一个名字。这将在以后进行更详细的论述。
关于一个节点拥有名字的数量,多长时间节点添加或删除名字,该名字是什么,节点是否通知任何节点有关该名字或它已经选择的名字,对于这些发明人没有意味着任何限制。
在本申请文件中为了清楚起见,我们假定每个节点只拥有一个和它相关的唯一名字。这不应该看作限制了本发明的范围。一个节点可以和网络中一个或多个其它节点共用同一名字。
在节点之间建立连接
如果在两个节点间能够建立一条链路,并且这些节点希望建立链路,那么节点将需要交换一些信息以便建立那个连接。所述信息可包括版本号等。
替代实施方案可包括“连接开关(tie-breaker)”数的交换,该交换将允许节点在两条原本相等的链路之间进行选择。建议给所有直接连接节点赋予相同的连接开关值。如果节点A通知节点B它已经从一些其它节点那里发现了一个相等的连接开关数,那么节点B将需要挑选一个新连接开关数并将该数发送给所有和它直接连接的节点。这一过程在图20中说明。
一个新连接开关数的请求可像这样(例如):
struct sRequestNewTieBreaker{
//这个结构是空的,如果节点看到这个消息,它将产生一个新
//连接开关值并将该新值通知所有它的直接连接节点
}
替代实施方案可包括这个节点想要知道的节点的最大计数。例如,如果节点A具有受限制的存储器,它将通知节点B,通知它不超过X个不同节点。
替代实施方案可包括用来建立连接的链路的链路费用的交换。如果在网络运行期间,链路费用改变,节点可发送消息给链路另一端上它的直接连接节点链路费用已经改变。如果交换链路费用,节点可同意相同的链路费用或仍然可挑选不同的链路费用,表示一个不对称连接。
如果考虑纳入所有上述3个替代实施方案,所交换的消息可像这样(例如):
struct sIntroMessage{
    int uiTieBreakerNumber;//连接开关数
    int uiNodeCapacityCount;//此节点想知道的目的地节点最
                             //大数目
    float fLinkCost;//这两个节点之间的连接的链路费用
}
图21是初始化过程的流程图。
假定连接能够按序并无误地传送消息。如果不能这样做,那么假定该连接被视为“失败的”。
节点消息的传播
节点A为了发送消息给节点B,节点A需要知道节点B的名字,还需要知道到达节点B的下一最佳步骤的直接连接节点或链路。
如果节点A或节点B想要另一节点来给它们发送消息,那么它们必须通知至少一个直接连接节点它们的名字。
当一个节点已经建立了到另一个节点的链路时,它可以开始发送节点信息。节点信息包括节点名和到达那个节点的累积链路费用。当网络刚启动时,没有节点知道除了它本身以外的任何其它节点的名字,因此用于它知道的(本身)节点的最初累积链路费用将为0。
当节点从链路L接收到另一节点A的消息,它将把链路L的链路费用添加到它所被告知的节点A的累积链路费用中,并在数据库D中保存与链路L有关的信息。当从连接L接收到的节点A的链路费用被来自数据库D的这个节点所参照,它将隐含地包括被添加到它中的链路L的链路费用。
每个节点保存它从每条链路接收到的信息。节点不需要知道在链路另一端上节点的名字。它所需要做的是记录链路另一端上的节点正发送给它的消息。节点将保存所有它从相邻节点接收到的节点更新。
当节点N从链路接收到了节点B的消息,它将比较它从其它链路接收到的节点B的累积链路费用。它将挑选累积链路费用最低的链路作为它的“最佳邻居”以供消息流到节点B。当节点N发送一个节点B的更新给它的直接连接节点,它将通知它们该节点的名字和它已经从它的直接连接节点接收到的最低累积链路费用。
累积链路费用是累加的。图22论证了这一累加特性。
这个过程持续进行,直到该节点的消息已经传遍整个网络,并且每个节点已经选择一条链路作为拥有最低累积链路费用的链路。
这个过程与找到通过网络的最短路径的Dykstra算法、或Bellman-Ford算法非常相似。本领域技术人员会知道这样的方法,以及产生相似结果的变体。
图23-26示出通过网络的节点消息流。假定所有链路拥有一个费用。这只被认为是一个例子,决不意味着限制本发明的一般性。例如,链路可拥有不同的链路费用,并且节点的数目,以及它们的特定互连可无限地改变。
在任何情况下节点都不需要建立网络拓扑的全局检查。节点只知道它的直接连接相邻节点通知它的节点消息。本领域技术人员可将该类型网络和距离矢量网络进行比较。
替代实施方案可利用连接开关数(前面所论述)在两条或多条链路之间挑选具有最低累积链路费用的链路。
传播节点消息的消息结构可像这样(例如):
struct sNodeKnowledge{
    Name NameOfTheNode;
    Float fCumulativeLinkCost;
}
该fCumulativeLinkCost在具有上述特定名字的节点上应该被设为零。
替代实施方案可在具有该特定名字的节点上将fCumulativeLinkCost设为非零值。这可用来伪装目的地节点的真正位置。在具有该特定名字的节点上将fCumulativeLinkCost设为非零值(例如50)将不影响网络的收敛。
链路费用改变
如果链路费用改变,那么节点将需要得到新链路费用和旧链路费用之间的差值,并将该差值添加到从该链路接收到的所有节点信息的累积链路费用中。
下面是一段示例性的伪代码,示出针对从改变其链路费用的链路接收到的每个节点更新,累积链路费用可以怎样被调整。
CumualtiveLinkCost=CumualtiveLinkCost+(NewLinkCost-OldLinkCost);
If(CumualtiveLinkCost>INFINITY)CumualtiveLinkCost=INFINITY;
基于这一变化,也将重新评估它的“最佳邻居”选择。还需要将到特定目的地节点的最低累积链路费用发生改变的任何节点通知它的邻居。
例如,如果改变没有选定作为目的地节点A的“最佳邻居”的链路的链路费用,并且在改变后,该链路仍然没有选定作为目的地节点A的“最佳邻居”,那么节点A的累积链路费用将保持不变,而没有必要发送更新给直接连接结点。
链路删除(在链路被删除的情况下)
这可被看作等同于链路的链路费用趋向无穷大。
对于每个正在利用这条链路作为其“最佳邻居”的目的地节点,将选择下一最佳“非无穷大”替代节点。如果没有这样的替代节点,那么没有“最佳邻居”可被选择,并且将通知所有直接连接节点那些节点的累积链路费用为无穷大。
如果没有“最佳邻居”被选择,那么通往那些节点的消息将不能被发送。
大型网络
在互连速度和节点性能有很大不同的大型网络中,需要应用不同的方法以确保任何给定节点能和网络中任何其他节点连接,即使有成千上万个节点。
利用最初的方法,目的地节点的消息将很快传遍网络。大型网络中的问题有三个层次:
1、保持每个节点被通知以所有目的地节点所需的带宽增长到了没有带宽留给数据所用的程度。
2、被用来确保数据能够流动的目的地节点更新上的带宽限制将大大减缓目的地节点更新的传播。
3、具有不足以知道网络中每一个节点的存储器的节点将不能与网络中的每个节点连接,并且还可能限制有充足资源的节点与网络中每个节点连接的能力。
通过引入网络“核心”或中心的思想,可找到解决方案。
网络核心最有可能将具有比平均节点更大的存储器和带宽的节点,并且最有可能被拓扑地定位于中央。
因为该新网络系统没有拥有网络拓扑的任何消息,或者除了与它直接连接的节点以外的网络中的任何其他节点的消息,所以节点只能估计该网络核心的位置。
通过检查哪条链路是大多数目的地节点的“最佳邻居”,可实现这个过程。直接连接链路被挑选作为目的地节点的“最佳邻居”,因为它拥有最低累积链路费用。该最低链路费用将通常由距最终目的地节点最近的链路提供。如果一条链路相比于任何其它链路被更多目的地节点用来作为“最佳邻居”,那么这条链路被认为是通向网络核心、或中心的一个步骤。
替代实施方案可以是对于到达一些其他节点或信标的下一最佳步骤作出决定的节点,并利用该决定作为它的“到达核心的下一最佳步骤”。
替代实施方案可以是利用一些因素的组合来确定什么是它的“到达核心的下一最佳步骤”的节点。这些因素可以是以下一些组合(但不局限于):
1、找到一些目标信标的无线电波方向
2、全球定位系统定位坐标,以及到达某些位置的下一最佳步骤
3、一个或多个特定标记节点
4、其他外部可测量的因素
节点不需要知道网络中心在哪里,只需要知道它到达网络中心的下一最佳步骤。
当两个节点互相选择对方作为它们到达核心的下一最佳步骤时,可定义一个核心。关于核心没有任何特殊之处,形成核心的两个节点的行为和网络中其它节点的行为一样。
对于谁被挑选作为大多数目的地节点的“最佳邻居”,如果在一组直接连接的节点之间有连接,将选择具有最高“连接开关”值(该值在初始化期间被传送)的直接连接节点作为通向核心的下一最佳步骤。该机制将确保在一个非平凡网络中不存在回路(除了节点A->节点B->节点A类型的回路)。如果不采用连接开关实施方案,那么可进行随机选择。
利用节点“到达核心的下一最佳步骤”的思想形成分级结构。这一分级结构可被用来沿着该分级结构向上推特定的节点消息到树的顶端。HSPP(稍后论述)利用这个分级机构来沿着该分级结构向上和向下推(或拉)节点消息。
图54是一个网络的实施例,其中每个节点已经选择了一个直接连接节点作为它到达核心的下一最佳步骤。然后该网络被重新排列以便更好地示出所建立的分级结构的特性。随着网络拓扑的改变,形成的分级结构也将改变。
检测孤立核心
替代实施方案帮助检测“孤立核心”。
核心被定义为两个已相互选择对方作为到达核心的下一最佳步骤的直接连接节点。图27示例并说明了这个实施例。
当一个节点已经选定一个直接连接节点作为它“到达核心的下一最佳步骤”时,它将通知那个直接连接节点它的选择。这就允许节点检测何时它们已经产生一个没有其它节点在使用的核心作为它们的核心。
所传送的消息可像这样:
struct sCoreMessage{
    bool bIsNextStepToCore;
}
如果一个核心被创建,形成核心的两个节点(在本实施例中节点A和节点B)将查看它们拥有多少个直接连接节点。如果有多于一个直接连接节点,那么它们将检查所有的其它直接连接节点。
如果选定这个节点作为其到达核心的下一最佳步骤的唯一直接连接节点是促使核心被创建的节点,那么这个节点将选择它的下一最佳选择作为到达核心的下一最佳步骤。
这可有助于消除那些能够阻塞消息流流向真正核心的核心。
选择到达核心的下一最佳步骤的示例性替代方法
前面所述的方法涉及为每个选择那个直接连接节点作为“最佳邻居”的目的地节点的直接连接节点赋“1”信用值。具有最大计数的节点是到达核心的下一最佳步骤(或者在孤立节点的情况下,指第二最大计数)。
如果任一实施方案利用多个“最佳邻居”(例如稍后论述的多路径),那么每个目的地节点的选定的每个“最佳邻居”可被赋予适当的信用值。可替代地,只有具有最佳时延的“最佳邻居”(在多路径的情况下)可被赋予信用值。
除了为每个选择直接连接节点作为它的最佳选择的目的地节点的该直接连接节点赋“1”信用值外,其它值也可被使用。
例如,log(fCumulativeLinkCost+1)*500可作为所赋的信用值。也可利用其它度量标准。这个度量标准具有给那些更远的目的地节点赋予更大权值的优点。在具有类似连接和节点的密集网络中,这种类型的度量标准有助于更好的、更集中的核心形成。
可用来扩充给那些更远的目的地节点提供更大的权值这一思想的另一个可能的实施方案是按照目的地节点的链路费用为所有目的地节点排序,并且只利用最远节点的x%(例如,50%)来确定到达核心的下一最佳步骤。
另一个实施方案可利用给每个节点赋值的权值。这个权值可由创建该名字的节点赋值。例如,如果这个权值被添加到该节点更新结构,它将像这样:
struct sNodeKnowledge{
    Name NameOfTheNode;
    Float fCumulativeLinkCost;
    Int nWeight;
}
该nWeight值(在该sNodeKnowledge结构中)可被用来帮助核心形成近似更强大的节点。例如,所赋信用值可以乘以10^nWeight(在此10是个例子)。这将帮助核心形成近似一个或两个大的节点,即使它们被成千上万个功率很低的节点包围。
该nWeight值应该以对网络中所有节点一致的方式被赋值。针对节点的类型可能的nWeight值如下:
 nWeight值   节点类型   等同于X个低容量传感器
  0   一个非常低容量的传感器或微粒   1
  1   一个更大传感器   10
  2   一个具有更长电池寿命和更大存储器的更大传感器   100
  3   一个蜂窝电话   1000
  10   一个家用型计算机   10000000000
  15   一个核心路由器   1000000000000000
  20   一个具有大量连接和存储器的超级计算机   100000000000000000000
这些权值只是建议,本领域技术人员可以针对它们的应用赋合适的值。
在具有不对称链路费用的网络中到达核心的下一步骤
这是用来选择到达核心的下一最佳步骤的一个替代实施方案。
如果链路被给定一个不对称费用,例如连接节点A和节点B的链路L,当从A行进到B时费用为10,而当从B行进到A时费用为20,那么替代实施方案有益于帮助核心在网络中的单个位置形成。
在前面的实施方案中,节点同意一条特定链路的链路费用,并基于这一共享链路费用使用其“最佳邻居”选择。
如果不对称链路费用被用来确定该“最佳邻居”,那么利用对称链路费用可被用来选择到达核心的下一步骤。利用对称链路费用可帮助确保核心真正形成。
对于一个节点所知道的每个节点来说,该每个节点将决定哪条链路是它到达那个节点的下一最佳步骤。它可以基于累积链路费用以及或许一个连接开关值选择该下一最佳步骤。接着这个“最佳邻居”被给定一个信用,该信用将和赋值给它的其它信用值相加。具有最大信用的那个“最佳邻居”将被挑选作为到达核心的下一最佳步骤。
在这个替代实施方案中,一个节点将同意它所链接的节点的链路替代费用。这个替代链路费用对于两个节点是相同的。这个替代链路费用将被用来调整累积链路费用。利用这个替代累积链路费用将作出对“最佳邻居”的选择。这个“最佳邻居”将被赋予信用值,该值有助于挑选该“最佳邻居”作为到达核心的下一最佳步骤,即使它不是被挑选作为到达真正节点的下一最佳步骤的“最佳邻居”。
下述等式描述了替代累积链路费用可以怎样被计算。
AlternativeCumulativeLinkCost=ActualCumulativeLinkCost+(AlternativeLinkCost-ActualLinkCost)
高速传播路径(“HSPP”)
由于不在网络核心上的节点一般没有核心上节点所具有的那么大的存储器,它们可能忘记依靠它们来允许其它节点连接到节点N的节点N。如果这些节点确实忘记了,那么网络中的其它节点将不能连接到节点N。
同样地,期望与节点Q建立连接的节点面临同样的问题。它正寻找的节点Q的消息不能足够快地到达它——或者如果节点Q或者试图与它连接的节点被低容量节点包围,则根本没有到达。
一种方法是利用每个节点关于其“到达核心的下一最佳步骤”的选择所创建的隐含分级结构。节点消息被沿着这个分级结构向上和向下推到核心。这使得传送到网络中心和从网络中心传送出来的节点消息高效传递。
利用在此称为高速传播路径(“HSPP”)的方法,可以推/拉节点消息。HSPP可被认作节点和核心之间标记的一条路径/多条路径。一旦该路径建立起来,它将一直存在直到创建它的节点被删除。
有两种类型的HSPP。第一种类型是通知HSPP。通知HSPP将特定节点的消息拉向核心。具有在其中运行的HSPP的节点不允许忘记与该HSPP有关的节点。所有节点创建通知HSPP以将它们自己的消息向核心驱动。
只有当节点寻找另一个节点的消息时,才建立请求HSPP。该请求HSPP以和通知HSPP同样的方式工作,除了它将消息拉回创建它的节点而不是将消息推向核心。
(本领域技术人员会意识到,在HSPP上下文中,术语“推”和“拉”出于说明的目的是有用的,但是可被看作是有点人造的术语,因为实质上,HSPP提高了节点数据库中节点的“排名”,使得该节点消息在其它节点消息之前被发送。)
HSPP利用每个节点到达核心的下一最佳步骤行进到核心。每个节点“到达核心下一最佳步骤”创建一个隐含分级结构。
HSPP不是用户消息本身的路径,而是促使路径上的节点保留讨论中的一个或多个节点的消息,并且将这一个或多个节点的消息沿着HSPP快速发送。它还提高了与HSPP有关的节点名更新的优先权。这有利于将路由更新快速发送到此隐含分级结构的顶端。
HSPP没有指定用户数据消息流向哪里。HSPP只保证总是至少有一条路径到达核心,并且帮助节点形成到达对方的初始连接。一旦形成初始连接,节点就不再需要利用HSPP。
HSPP可被看作属于一个节点名,或与一个节点名有关。这决不限制HSPP可能与之相关的节点的数目或类型。在本实施方案中,HSPP名通常是该HSPP将其推到核心或从核心拉出的节点的名字。
一条HSPP与一个特定节点名或节点名的类/组相绑定。如果一个节点持有一个特定目的地节点的一条HSPP,那么它将立即处理和发送由该HSPP所涉及的任何节点的节点消息。
在这种情况下,节点消息可被看作是sNodeKnowledge更新(例如)。
替代实施方案可将该过程限制为:
1、目的地节点的初始消息
2、当目的地节点fCumulativeLinkCost趋向无穷大
3、当目的地节点fCumulativeLinkCost从无穷大移到某个其它值
这可确保如果HSPP中节点中的任何一个能“发现”由HSPP所涉及的一个节点或多个节点,那么HSPP中的所有节点总是会知道由HSPP所涉及的节点。
节点消息没有被包含在HSPP中。HSPP只为特定的一个或多个节点消息建立一条具有非常高优先权的路径。这意味着HSPP所涉及的那些节点的节点更新将被立即发送。
HSPP典型地被认为是一条双向路径。
替代实施方案可拥有两种类型的HSPP。一种类型将节点消息推向核心。这种类型的HSPP可被称为通知HSPP。第二种类型将节点消息拉向创建该HSPP的节点。这种类型的HSPP可被称为请求HSPP。
当一个节点第一次连接到该网络时,它可基于其节点名创建一条HSPP。这条HSPP将把这个新创建的节点的消息推向该网络的核心。由这个节点所创建的HSPP可在节点的有效期被维持,或只要该节点想要维持该HSPP就可被维持。如果节点被断开连接或节点决定不再维持该HSPP,那么它将被删除。替代实施方案可使这条HSPP成为一条“推HSPP”而不是一条双向HSPP。
如果一个节点试图连接到另一个节点N,它将创建一条涉及节点N的HSPP。这条HSPP将行进到核心并帮助把节点N的消息拉回到创建该HSPP并想要连接到节点N的节点。替代实施方案可使这条HSPP成为一条“拉HSPP”而不是一条双向HSPP。
如果该节点不再想要维持一条HSPP(可能因为到节点N的连接不再被需要),它可把具有“bActive”等于假的HSPP更新发送给所有直接连接节点,它曾经向这些直接连接节点发送具有bActive等于真的原始HSPP。只有创建了HSPP的节点需要这样做。
替代实施方案可允许该请求HSPP在该连接已经停止一段时间后由产生该请求HSPP的节点维持,以便利于更快地重新连接。
两种类型的HSPP都将行进到核心。把节点消息发送给核心的HSPP可在节点的有效期被维持。请求HSPP可能在连接的有效期被维持。
替代实施方案允许创建HSPP的节点将该HSPP发送给所有直接连接节点,而不是只发送给它们到达网络核心的下一最佳步骤。该实施方案使得网络在移动和切换时更牢固。
替代实施方案包括确保节点不会发送给直接连接节点比该直接连接节点所请求的最大节点数更多的HSPP。
HSPP不指定用户数据应该流向哪里,它只帮助在节点之间,或一个节点和核心之间建立连接(可能不是最佳的)。
HSPP将行进到核心,即使它在到达核心前遇到节点消息。替代实施方案可以使HSPP在它到达核心前停止。
HSPP是怎样被建立和维持的
如果一条HSPP通知给一个节点,那么该节点将记住这条HSPP直到它被通知忘记该HSPP,或者在它和通知它HSPP的节点之间的连接断开。
在一个实施方案中,其中节点限制它想要被通知的节点的数量,该节点保存和它所被给定的一样多的HSPP。节点不应该发送比直接连接节点所请求的最大目的地节点数更多的HSPP给直接连接节点。
在某些系统中,节点上可用的存储量将使得它能够假定有足够多的存储量,并且不论多少HSPP通过一个节点,它都有能力把它们全部保存下来。这甚至更有可能是因为节点上的HSPP的数量将大致与这个节点距离核心多近有关,而节点通常距离核心不是很近除非它有很大容量,而因此可能有很大的存储量。
UR=Ultimate Receiver Node
US=Ultimate Sender Node
HSPP可采用这样的形式:
struct sHSPP{
    sNodeName nnName;//该节点名可被一个编号替换(以后论
              //述)。它也可表示一类节点或节点名
    bool bActive;//一个布尔值,用来通知节点HSPP是否
                 //正被激活或删除
    bool bURGenerated;//一个布尔值,用来判断这是否是一
                         //UR(或US所产生的HSPP)
};
在这些描述中,一条HSPP H被认为是被调用HSPP H而不管bActive或bURGenerated(更一般地,HSPP类型)是何值。该HSPP H能够从它表示的节点名得到它的名字。
一个替代实施方案可以是HSPP H的名字没有与它所涉及的节点名(或名字)相链接。在本实施方案中该HSPP结构可像这样(例如):
struct sAlternateHSPP{
    sHSPPName HSPPName;//表示这条HSPP的唯一名字
    sNodeName nnName;//节点名可被一个编号替换(稍后论述
                  //)。它也可表示一类节点或节点名
    bool bActive;//一个布尔值,用来通知节点HSPP是否
                   //正被激活或删除
    bool bURGenerated;//一个布尔值,用来判断这是否是一个
                         //UR(或
                      //US所产生的HSPP)
};
接下来的描述利用sHSPP(与sAlternateHSPP不同),以便描述HSPP怎样工作。这不应被看作是对该方法一般性的限制。
UR产生的HSPP也可被称为“通知HSPP”,而US产生的HSPP也可被称为“请求HSPP”。
重要的是即使HSPP路径已经被改变或者断开,HSPP也不会在它自己的路径上环回。这应通过过程保证,在这过程中产生到达网络核心的下一步骤。
节点从不应该发送一条主动HSPP H(bActive=真)给已经向它发送一条主动HSPP H的节点。节点将记录通知它维持该条HSPP H(在该结构中设置bActive为真)的直接连接节点的数量。如果该节点计数下降到0,它将通知其被发送了一条主动HSPP H(bActive=真)的直接连接节点一条非主动HSPP H(bActive=假)。
在一般层次上,该HSPP找到一条通向核心的无回路路径,并且当它到达核心时它就停止传播。它这样做是因为形成核心的两个节点将相互选择对方作为它们到达核心的下一最佳步骤。并且因为一条主动HSPP将不被发送到已经向它发送一条主动HSPP的节点,所以该HSPP将只通过两个节点核心的一个节点被发送。
如果该HSPP路径被切断,那么从切断点到核心的HSPP将被删除。它被删除是因为通知它主动HSPP的唯一节点将被删除。这将促使在切断点的核心侧上的节点将一条非主动HSPP H通知给那些它通知过一条主动HSPP H的节点。在大多数情况下,这个过程将朝向核心分多级进行删除主动HSPP。
HSPP利用每个节点到达核心的下一最佳步骤行进到核心。
UR产生的HSPP的目的是为了一直维持它和核心之间的路径,使得系统中的所有节点能够通过向核心发送US产生的HSPP(请求HSPP)找到它。
如果节点N从其任何直接连接节点接收到一条主动HSPP H,那么它将向被选择作为它到达核心的下一最佳步骤的一个节点(或多个节点)转送主动HSPP H,假定被选择作为它到达核心的下一最佳步骤的那个节点(或多个节点)还没有向它发送一条主动HSPP H。
如果多条主动HSPP H到达同一个节点,要是输入HSPP中任一个将它们的bURGenerated标记为真,该节点将转送一条具有bURGenerated标记为真的HSPP。
如果被选择作为到达核心的下一最佳步骤的直接连接节点从节点A变为节点B,那么所有发送给节点A的HSPP将改为发送给节点B(假定下一“到达核心的最佳步骤”还没有向这个节点发送同样名字的主动HSPP)。那些发送给节点A的HSPP将把一个HSPP更新发送给节点A,其中它们的“bActive”值设置为假,并且那些发送给节点B的HSPP将它们的“bActive”值设置为真。
一个替代的实施方案是,如果节点A创建一条HSPP,它应该向所有直接连接节点发送该HSPP。这样确保即使该节点快速移动,该消息总是被驱进核心,或从核心驱出。
当节点A建立与另一个节点B的连接,节点A可利用一条HSPP把节点B的路由信息拉给自己(称为请求HSPP)。这条HSPP也应该被发送到所有直接连接节点。
一个替代实施方案只拥有一种类型的HSPP,该类型的HSPP双向移动数据。这种类型的HSPP能够取代推/通知HSPP和拉/请求HSPP两者。在这个实施方案中,bURGnerated参数被省略。
一条HSPP不需要持续地被再发送。一旦一条HSPP建立在静态网络中,就不需要发送附加的HSPP消息。这对本领域技术人员来说是显而易见的。
每个节点记住哪个直接连接节点通知给它了哪条HSPP,节点还典型地记住它将哪些HSPP通知给了直接连接节点。
替代HSPP类型
这一替代实施方案可帮助在低带宽环境中维持连接。
在前面的实施方案中,有两种类型的HSPP:
1、通知HSPP
2、请求HSPP
这一实施方案将引入一种称为“优先通知HSPP”的新类型HSPP。
“优先通知HSPP”除了它将在所有“通知HSPP”之前被发送以外,其他都和“通知HSPP”一样。这将在稍后论述。
例如,如果一个节点试图和另一个节点通信,或者知道该另一个节点正试图与它通信,那么它可将其通知HSPP改变为“优先通知HSPP”。
下面的表格描述了节点将发送什么类型的HSPP给它到达核心的下一最佳步骤,假定它接收的HSPP的类型用于特定的目的地节点。
  HSPP输入   HSPP输出
  请求HSPP   请求HSPP
  通知HSPP   通知HSPP
  优先HSPP   优先通知HSPP
  请求HSPP+通知HSPP   通知HSPP
  请求HSPP+优先通知HSPP   优先通知HSPP
  请求HSPP+通知HSPP+优先通知HSPP   优先通知HSPP
  通知HSPP+优先通知HSPP   优先通知HSPP
如果包含“优先通知HSPP”的表项被忽略,那么这也可描述其它实施方案是怎样决定把哪种HSPP类型发送到它到达核心的下一最佳步骤的。
HSPP结构可被改进为像这样:
struct sHSPP{
    sNodeName nnName;//该节点名可被一个编号替换(前面所
                      //述)。
    bool bActive;//一个布尔值,用来通知节点HSPP是否
                   //正被激活或删除
    int nHSPPType;//HSPP类型(例如:请求HSPP、通知HSPP,
                    //优先通知HSPP)
};
将要发送的HSPP排序
一个替代实施方案调整发送HSPP的顺序。
当节点接收到一条HSPP,它将需要在发送前给它排序。这将确保更重要的HSPP首先被发送。
如果没有利用“优先通知HSPP”实施方案,HSPP应该被发送的顺序为:
1、请求HSPP
2、通知HSPP
如果利用“优先通知HSPP”实施方案,那么顺序为:
1、请求HSPP和优先通知HSPP
2、通知HSPP
删除简单回路
这一替代实施方案可被用来阻止简单回路的形成。
本领域技术人员会意识到“毒素反向”的变体。
节点A已经挑选节点B作为消息进入节点N的“最佳邻居”,那么节点A将通知节点B它已经被挑选。
例如,节点A可向节点B发送像这样的消息:
struct sIsBestNeighbour{
    Name NodeName;
    Boolean bIsBestNeighbour;
}
如果节点A已经通知节点B,它是消息进入节点N的“最佳邻居”,那么节点B将不能挑选节点A作为消息进入节点N的“最佳邻居”。如果节点B消息进入节点N的唯一可能选择是节点A,那么节点B将选择没有“最佳邻居”,并且将它到达节点N的累积链路费用设置为无穷大。
将节点标记为在数据流中
该替代实施方案可被用来标记那些在数据流中的节点。
在这一实施方案中,如果节点被标记为“在数据流中”,节点仅被认为“在数据流中”。节点在没有被标记在数据流中的情况下可转发有效载荷包。如果节点正在转发有效载荷包,但是没有被标记在数据流中,那么它不被认为“在数据流中”。
如果节点A已经试图与网络中另一个节点N建立数据连接,那么它将通知节点B它已经选择作为它到达节点N的“最佳邻居”,节点B是节点N的“最佳邻居”,并且它在节点N的数据流中。
如果通知B它是“最佳邻居”的直接连接节点已经通知节点B它在数据流中,那么节点B将通知直接连接节点C,它已经选择作为节点N的“最佳邻居”,节点C在数据流中。
作为一个示例,该消息的结构可像这样:
struct sInTheDataStream{
    Name NodeName;
    Boolean bIsInTheDataStream;
}
如果节点B被标记为在消息进入节点N的数据流中,它将通知它已经选择作为它到达节点N的下一最佳步骤的那个节点,它在数据流中。如果节点B不再被标记为在数据流中,因为:
1、已经通知节点B它在数据流中的直接连接节点(或多个节点)断开;
2、通知节点B它在数据流中的直接连接节点(或多个节点)全都通知节点B它不再在数据流中。
接着节点B将通知它的“最佳邻居”C,它不再在数据流中。
通过这个标记一个节点仅被标记为是数据流。一个节点在没有被标记在数据流中的情况下可转发消息包。
来自流的链路费用
术语“来自流的链路费用”在此有时被称为“来自流的跳费用”。
这一替代实施方案可被用来给网络中的节点更新排序。该排序通过在其它更新发送前发送更新以便维持和汇聚数据流使得网络变得更有效率。
用来分发节点消息的sNodeKnowledge结构可被修改成像这样:(例如)
struct sNodeKnowledge{
    Name NameOfTheNode;
    Float fCumulativeLinkCost;
    Float fCumulativeLinkCostFromStream;
}
该fCumulativeLinkCostFromStream与fCumulativeLinkCost以同样的方式增加。然而,如果节点在特定节点的数据流中,它将在把更新发送给它的直接连接节点之前,将fCumulativeLinkCostFromStream重置为0。
正像fCumulativeLinkCost被初始化为0一样,该fCumulativeLinkCostFromStream也被初始化为0。
一个替代实施方案可因为其它原因重置fCumulativeLinkCostFromStream,例如正通过该节点传送的用户数据消息。本领域技术人员会意识到这样的变体。
一个用来辅助低带宽环境的替代实施方案是,如果节点不是正在与另一个节点交换用户数据,就将其fCumulativeLinkCostFromStream设为非零值(例如50)。如果它们在和另一个节点通信,它们将其fCumulativeLinkCostFromStream设为0。一个替代实施方案还可将一个非零值的fCumulativeLinkCostFromStream设为与该节点建立的链路有关的链路费用的最小值、最大值、平均值(等)的倍数。
如果fCumulativeLinkCost趋向无穷大,那么保留最后的非无穷大fCumulativeLinkCostFromStream值。这将被用来对何时发送该无穷大更新到直接连接节点进行排序。
来自流的替代链路费用
这一实施方案类似于前面的实施方案,只是更有益于帮助网络删除节点消息。
在前面的实施方案中,当遇到标记为在数据流中的节点时,fCumulativeLinkCostFromStream被重置为零。该实施方案改变将被发送的更新的类型。
如果直接连接节点B通知创建目的地节点E的节点A(这可被描述为节点A创建了一个节点名E以供节点A使用)它在节点E的数据流中,那么节点A将通知直接连接节点B一个节点E的节点更新,其中fCumulativeLinkCostFromStream=fCumulativeLinkCost。在大多数情况下,由于节点A创建了名字E,这两个值都设置为0。
没有通知节点A它在数据流中的所有其它直接连接节点将被通知fCumulativeLinkCostFromStream!=fCumulativeLinkCost。例如:
fCumulativeLinkCostFromStream=fCumulativeLinkCost+0.1f;
因为fCumulativeLinkCost通常为0,这些直接连接节点将被通知fCumulativeLinkCostFromStream为0.1,而fCumulativeLinkCost为0。0.1应该被看作仅为示例。
如果没有创建目的地节点名的节点(在这个实施例中,此节点可以是除节点A以外的任何节点)被标记为“在数据流中”并且具有fCumulativeLinkCostFromStream==fCumulativeLinkCost,那么它将通知没有将它标记在数据流中的所有它的直接连接节点一个节点E的更新,其中fCumulativeLinkCostFromStream==0。对于那些已经将它标记在数据流中的节点,它将通知它们一个节点E的更新,其中fCumulativeLinkCostFromStream==fCumulativeLinkCost。
在本实施方案中从不调整fCumulativeLinkCost以匹配fCumulativeLinkCostFromStream。总是相对于fCumulativeLinkCost来调整fCumulativeLinkCostFromStream。
节点更新排序
在大型网络中,可能有许多节点更新要发送。这一替代实施方案允许根据更新的重要性对其进行排序。
这一替代实施方案假定fCumulativeLinkCostFromStream被使用并且HSPP也被使用。如果它们中只有一个被使用,那么只需忽略未使用的实施方案所提供的排序。
系统中的所有节点通过由所选择的“最佳邻居”发送给该节点的fCumulativeLinkCostFromStream值(连接的链路费用被添加到直接连接节点所发送的值)排序。这个有序列表可采用树形图(TreeMap)(在Java的示例中)的形式。
如果采用前面的实施方案,那么当fCumulativeLinkCost==fCumulativeLinkCostFromStream,并且节点被标记在数据流中时,该节点应该被添加到树形图中,如同它具有为0的fCumulativeLinkCostFromStream一样。
当目的地节点路由的更新需要发送到直接连接节点时,这一目的地节点被放入树形图中,该树形图被维持用于每个直接连接节点。该树形图是允许按照升序关键字的顺序删除数据项的数据结构。这使得更重要的更新在次重要的更新之前发送到直接连接节点。
位于该树形图中的目的地节点根据它们的fCumulativeLinkCostFromStream值被排序,以下情况除外:
1、该节点在这个目的地节点的一条HSPP路径中,并且该直接连接节点是:
a、在通向核心的路径中并且该HSPP是通知HSPP或者在只有一种类型HSPP的情况下
b、通知我们该HSPP的节点中的一个节点,并且该HSPP是请求HSPP或者只有一种类型的HSPP。
2、这个节点在该目的地节点的数据流中。(bIsInTheDataStream=真并且fCumulativeLinkCost=fCumulativeLinkCostFromStream)
如果该目的地节点属于这两组中的一组,该数据项被置于维持用于每个直接连接节点的有序更新列表的开始位置。用于这个过程的示例性伪代码像这样:
float fTempCumLinkCostFStream=GetCumLinkCostFStream(NodeToUpdate);
if(NodeToUpdate for this connection belongs to group 1 or2)fTempCumLinkCostFStream=0;
while(CurrentConnection.OrderedUpdateTreeMap containsfTempCumLinkCostFStream as a key)
{
    IncrementfTempCumLinkCostFStream by a small amount
}
Add pair(fTempCumLinkCostFStream,NodeToUpdate)to
       CurrentConnection.OrderedUpdateTreeMap;
然后该目的地节点路由更新以这样的顺序被发送。当一个目的地更新已经被处理,它从这个有序列表(CurrentConnection.OrderedUpdateTreeMap)中被删除。该排序确保更重要的更新在次重要的更新之前被发送。
该fTempCumLinkCostFStream也应该基于每个连接被使用以确定哪个目的地节点更新应该被发送。例如,如果有5个目的地节点,它们的fTempCumLinkCostFStream值为:
1.202         -目的地节点D
1.341         -目的地节点F
3.981         -目的地节点G
8.192         -目的地节点B
9.084            -目的地节点M
而直接连接节点已经请求最大四个发送给它的目的地节点路由。这个节点将仅发送该列表中的前四个(该节点将不发送目的地节点M的更新)。
如果目的地节点G使它的fTempCumLinkCostFStream从3.981改变为12.231,新列表将像这样:
1.202            -目的地节点D
1.341            -目的地节点F
8.192            -目的地节点B
9.084            -目的地节点M
12.231           -目的地节点G
在响应这一更新中,该节点将安排目的地节点G和目的地节点M的更新。在CurrentConnection.OrderedUpdateTreeMap(假定没有HSPP或数据流)中的有序对将是这样:
位置1            -(9.084,M)
位置2            -(12.231,G)
然后该节点将为节点G发送一个无穷大更新。接着它将为目的地节点M安排一个延迟发送。(参见“延迟发送”)
无穷大目的地节点更新确保为正得到无穷大更新的节点发送传送该信息所需要的消息。该实施例包括几个不同的实施方案,对于这些没有被采用的实施方案,本领域技术人员将能够省略这些相关数据项。
a、fCumulativeLinkCost=无穷大
b、fCumulativeLinkCostFromStream=无穷大
c、bIsBestNeighbour=假
d、bIsInDataStream=假
当目的地节点M的更新被发送,它将是非无穷大。
延迟发送
当节点从网络中被删除的时候,这一替代实施方案帮助节点消息从网络上被删除。
如果节点消息没有从网络上被删除,那么正确的分级结构和核心在形成时就有困难。
如果这是第一次目的地节点更新被发送给直接连接节点,或发送给该直接连接节点的最近更新的fCumulativeLinkCost为无穷大,那么该更新应该被延迟。
例如,如果该连接具有10ms的时延,那么更新应被延迟(时延+1)*2ms,或者在本例中是22ms。该时延还应超出控制包更新之间延迟的倍数(参见“传播优先”)。
本领域技术人员将能够进行试验并找到供他们应用的合适延迟值。
如果满足以下任一种条件,则例外:
1、这个节点在该目的地节点的HSPP的路径中,并且该直接连接节点是:
a、在到达核心的路径中,并且HSPP是通知HSPP或者只有一种类型的HSPP。
b、通知我们该HSPP的节点中的一个节点,并且该HSPP是请求HSPP或只有一种类型的HSPP。
2、这个节点在该目的地节点的数据流中。(bIsInTheDataStream==真并且fCumulativeLinkCost==fCumulativeLinkCostFromStream)
如果一个无穷大更新已经被安排发送(通过将它置于CurrentConnection.OrderedUpdateTreeMap中),但是到一个非无穷大更新被安排发送时它还没有被发送(因为它已经被延迟),该无穷大必须首先被发送,然后非无穷大更新应该在被发送前被再次延迟。
使目的地节点从无穷大到非无穷大循环
当一个节点从网络上被删除的时候,这个替代实施方案帮助从网络上删除节点消息。
如果对于正发送到一个直接连接节点N的节点A更新,满足这些标准中的任意一个:
1、如果限制能够发送到一个节点的节点更新数量的替代实施方案被使用:
如果直接连接节点N被发送了该目的地节点A的一个非无穷大更新,然而节点A的新的fTempCumLinkCostFStream值(参见上文)比X个其他节点的fTempCumLinkCostFStream值大。其中X是直接连接节点N请求被通知的最大节点数量;
2、如果节点A的fTempCumLinkCostFStream变得比发送到这个直接连接节点N的任何其他节点的fTempCumLinkCostFStream大。
该节点将向直接连接节点N发送这个目的地节点A的无穷大更新。然后在经过适当的延迟后(参见延迟发送)该节点将向该直接连接节点发送该目的地节点的一个非无穷大更新,除非该节点A依然满足标准1。
这是用来帮助从网络上删除不良路由数据并且自动删除回路的方法的一部分。
无穷大更新是具有值被设置为无穷大的fCumulativeLinkCost的更新(参见上文的更完整定义)。
当目的地节点满足前面的标准时,发送一个无穷大更新的决定(一段时间以后,紧跟着一个相同目的地节点的非无穷大更新)是一种推荐方法。用来触发其后紧随延迟的非无穷大更新的该无穷大更新的替代方法是(但不局限于):
1、当fTempCumLinkCostFStream在特定的时间段中增加某个百分比或一定数量。例如,如果该fTempCumLinkCostFStream在.5s内增长连接费用的10倍以上;
2、当有序列表中的这个目的地节点的位置在X秒内在该列表中移动多于(例如)100个位置,或移动超出了列表的(例如)10%。
为了触发无穷大/非无穷大发送,本领域技术人员能够确定在fTempCumLinkCostFStream上适当的增量以及适当的定时值。
一个替代实施方案可使用fCumulativeLinkCostFromStream取代fTempCumLinkCostFStream。
如果一个以前未知的目的地节点出现在列表顶端,该无穷大不需要被发送,因为之前直接连接节点还没有被通知一个非无穷大更新。然而,通知直接连接节点这个目的地节点应该被延迟。
如果满足以下条件的任何一个条件,就不需要发生该延迟发送:
1、这个节点在该目的地节点的HSPP的路径中,并且该直接连接节点是:
c、在到达核心的路径中,并且该HSPP是通知HSPP或只有一种类型的HSPP;
d、通知我们该HSPP的节点中的一个节点,并且该HSPP是请求HSPP或只有一种类型的HSPP;
2、这个节点在该目的地节点的数据流中。(bIsInTheDataStream==真并且fCumulativeLinkCost==fCumulativeLinkCostFromStream)
终端用户软件
该网络系统和方法可被用来仿真大多数其他网络协议,或作为一个全新网络协议的基础。
它也可作为其它协议的“路由选择脑(routing brains)”的替换。
在本申请文件中,TCP/IP将用来作为可被仿真的协议的示例。将TCP/IP作为示例的使用不意味着将本发明的应用限制为TCP/IP。
在TCP/IP中,当节点被启动时,它不向网络通告它的存在。它不需要这样做,是因为节点的名字(IP地址)确定了它的位置。在本发明中,节点需要网络知道它的存在,并且向网络提供一条保证通向它本身的路径。这在别处被更详细地论述。
当终端用户软件(“EUS”)希望建立连接时,它可以与TCP/IP非常类似的方式去实现。在TCP/IP中,连接代码看起来类似于这样:
SOCKET sNewSocket=Connect(IP Address,port);
就本发明,该“IP地址”(“IP Address”)被替换成全局唯一标识符(“GUID”)。
SOCKET sNewSocket=Connect(GUID,port)。
实际上,如果可以保证该IP地址(IP Address)是唯一的,那么利用本新型网络的发明,该IP地址可以作为GUID,提供现有TCP/IP网络栈的无缝替换。
用来保证一个唯一IP的一种方法是,让每个节点创建一个随机的GUID,然后利用这个GUID去和类似服务器的DHCP(动态主机配置协议)通信以请求一个可被用作GUID的唯一IP地址。然后该节点将丢弃它最早的GUID名字并只使用该IP地址作为一个GUID,在这种情况下,使用IP地址将意味着IP地址没有必要必须反映节点在网络分级结构中的位置。
一旦请求了到目的地节点的连接,该网络将确定到达该目的地的路由(如果这样的路由存在),并不断地改进路由直到找到最佳路由。
接收端将看起来和TCP/IP相同,只是用来确定连接节点IP地址的请求将改为产生一个GUID。(或IP地址是正被用作GUID的那些)。
该方法提供通过网络的路由选择,本领域技术人员可发现不同的流控制方法将怎样在不同的网络中工作得更好。例如,一个无线网络可能需要一种当输入数据速率超出输出连接速率时不丢包的方法。
图28是该路由选择方法将适合TCP/IP示例的实施例。
本领域技术人员将意识到,这个新的路由选择方法允许TCP/IP如同终端用户应用的接口。这是个示例,不意味着限制该路由选择方法为任何特定接口(例如TCP/IP)或应用。
连接穿过网络的两个节点
以下是一种可用来连接该网络中两个节点的方法的实施例。这一实施例(如同本申请文件中的所有实施例)不意味着限制本专利的范围。本领域技术人员会知晓许多变体。
如果没有采用利用HSPP的替代实施方案,那么忽略有关HSPP的部分。
如果节点A希望与节点B建立连接,它将首先发送出一条请求HSPP(前面所述)给所有直接连接节点。该请求HSPP将提取并维持有关节点B到节点A的路由信息。该请求HSPP将被发送出,即使节点A已经拥有节点B的消息。
如果采用利用“优先通知HSPP”的替代实施方案,那么节点A可将它的通知HSPP改变成优先通知HSPP,并且通知它的所有直接连接节点。这可有助于在低带宽移动环境中的连通性,因为它将使正在通信的节点在那些没有在通信的节点之前传播它们的信息。
该HSPP将行进到核心,即使它在到达核心前遇到节点路由消息。
一旦节点A拥有非无穷大的到达节点B的下一最佳步骤,它将发送出一个“连接请求消息”给节点B上的特定端口。该请求将被发送给已被选作到节点B消息的“最佳邻居”的直接连接节点。
如果该“标记数据流”的实施方案被使用,那么节点A将通知它的已选作“最佳邻居”的直接连接节点,它是在节点B的数据流中。
端口的使用仅用来示例,并不意味着限制本发明的范围。一种可能的替代可以是特定地用于输入连接的新节点名。本领域技术人员会知晓其变体。
它将持续地每X秒(例如15秒)发送该消息,直到接收到sConnectionAccept消息,或者没有接收到而超时(例如120秒)。该连接请求消息可以包含节点A的GUID,以及发送连接回答消息给什么端口。它还可包含nUniqueRequestID,其用来使节点B检测和忽略来自节点A的重复请求。
该连接请求消息像这样(例如):
struct sConnectionRequest{
    sNodeName nnNameA;//节点A的名字,为了减少系统开销
                     //可用一个编号替换
    int nSystemDataPort;//回答给节点A上的哪个端口
    int nUserDataPort;//发送终端用户消息给节点A上的哪个//端口
    int nUniqueRequestID;//节点B可用来确定哪些重复请//
                          求要
                        //忽略的唯一请求ID
}
当节点B从节点A接收到“连接请求”消息时,它将产生节点A的请求HSPP并把它发送到所有直接连接节点。这将提取并维持有关节点A到节点B的路由信息。
如果利用“优先通知HSPP”的替代实施方案被使用,那么节点B可将它的通知HSPP改变成优先通知HSPP,并且通知它的所有直接连接节点。这将有助于在低带宽移动环境中的连通性。
如果“在数据流中”的替代实施方案被使用,那么节点B将等待直到它发现哪里是它到达节点A的下一最佳步骤,然后标记到节点A的路由为“在数据流中”。
然后节点B将在特定端口(sConnectionRequest.nSystemDataPort)上发送一个sConnectionAccept消息给节点A。该消息像这样:
struct sConnectionAccept{
    sNodeName nnNameB;//节点B的名字
    int nUserDataPortB;//节点B上用户数据端口
    int nUniqueRequestID;//在sConnectionRequest消息//
中由A提供的唯一请求ID
}
该sConnectionAccept消息将被发送直到节点A发送由节点B接收的sConnectionConfirmed消息,或者发生超时。
该sConnectionConfirmed消息像这样:
struct sConnectionConfirmed{
    sNodeName nnNameA;//节点A的名字,为了减少系统开//
                       销可
                      //用一个编号替换
    int nUniqueRequestID;//在sConnectionRequest消息//
                          中由A提供的唯一请求ID
}
如果在该过程中超时发生,该连接被认为已经失败并且将被终止。两个节点所产生的该请求HSPP将被删除,并且该“在数据流中”标记将被删除(如果它们被添加了)。
一旦该连接被建立,两个节点都可发送用户数据消息到彼此对应的端口。然后这些消息将通过套接字被路由到终端用户软件(在TCP/IP情况下)。
当到达目的地节点的路由被定位时,一个替代实施方案将不请求建立连接,只请求发送EUS消息/有效载荷包。
节点名最优化和消息
这一替代实施方案可被用来最优化消息和名字传送。
每个节点更新和EUS消息/有效载荷包需要有一种方法用来标识它们涉及哪个目的地节点。节点名和GUID很容易就会很长,并且发送每个消息和节点更新的效率很低。节点可通过利用编号来表示长名字而使得这些发送的效率更高。
例如,如果节点A想要通知节点B有关名为“THISISALONGNODENAME.GUID”的目的地节点,它可以首先通知节点B:
1=“THISISALONGNODENAME.GUID”
实现这一通知的结构可像这样(例如):
struct sCreateQNameMapping{
    int nNameSize;//节点名的长度
    char cNodeName[size];//节点名
    int nMappedNumber;//表示这个节点名的编号
};
那么每次它想要发送一个目的地节点更新或消息,它可以发送表示该节点名的编号(sCreateQNameMapping.nMappedNumber),而不是发送长的节点名。当节点A决定它不再想要通知节点B有关名为“THISISALONGNODENAME.GUID”的目的地节点时,它可通知B忘记该映射。
该结构将像这样:
struct sRemoveQNameMApping{
    int nMappedNumber;
};
每个节点将维持它自己的什么名字映射到哪个编号的内部映射。它还将保留一张转换表以便将来自直接连接节点的名字转换成它自己的命名方案。例如,节点A可使用:
1=“THISISALONGNODENAME.GUID”
而节点B可使用:
632=“THISISALONGNODENAME.GUID”
因此,节点B具有一个映射,该映射将允许它将节点A的编号方案转换为对于节点B有意义的编号方案。在该示例中是这样:
节点A     节点B
1          632
...        ...
...        ...
利用这一编号方案还使消息针对他们被指定给哪个目的地节点而被容易地贴上标签。例如,如果系统拥有一个100字节的消息,它将保留开始的前4个字节以储存消息正被发送给的目的地节点名,其后跟着该消息。这将使得总的消息长度是104字节。该结构的一个示例还可包括该消息的长度:
struct sMessage{
    int uiNodeID;//映射到该消息正被发送给的节点名的编号
    int uiMsgSize;//有效载荷包的长度
    char cMsg[uiMsgSize];//实际的有效载荷包
}
当节点接收到该消息时,该节点将查阅它的转换表并且将目的地映射编号转换为它自己的映射编号。然后它可利用这个映射编号来决定该节点是否是有效载荷包的目的地,或者它是否需要发送这个有效载荷包给另一个直接连接节点。
这些快速目的地编号可被本领域技术人员放置到TCP/IP头中。
何时删除名字映射
这一替代实施方案用来帮助删除不再需要的名字映射。
如果目的地节点在超过Xms(例如5000ms)的时间持续拥有一个无穷大的fCumulativeLinkCost,并且它已经向所有直接连接节点发送该更新,那么该节点将删除这个目的地节点的消息。
首先,它将释放所有与这个目的地节点有关的存储,以及释放由直接连接节点提供给它的更新。它也将删除该节点拥有的等待发送给目的地节点的任何消息。
接着,它将通知其直接连接节点去忘记这个目的地节点的编号->名字映射。
一旦所有的直接连接节点通知这个节点它也忘记有关这个目的地节点的它们的编号->名字映射,那么这个节点可删除它自己的编号->名字映射。
在此阶段,已经不再有任何与这个目的地节点有关的存储。
在使用新的编号前,节点应该试图重用被忘记的内部节点编号。
更简单的快速路由选择
这一替代实施方案用来加速包的路由选择。
最优化方式是在表示哪个直接连接节点将接收消息的名字映射表中添加另外一列。
因此,节点B将具有使它将节点A的编号方案转换为对于节点B有意义的编号方案的映射。在该例中它是:
节点A    节点B  直接连接节点消息正被发送至
1        632     7
...      ...
...      ...
这允许整个路由选择过程是一个数组查找。如果节点A发送一个具有目的地节点1的消息给节点B,该路由选择过程将像这样:
1、节点B创建一个指向正在讨论中的映射的指针:
sMapping*pMap=&NodeMapping[pMessage->uiNodeID];
2、节点B此时转换名字:
pMessage->uiNodeID=pMap->uiNodeBName;
3、然后路由该消息到特定的直接连接节点:
RouteMessage(pMessage,pMap->uiDirectlyConnectedNodeID);
为了该方案正确工作,如果节点决定改变它将路由消息到哪个直接连接节点,它将需要更新所有直接连接节点的这些路由表。
如果直接连接节点重用内部节点编号,并且这些节点知晓的目的地节点的数量少于可用于保存这些节点编号的存储量。那么该节点可利用数组查找以供发送消息。
这将为该节点提供O(1)消息路由选择(参见上文)。如果由该直接连接节点提供的节点编号超出查找数组可利用的存储器的大小(但是总的节点数量仍然适合存储器),该节点可从利用数组查找转换为利用哈希映射表查找。
更复杂的快速路由选择
这一替代实施方案帮助确保O(1)路由选择可被利用,并且避免使用哈希映射表。
为了确保节点总是能执行快速O(1)数组查找路由选择,节点可为每个直接连接节点提供一个唯一的节点编号-名字映射。这将确保直接连接节点不再需要采取利用哈希表来执行消息路由选择(参见上文)。
当为直接连接节点产生这些唯一的编号->名字映射时,该节点将确保重用所有可能的编号。
通过重用这些编号,它确保在映射中所用的最大编号应永不大于由直接连接节点所请求的目的地节点更新的最大数量。
对于每个连接,该节点将需要创建一个整数数组,其中偏移量(offset)对应于节点自己的内部节点ID,并且在偏移量中所保存的编号是用于直接连接节点的唯一编号->名字映射。
那么该快速路由选择将像这样(参见上文):
1、节点B创建一个指向正在讨论中的映射的指针:
sMapping*pMap=&NodeMapping[pMessage->uiNodeID];
2、节点B此时转换名字:
pMessage->uiNodeID=pMap->uiNodeBName;
3、然后路由该消息到特定的直接连接节点:
RouteMessage(pMessage,pMap->uiDirectlyConnectedNodeID);
4、发送前,该名字将最后一次被改变
pMessage->uiNodeID=UniqueNameMapping[uiConnectionID][pMessage->uiNodeID];
其中UniqueNameMapping是一个二维数组,其中第一参数为连接ID,第二参数是在与连接ID有关的唯一编号->名字映射中所用的编号。
重用在每个直接连接节点的编号->名字映射中所用的编号将需要一个和将要被使用的映射的最大数量一样大小的数组。该数组将被视为一个栈,其中要重用的编号被放置在该栈中。栈中的偏移量将通知该节点哪里放置要重用的下一编号,以及哪里找回要重用的编号。
如果直接连接节点已经请求一个大于该节点所知的目的地节点的总数量的目的地节点的最大数量,那么对于该直接连接节点来说不需要唯一映射方案。
如果该环境改变,本领域技术人员可以很容易地产生一个方案。
何时发送用户数据包
用户数据包可被随时发送,只要有可利用的路由。替代实施方案能够进行QOS,其中某些排名的节点首先发送它们的用户数据包。本领域技术人员会知道这些变体。
如果没有直接可用的路由,有效载荷包可被保留一段时间以希望可用路由的出现。
本领域技术人员也可实现一个生存时间(TTL)方案。该TTL可以是由创建有效载荷包的节点计算的目的地节点fCumulativeLinkCost值的倍数,而不利用跳(例如像TCP/IP协议)。然后每个节点将从TTL中减去接收包的链路的链路费用。如果TTL小于0,那么该包可被删除。本领域技术人员将意识到作为标准TTL方案,采用链路费用取代跳计数(如同在TCP/IP中)。
使更重要的节点传播更远
这一替代实施方案将使一些节点通过网络传播得更远和/或更快。
为了该实施方案工作良好,网络中大多数(即使不是全部)节点将需要遵循同样的规则。
对于被标记为“更重要”排名的节点,只有链路费用的一小部分将被加到它们的fCumulativeLinkCost值和/或fCumulativeLinkCostFromStream值中。例如,如果节点D处在更重要节点的排名中,并且链路N的通常链路费用是10,那么节点D的更新将仅有(例如)5,或者链路费用的一半被加到它的fCumulativeLinkCost和/或fCumulativeLinkCostFromStream中。
节点的重要性可结合:
1、它的量值(前面所述);
2、基于节点名的任意方案;
3、被添加到节点更新结构中或在节点更新结构中存在的另一个值或值的组合。
拥塞的或电量耗尽的节点
这一替代实施方案可帮助从过度拥塞的节点、或低电量运行的节点上移走网络通信量。
如果节点在低电量下运行,或正在遭受拥塞,它可增加其链路费用。这将帮助从正在遭受问题的节点上移走通信量。
节点慢慢改变其链路值并在改变中等待是有益的。这将有助于避免不稳定的网络振荡。
如果节点遭受的拥塞减轻或其电量情况改善,那么它将慢慢降低其链路费用回到正常值。
本领域技术人员将知道振荡问题并且知晓解决这些问题的方案。
共享名字的节点
这一替代实施方案允许节点共享名字。
在web服务器情况下(例如),变得重要的是,提供与单个服务器相比更多的带宽和更好的连通性。
如果两个或多个节点使用相同的名字,那么试图连接到具有该名字的节点的节点将连接到最近的节点(基于fCumulativeLinkCost)。
如果该请求是无状态的(例如请求web站点的主页),那么节点可立即发送该请求,因为该请求路由选择到无论哪个节点,都将返回同样的结果。
如果节点请求满状态(state-full)连接,那么它一开始将连接到具有该名字的最近节点。然后该最近节点返回其可被用来建立所需状态的连接的唯一名字。
例如,在前面所论述的sConnectionAccept结构中,所返回的节点的名字(sConnectionAccept.nnNameB)可以是节点的唯一名字。
传播优先
在更大型的网络中,需要使用控制消息的带宽限制。
总的“控制”带宽应该被限制到所有数据可用最大带宽的一部分。
例如,我们可以指定最大带宽的5%给每个组,其中最小为4K。在简单的10MB/s的连接中,这将意味着我们可每:
=4096/(10MB/s*0.05)
=0.0819s
发送4K的信息包。
所以在该连接中,我们能够每0.0819s发送一个控制包,或接近每秒12次。
该百分比和发送的块的大小是示例,可由本领域技术人员改变以更好地满足他们应用的要求。
带宽限制消息
这些消息应该被连接到一起以适合块控制消息适合的大小。
如果控制消息通过其快速引用编号引用一个目的地节点名,并且直接连接节点不知道该编号,那么快速引用(编号->名字映射)应该先于该消息。
在分配给路由更新的控制带宽的数量和分配给HSPP更新的控制带宽数量之间应该有个划分。例如,控制带宽的75%可被分配给路由更新,而余下的25%可被分配给HSPP更新。本领域技术人员可修改这些数字以更好地适合他们的实现。
多路径网络
本申请文件的这一部分描述一个允许在两个通信节点之间形成用于终端用户数据的多条路径的实施方案。该实施方案也考虑到移动和替换路径以避免拥塞。
该实施方案采用节点和队列的思想。队列被用作消息目的地(以本申请文件前面部分中使用节点名字的方式)。本申请文件的这部分中的术语与前面部分稍有不同,然而,本领域技术人员可以辨别哪些术语是等同的。
在本申请文件的这部分中所提供的定义和概念不应该被看作是使本申请文件前面部分中的定义或概念的含义无效或改变。
本领域技术人员会知道可能的变体。
该网络不依靠任何代理处理网络全局消息。
该网络的要素是节点和队列。
该网络遵循以下几个原则:
一般原则
1、该网络将使用简单概念。
2、决策和消息将被保留在局部,避免需要全局消息。
3、在系统规模或拓扑结构、节点容量或结构灵活性上没有限制。
这些原则指导网络的设计。稍后详述这些原则的操作。
具体原则
1、节点将只向它已经指定为选定的目的地的直接连接节点发送消息。
2、如果在节点上队列中的数据时延大于所选定目的地的时延减去所有选定目的地的最小时延的差,那么该节点将只向选定目的地发送消息。
3、当前不在数据流中的节点只有一个选定目的地。数据流中的节点可具有多个选定目的地。
4、当寻找更好的选定目的地时,不在数据流中的节点使用被动回路检测,而数据流中的节点使用主动回路检测。
5、以TCP/IP方式建立和维持连接。
6、在大型网络中的节点寻找在网络核心中的消息。
数据流原则
1、数据流禁止引起它本身的路径时延变化,在数据流是过负载的情况下除外。
再次声明在这里给出实施例是为了帮助理解。当具体参考标号、他方软件或其他特定物时,这些实施例不意味着限制在此所述的方法和系统的一般性。
节点
在该网络中的每个节点与一个或多个其他节点直接连接。节点可以是计算机、网络适配器、交换机、或任何包含存储器并有能力处理数据的设备。每个节点除了拥有那些与它直接连接的节点的消息外,没有其他节点的消息。两个节点之间的连接可以是几种“结合”在一起的不同连接。该连接可以是物理的(导线等)、实际物理内容(例如盒、小机械、液体等)、计算机总线、无线电波、微波、光波、量子相互作用等。
本发明人对连接的形式没有任何限制。
在图29中,节点A直接连接到节点B和C。节点C只与节点A连接。节点B与四个节点直接连接。
“选定目的地”是所有直接连接节点的子集。只有“选定目的地”将永远被看作消息的可能路由(稍后论述)。
“选定目的地”相当于“最佳邻居”。之所以在本申请文件的这一部分中使用该术语,是因为“最佳邻居”可能在某种程度上引起误解,因为实际上只能有一个“最佳邻居”,然而可有多个“选定目的地”。
队列和消息
利用队列执行通过终端用户软件(EUS)的通信。队列被用作EUS消息/有效载荷的目的地,以及被用作用来建立和维持可靠通信的消息的目的地。知道队列存在的每个节点拥有具有同样名字的相应队列。该相应队列是原始队列的拷贝,然而在不同机器上队列的内容将不同。
利用同样名字的队列在节点之间传送消息。消息将被连续地传送直到它到达原始队列。该原始队列实际上是由EUS、或系统所创建的队列,是一个消息接受器。
没有创建原始队列的节点不知道哪个节点创建了原始队列。
在系统中所创建的每个队列被给定一个唯一标号,该标号包括EUS或系统所分配的队列编号和全局唯一标识符(GUID)。该GUID是重要的,因为它保证只有每个最初创建的队列具有同样的名字。例如:
格式:EUSQueueNumber.GUID
示例:123456.af9491de5271abde526371
替代实施方案可具有数个用来标识特定队列的编号。例如:
格式:EUSAppID.EUSQueueNumber.GUID
示例:889192.123456.af9491de5271abde526371
每个节点可支持多个队列。没有要求特定队列必须和特定节点相关。节点不需要记住它已经被通知的所有队列。
如果节点知道一个队列,它将把该队列通知给那些它所连接的节点。(稍后详述)。知道队列中消息的最终目的地的唯一节点是最初创建队列的最终目的地节点。一个节点假定它向其传送消息的任何节点是那个消息的最终目的地。
任何一个节点决不试图建立全局网络映射,或将网络的任何消息作为一个整体,与它直接连接的节点除外。它所仅有的消息是存在一个队列,消息多长时间到达最初创建该队列的节点,以及时延更新从最初节点到达该节点的最大时间。
时延
时延在网络中选定数据最佳路径中起重要作用。当节点B通知节点A它的时延是X秒,也就是说如果节点A传送消息给节点B,那么该消息将花费X秒到达最终目的地并通过EUS被退出队列。
通过节点B计算的时延值为:
时延=最小时间段([队列中的字节数])*[字节数/秒发送速度]+
[所有选定消息目的地的最短时延]+
[队列服务时间]+[物理网络时延]
最小时间段是由从与本队列相关的发送和接收节点执行最少5次发送或接收所需的时间确定的时间段。它也可以是30ms的最小时间(或快速系统定时器的最小单位的合理倍数)。稍后将更详细论述。
字节数/秒发送速度是节点上队列中数据流出的速度的最佳估计值。
所有选定消息目的地的最短时延所有具有该队列的消息的直接连接节点将向最初创建队列的节点提供时延。这是被选定该队列目的地的所有那些节点的最短时延。
队列服务时间是节点在回到这个队列前试图发送来自所有其他队列的数据所需要的时间,不包括该特定队列。
图30说明怎样计算服务时间。
队列服务时间的计算
对于每个直接连接节点有一个将该节点作为它们选定的目的地,并且将数据放在它们的队列中以便发送的队列列表。
为了公平地服务队列,该系统将循环通过这些队列,以循环形式从队列向“选定目的地”发送消息。每个“选定目的地”将拥有它自己的独立地循环的队列列表。
如果要实现服务质量(QOS),该处理顺序可被改变为更经常地处理“更重要的”队列。
有些类型的节点将具有可利用的不同分辨率的系统定时器。很多次低分辨率定时器更快地从系统读出时间,从而利用更低分辨率定时器以便提高节点的性能是有意义的。
该折衷方案是用来确定队列服务时间的一种稍微更加复杂的算法。
当该系统在选定目的地的队列列表中循环时,它将通过累加与该队列有关的计数器来记录它能够发送来自特定队列的消息的次数。如果它能够将来自该队列的消息传送给与那个选定目的地有关的网络适配器,它将仅累加这个计数器。如果有适当的队列令牌可利用,并且通过时延测试,那么它将仅传送来自队列的消息。这两个概念将稍后定义。
节点也记录它能够从所有队列发送多少消息。
它将保持循环这一循环过程至少低分辨率定时器的3或4个嘀嗒数。作为一个示例但不是为了降低本应用的一般性,在Windows2000环境中,这将大约是45或60毫秒。为了提高本计算的精确性,应该提高嘀嗒数。
一旦直接连接节点的这个时间段已经过去,它将记录这些统计值:
1、发送给此直接连接节点的消息总数;
2、本过程所需要的总时间,以秒计算。
每个队列还将记录在那个时间段期间从队列发送到特定选定目的地的消息的数量。
这些统计值的两个迭代被保存;一个目前正在运行中,剩下一个已完成。当继续收集下一服务时间值的新数据时,这允许节点计算队列的服务时间。
为了计算具有特定的选定目的地(CD)的队列的服务时间,利用这一等式:
服务时间=([发送给CD的消息总数]-
[从Q向CD发送的消息总数])/
[发送给CD的消息总数]*[用于迭代以秒计算的总时间]
如果有多个选定目的地,我们将利用以下等式得到服务时间:
服务时间=1/(1/[CD1时间]+1/[CD2时间]+...))
仅当这个值正被作为时延计算的部分发送时才被计算。这减少了计算的总开销。
物理网络时延
这被定义为
将类似于平均消息大小的包发送至直接连接节点,并且该直接连接节点收到该包所需要的时间。
这个值与常规TCP/IP网络中的“ping”值非常类似。
该物理网络时延被加到提供给直接连接节点的时延上,每次利用由直接连接节点提供的时延执行计算。例如,下列情形可使用物理网络时延:
1、确定哪个是最短时延选定的目的地;
2、当不在数据流中时,被动检测循环(稍后定义);
3、挑选附加选定的目的地。
该值可通过发送一系列到直接连接节点的预定义包并对它们进行计时而被初始化。
在系统的工作期间,该值可基于实际执行情况被重新计算。
假定网卡连续地发送数据,系统所需要做的是记录所发送数据的数量、消息的平均大小和耗用的时间。该等式将像这样:
物理网络时延
=[消息的平均大小]/([一段时间内所发送的字节总数]/[耗用的时间])
应该选择与用于计算服务时间的时间段相类似的时间段。
终端用户软件
与其中每个机器具有一个IP地址和可连接到的端口的常规网络不同,该系统在队列思想上运行。
当终端用户软件(EUS)创建队列时,类似于在特定机器上打开一个端口。然而,有一些不同:
1、当连接到一个队列时,你所需要的是队列的名字(例如:前面所述的QueueName.GUID),不像TCP/IP那样需要机器的IP地址和端口号。队列名不必要与节点、节点标识或它的物理位置或者是在网络中的位置具有任何关系。
2、在TCP/IP中,当一个节点被连接到网络中时,它不通知它的存在。在该新系统中,当一个节点被连接到网络上时,它只通知它的直接连接邻居它的存在。该信息从不被传送。
3、在TCP/IP中,当一个端口被打开以接收数据时,这不被广播到网络上。就该新系统来说,当一个队列被创建时,整个网络被通知该队列的存在,与节点本身的处理有鲜明的对比,如以上“2”中所述。
该队列信息仅以邻居到邻居通信方式被传播。
这些特征允许EUS软件连接到其他的EUS软件,而不需要有关它们相应节点的网络位置的任何信息。
为了在EUS软件之间建立连接,类似于TCP/IP的握手协议被使用。
1、节点A:创建队列A1并发送具有请求开启通信的消息给队列B。它请求发送给队列A1的回答。该请求将具有像这样的结构:
struct sConnectionRequest{
    sQNameType qnReplyQueueName;//队列A1(可被替换为一
                                 个
                             //编号,稍后论述)
    sQUpdate quQueueUpdate;//与队列A1有关的更新(稍后
                            //说明)包括时延、更新时延等
}
当该消息通过网络行进时,它也将发展队列A1的定义。这样,当该消息到达时,已经有一组可将消息从节点B移动到队列A1的节点。
如果节点A在队列A1中没有发现来自节点B的回答,并且在节点A上的队列A1没有被标记“在数据流中”(说明在节点B和队列A1之间有真正的连接),并且它仍然拥有队列B的非无穷大消息(表示队列B、以及因此节点B仍然存在并在起作用),它将重新发送该消息。
它将每1秒、或每“队列B时延”秒——总是长一些,重新发送该消息。
当然,节点B将忽略多重的相同请求。
如果任何节点上有两个相同的请求,该节点将只留下一个请求,删除其余的请求。
2、节点B:发送消息给队列A1说:我已经为你创建了专用队列B1以便向其发送消息。我已经分配了X字节的缓冲区以便重新排序无序的消息。
struct sConnectionReply{
    sQNameType qnDestQueueForMessage;//队列B1
    sQUpdate quQueueUpdate;//与队列B1有关的更新(稍后
                          //说明)包括时延、更新时延等
    integer uiMaximumOutstandingMessageBytes;//用来重新
                          //排序输入消息的缓冲区
}
当该消息通过网络行进时,它也将发展B1的定义。作为该机制的结果,当该消息到达时,已经有一组可将消息从节点A移动到队列B1的节点。
如果节点B在队列B中没有发现来自节点A的回答,并且节点B上的队列B1不是“在数据流中”,而且节点B仍然拥有队列A1的非无穷大消息,它将重新发送该消息。
它将每1秒、或每“队列A1时延”秒——总是长一些,重新发送该消息。
节点B将持续重新发送该消息,直到它接收到了sConfirmConnection消息,并且队列B1被标记“在数据流中”。
当然,节点B将忽略多重的相同的sConfirmConnection回答。
如果任何节点上拥有两个或多个相同的回答,该节点将只保留一个回答,其余全部删除。
3、节点A:无论何时节点接收来自队列A1上的节点B的sConnectionReply,并且它拥有队列B1的消息,它将发送一个回答给队列B表示连接被成功建立。
struct sConfirmConnection{
    sQNameType qnDestQueueForMessages;//队列被确认
}
如果任何节点上拥有两个相同的sConfirmConnection消息,该节点将只保留一个消息,其余全部删除。
通过将队列定义附加到握手消息上,建立连接所需要的时间开销是最小的。它被最小化是因为节点不必等待队列定义而通过网络传播就能发送。
然后节点A可开始发送消息。它不能大于同时处理的所给定的缓冲区大小的字节数。节点B发送收到来自节点A的消息的确认。节点B发送这些确认消息给队列A1。
节点和队列的排列示例看起来如图31。
所发送消息的确认可被表示为一个消息范围。这些确认将被组合到一起。例如,消息组10-35和36-50的确认,将变成消息组10-50的确认。这允许多个确认以单个消息表示。
确认消息的结构像这样:
struct sAckMsg{
    integer uiFirstAckedMessageID;
    integer uiLastAckedMessageID;
}
确认(ACK)以与TCP/IP类似的方式被处理。如果所发送的消息在发送给同一“选定目的地”的消息的平均ACK时间的倍数时间之内还没有被确认,那么该消息将被重新发送。
该消息被保存在EUS创建它们的节点上,直到它们已被确认。这允许消息如果在转发中丢失,可被重新发送。
如果网络通知节点B队列A1不再可见,那么它将从网络删除队列B1并且重新分配与通信有关的所有缓冲区。如果网络通知节点A队列B1不再可见,那么节点A将删除队列A1。
如果节点A和节点B之间的所有可能路径已被删除,或这两个节点中的一个或两个节点决定中止通信,这种情况才发生。
如果节点B没有及时确认消息(通过队列A1中的确认消息),那么节点A将重新发送那些消息。
节点B可在任何时候增加或减少“重新排序”的缓冲区大小,并将向队列A1发送消息通知节点A新的大小。它将根据可分配给单个队列的数据量改变大小。可被分配给特定队列的数据量取决于:
1、节点具有多少存储器;
2、它所记住多少队列;
3、多少数据流正在通过它;
4、多少队列出现在该节点上。
这个调整大小的消息像这样:
struct sResizeReOrderBuffer{
    integer uiVersion;//因为消息可无序到达,版本号将帮
            //助发送节点确定最近的“ResizeReorderBuffer”
    integer uiNewReOrderSize;//缓冲区大小
}
在发送端(节点A)也有一个缓冲区。该缓冲区的大小由运行在该节点上的系统软件控制。它将总是等于或小于由节点B所提供的最大窗口尺寸。
数据流中的节点
如果一个节点在最终发送者和最终接收者之间的数据流的路径上,那么该节点被认为在数据流中。一个节点知道它在数据流中,是因为直接连接节点通知它在数据流中。
数据可流过没有被标记在数据流中的节点。只有一个标记为“在数据流中”的节点被认为是在数据流中。只有数据流过但没有被标记在数据流中的节点被认为不在数据流中。
第一个通知其他节点它“在数据流中”的节点是EUS驻留的节点,该节点正在发送消息给特定队列。例如,如果节点B想要发送消息给队列A1。节点B将是通知其他节点它是队列A1“在数据流中”的第一个节点。一个节点将发送如同队列B的队列,而不标记它们“在数据流中”。
特定队列的数据流中的节点将通知所有它的该队列“选定目的地”的节点,它们在该队列的数据流中。如果通知节点它在数据流中的所有节点通知它不再在数据流中,那么该节点将通知所有它的“选定目的地”它们不再在数据流中。
基本上,如果节点不再在数据流中,它将通知所有它拥有的作为选定目的地的那些节点它们不在数据流中。
该方法达到两个目的。首先,它允许数据流中的节点立即设法找到更好的路由,其次它确保数据流中的节点不会“忘记”队列。
用来通知其他在数据流中的节点的结构是:
struct sDataStream{
    sQName qnName;//队列的名字,可用一个映射到队列名的编
                   //号来替代(稍后论述)
    bool bInDataStream;//如果现在在数据流中为真;如果
                         //不在则为假
}
只有B1类型队列的数据流有能力创建交叉多路径路由。如果需要的话,在数据流中的A1类型队列可被限制为单路径,因为ACK消息既小又容易被合并到一起。B类型节点从不被标记为“在数据流中”。
一种可能的改进将是GUID探查要被添加到“数据流”的每个节点以确保它没有循环。(稍后定义GUID探测器)。
节点任务
节点与直接连接节点通信以发送由EUS创建的消息给另外的EUS。节点也将发送用来建立和维持与另外的EUS可靠通信的消息。
为发送消息,节点必须确定
1、向哪里发送消息
2、何时发送消息
将在以下部分论述这些情况中的每一种。
向哪里发送消息
为了确定节点将向哪里发送消息,它设法挑选一个
1、向最终目的地提供最佳时延的连接节点;
2、不引入“回路”的连接节点;
3、不处在它的发送满负荷状态的连接节点。
初始化队列消息
当EUS创建一个队列时,该系统需要一种方式来通知网络中的每个节点该队列的存在,并且每个节点需要一条通过其他节点到达该队列的路径。该目标是既创建该队列的认知又创建没有回路的路径。
当EUS开始创建该队列时,在其上队列被创建的节点通知所有直接连接节点:
1、队列名
该名字对该队列是唯一的。独立创建的两个队列不应该拥有相同的名字。
2、时延
前面所述,这是一个以秒为单位计算的值,描述了消息从该节点行进到最终接收者节点所需的时间。
3、“满负荷”状态
稍后论述。这是一个布尔值,要是在这个节点的选定目的地的路径中的任何节点不能处理比它们已经拥有的更多的数据流,则该值为真。
4、更新时延
稍后论述。这是一个以秒计算的数值,描述了来自最终接收者的时延更新到达该节点所耗用的最大时间。
5、数据流距离
稍后论述。与“更新时延”非常类似,不同之处在于它描述了该节点与被标记为在数据流中的节点的距离有多远。这可用来决定哪个队列“更重要”。一种替代实现可将它表示为一个节点与标记的数据流,或传送有效载荷消息的节点的距离。
该更新采用的结构为:
struct sQUpdate{
    sQName qnName;//队列的名字。可由编号替代(稍后论述)
    float fLatency;//一条消息从该节点行进到最终接收
                      //者并且被EUS消耗所需的时间
    bool bAtCapacity;//如果为真,该节点已经正在处理它能
    //发送的所有数据(稍后论述)
    float fUpdateLatency;//时延更新从最终接收者行进
             //到该节点所耗用的最大时间(稍后论述)
    float fLatencyFromStream’;//以类似“fUpdateLatency”
       //的方式计算,并且为该节点记录与标记数据流的距离
}
不管这是否是一个先前未知的队列,或是一个已知队列的更新,均可发送相同的信息。
延迟发送节点更新和将节点更新排序应该遵循前面所述的同样方法。
如果这是直接连接节点第一次听到该队列,它将选择第一次通知它的节点作为发送给队列的消息的“选定目的地”。一个节点将只发送EUS消息/有效载荷给作为“选定目的地”的一个或多个节点,即使其他节点通知它它们也提供了路由给EUS所创建的队列。
如果节点挑选一个直接连接节点作为“选定目的地”,它必须通知该节点,它被选作“选定目的地”。该消息的结构像这样:
struct sPickedAsChosenDestination{
    sQName qnName;//队列的名字。可由编号替换(稍后论述)
    bool bSelected;//如果发送该消息所到达的节点是该队列
    //的选定目的地,那么为真
}
如果一个节点已经将此节点作为该队列的“选定目的地”,那么该节点决不再选择另一个节点作为“选定目的地”。如果由于两个节点都同时互相选择对方而发生这种情况,就需要立即解决。
一种方法是,两个节点均删除对方作为自己的选定目的地,随机等待一段时间然后试图互相重新选择。
在这种方式下,创建一个网络,该网络中每个节点知道EUS所创建的队列并拥有一条通过一系列直接连接节点到达EUS队列的无回路路由。
图32示出队列消息传播到网络的一系列步骤。图中节点之间的连接和节点的数量仅为了示例,而实际上可以有在任何一个网络拓扑图中、来自任何一个节点、以及在任意数量的节点之间的连接的无穷变体。
网络中的任何节点决不试图收集网络拓扑或路由的全局消息。该系统给每个节点提供EUS所创建的队列的名字以及直接连接节点提供给EUS所创建的队列的时延。
即使节点拥有了多条可能的消息路径,它仍然只沿着它已经选定作为它的“选定目的地”的一个或多个节点发送消息。
当节点已经选择另一个直接连接节点作为它的“选定目的地”,它将通知该节点它的选择,以避免如果两个节点互相挑选对方作为“选定目的地”而建立回路。
每个节点留意它已经通知它的直接连接节点的有关队列的情况。该直接连接节点所没有被通知的每个新队列将被立即发送(参见传播优先)。在全新连接的情况下,在该连接每一侧的节点将发送它们已知的每个队列的消息。
如果节点不具有足够的存储器来保存网络中每个队列的名字、时延等,那么节点可“忘记”它认为不重要的那些队列。该节点将选择忘记该节点距离所标记的数据流最远的那些队列。该节点将利用“fLatencyFromStream”值来决定它距离所标记的数据流有多远。
一个替代实施方案可使用值“fLatencyFromStream”来表示它离开所标记的数据流、或传送有效载荷包的节点的距离。
这种方法的唯一副面影响是不能连接到那些队列,以及那些用于目的地的只依赖你的节点不能连接到那些队列。
值“fLatencyFromStream”可被用来帮助确定哪些队列更重要(参见传播优先)。如果节点距离队列A标记数据流是100秒,而距离队列B标记数据流是1秒,它应该选择记住队列B——因为该节点距离标记数据流最近并且更有助于找到替代路径。
如果将具有无穷大时延(稍后论述)的新队列名通知给一个节点,那么该节点将忽略该队列名。
队列名最优化和消息
每个队列更新需要有一种方式来标识它参考的是哪个队列。队列名可容易地变得很长,并且低效率地发送。通过采用编号来表示长名字,可使节点变得更有效。
例如,如果节点A想要通知节点B有关名为“THISISALONGQUEUENAME.GUID”的队列,它可以首先通知节点B:
1=“THISISALONGQUEUENAME.GUID”
用于这一通知的结构像这样:
struct sCreateQNameMapping{
    int nNameSize;
    char cQueueName[Size];
    int nMappedNumber;
}
那么每次节点A想要发送一个队列更新时,它可发送一个表示该队列名的编号,而不是发送长队列名。当节点A决定不再想要通知节点B有关名为“THISISALONGQUEUENAME.GUID”的队列时,它可通知A忘记该映射。
该结构会像这样:
struct sRemoveQNameMapping{
    int nNameSize;
    char cQueueName[Size];
    int nMappedNumber;
}
每个节点将维持什么名字映射到哪个编号的它自己的内部映射。它也将保留一张转换表,使得它能够将来自直接连接节点的名字转换为它自己的命名方案。例如,节点A可使用:
1=“THISISALONGQUEUENAME.GUID”
而节点B可使用:
632=“THISISALONGQUEUENAME.GUID”
因此,节点B将拥有一个映射,该映射允许它将节点A的编号方案转换为对节点B有意义的编号方案。在本例中它将是:
节点A  节点B
1  632
...  ...
...  ...
利用该编号方案,也允许队列A1是队列所指定的节点B所标记的消息(also allowueA1 andes to be messagetagged aeB with ch queuetto opee destined for)。例如,如果该系统拥有100字节的消息,它将保留最初的四个字节以保存消息所属的队列名,消息跟在后面。这将使总消息大小为104字节。该结构的一个示例还可包括消息的大小:
struct sMessage{
    int uiQueueID;
    int uiMsgSize;
    char cMsg[uiMsgSize];
}
当该消息被目的地节点接收时,该节点将查阅它的转换表以便决定该消息应该被放入哪个队列。
到达被删除队列的路径
如果在到达创建原始队列的节点的路径上的一个节点与它正在用作它的唯一“选定目的地”的节点断开连接,那么该节点将首先试图找到一条无回路的替代路径。
它将通过检查所有目前没有向该节点发送(也就是,将该节点作为“选定目的地”)的节点来实现。如果它挑选了一个已经将该节点作为“选定目的地”的节点,那么一个回路将被创建。
该节点将使用GUID探测器在利用“GUID探测”过程的剩余可能节点中检查回路,稍后在“添加附加路由”中描述“GUID探测”过程。
如果所有潜在的替代路径都是回路,那么该节点将设置它的时延为无穷大,并且立即通知所有连接节点这个新的时延。
如果一个节点使“选定目的地”通知它时延为无穷大,那么它将立即停止向那个节点发送数据并将删除该节点作为“选定目的地”。如果所有“选定目的地”都被删除了,那么该节点将设置它自己的时延为无穷大并立即通知它的直接连接节点。
一旦一个节点已经设置它的队列时延为无穷大并通知它的直接连接节点,它等待某一段时间(例如1秒)。在该时间段结束时,该节点将立即选择不具有无穷大时延的任何直接连接节点作为选定目的地,并重新开始发送数据。
如果在第一个时间段过去后,节点在最初固定时间段的两倍时间(例如2秒)内没有发现合适的新资源,它将从队列中删除消息,并删除该队列的消息。
该时间段是基于该节点发送该队列已经趋于无穷大的更新所用时间的倍数。(稍后参见传播优先)。然后将该值与10相乘,或是取决于网络互连性的一个合适的大数字。
例如,如果网络非常大并且连接稀疏,那么该数字将大于10。在密集的、连接性好的网络中,该值为10。
如果节点时延从无穷大变为非无穷大,那么它将立即通知所有直接连接节点它的新时延。
在该实施例中,在有10个节点的网络中,EUS已经在与网络一侧一个的两个节点有直接连接的节点中的一个节点上创建了队列。
在图33中,网络中的每个节点恰好知道该EUS所创建的队列(它具有0时延——较低的正确性),每个节点中的编号表示如前所定义的以秒计算的时延。
接着,在图34中,在节点间具有EUS所创建的队列的连接中的一个被删除。
与具有EUS所创建队列的节点失去连接的直接连接节点将检查以便发现是否有它直接连接的任何节点正在使用它作为发送者。因为它们全部都是回路,它就不需要利用GUID来探查它们以便确定它们是否是回路了。然后该节点将自己的时延设置为无穷大。这如图35中所示。
该节点将立即通知所有直接连接节点它的新时延。如果所有节点的“选定目的地”处于无穷大,那么那些节点的时延也变成无穷大。如图36中所示。
该过程继续进行,直到所有能够设置为无穷大的节点被设置为无穷大。这如图37中所示。
在这种情况下,每个已经被设置为无穷大的节点暂停一段固定的时间(例如,1秒),然后挑选它发现的不是无穷大的最短时延目的地。这如图38中所示。
一旦处于无穷大的节点变成非无穷大时,它将立即通知与它直接连接的节点。如果那些节点中的一个节点处于无穷大,那么它将选择为它提供非无穷大时延的第一个连接节点作为它的选定目的地。如图39中所示。
在这种情况下,网络连接已经被重定向,以便使得指定为EUS所创建队列的所有消息传送到该队列。
如果一个队列的节点的时延在多于几秒钟的时间内一直处于无穷大,那么该节点可假定没有到达最终接收者的其他替代路由选择,并且队列中的任何消息可以和队列消息一起被删除。
图40概述了以上过程。
“不在数据流中”节点的最佳路径的汇聚
节点总是试图通过选择不同的选定目的地来降低它们到达最初所创建队列的时延。
只有建立在最终发送者和最终接收者之间的节点上,用来传送EUS消息数据的队列将使用交织的多条路径用于提高带宽。该最终发送者通过通知所有“选定目的地”它们在这条数据发送路径中(“在数据流中”)来标记该路径。那些“选定目的地”节点中的每一个节点通知它们自己的“选定目的地”节点它们“在数据流中”。图42说明这一过程。
如果到特定节点的所有发送者断开连接或通知该节点它不再在“数据流”中,或通知它在“数据流”中的节点通知它它不再是“选定目的地”,那么它将清除该“在数据流中”的标记并通知所有它的选定目的地它们不再在数据流中。
如果节点目前在具有EUS的两个节点之间的EUS消息传送的路径中,它利用不同的机制选择新的“选定目的地”。
如果拥有多个选定目的地的节点从数据流中被删除,它将删除所有的选定目的地,具有最短时延的那个目的地除外。这使得用来找到回路的机制保持有效,因为该机制将只对一个选定目的地工作。
目前不在数据流中的节点将总是试图通过选择比它的当前选定目的地具有更短时延的节点来改善它到达最终接收者的时延。
节点需要确保当它正在选择不同的“选定目的地”时,它将不引入一个回路。
一个期望升级它的连接的节点将优选任何不在“满负荷”的节点胜过任何“满负荷”的节点(稍后论述),不考虑时延。
一个节点目前不在EUS消息/有效载荷的路径中,它不被允许使用GUID或消息去检查以便发现可能的新选定目的地是否是一个回路,因为任何规模的网络将很快由于这些消息被超限运行。
替代地,它通过等待来自那个节点的周期性的、自动的时延更新来观察潜在选择的时延,并将此时延和它的当前“选定目的地”时延进行比较。
在潜在的新目的地将创建一个回路的环境中,如果选定,导致出现较短时延的主要原因是在当前节点和该潜在的新节点之间的回路中数据行进时间所引入的延迟。
例如,如果每隔一秒当前节点时延增加1s,并且在该节点和该新潜在“选定目的地”之间有一个具有3秒延迟的回路,该新潜在“选定目的地”看起来将总是拥有比当前选定目的地短3秒的时延。
图43是另外一个要被避免的潜在回路的示例。
如果当前节点选择这个明显“更佳选择”,它将在该系统中创建一个回路。
这是来自队列更新的“fUpdateLatency”值被使用的情况。该数值是从创建队列的节点行进的时延更新所耗用的最大时间。该值的实际计算稍后论述。
在前面的图中,节点B正试图决定节点F是否是比节点A更好的选择。它将比较来自节点F和节点A的“fUpdateLatency”的差值。在该实施例中这两个值将是:
节点A fUpdateLatency:8s
节点F fUpdateLatency:13s
因为节点A是当前所选定的目的地,而节点F的“fUpdateLatency”大于节点A的“fUpdateLatency”,节点B需要检查以便发现节点F是否真正地通过一系列的节点将它的消息路由到节点B。
节点B不能仅因为节点F具有更高的“fUpdateLatency”就立即丢弃它作为有效的新“选定目的地”。这是因为节点F提供的替代路由尽管潜在地是到达最终目的地的更长路径,但是由于节点A所提供的路由上的阻塞,节点F提供的路由可能更快。
在被动回路测试之后的基本思想如下:
●在A和F之间的fUpdateLatency差值(在该实施例中为5秒)是从节点B发送的时延更新到达节点F所耗用的最长时间。
●如果存在一个回路,那么在这个时间段来自节点F的最大时延值将大于在该时间之前在相同的时间段来自节点A的中值时延值。
中值的整个时间段必须永不大于节点A的“fUpdateLatency”值。例如,如果在节点A的“fUpdateLatency”值和节点F的“fUpdateLatency”值之间的差值为500秒,并且节点A的“fUpdateLatency”是8秒,那么用来计算中值的时间段将仅是8秒。观察最大值的时间段将是500秒。
图44说明这一比较过程。
该方法可为一个回路产生一个错误的正值,然而它将仅非常少地产生一个错误的负值。稍后论述回路的处理。
在上述情形中利用中值是理想的,然而计算一个中值需要保存所有的观测值。下面是可以估计中值并需要低的固定总开销的一段伪代码算法。
float fPart1=0;
float fPart2=0;
int nCount=0;
while(not done all observations){
    float fCurOb=GET_CURRENT_OBSERVATION()
    fPart1=fPart1+fCurOb;
    nCount=nCount+1;
    fPart2=fPart2+abs(fPart1/nCount-fCurOb);
}
float fCloseToMedian=fPart1/nCount1-fPart2/nCount;
如果观测值的时间段太短,它们将对低分辨率定时器的一次迭代进行聚拢。
在中值和最大值两者的观测期间,fUpdateLatency值可改变。如果两个“fUpdateLatency”的差值增大,将利用新的已增大的时间段。较低值将被忽略。这会引起“中值”时间段将小于“最大值”时间段的情况。这是好的。
如果节点F的“fUpdateLatency”小于节点A,或在比较过程中变得更小,那么回路是不可能的,并且该节点可在没有进一步延迟的情况下选择节点F作为新的选定目的地。
如果该节点上的队列处于“满负荷”,我们将优选一个具有更长时延的不处于“满负荷”的节点。该节点将仍然等待适当的时间以便确保该“不满负荷”的节点停留在“不满负荷”。如果在该时间段期间所考虑的节点变为“满负荷”,但是它提供一个更短的时延并没有回路,那么该节点可利用那个节点作为“选定目的地”。
如果该节点目前处于无穷大,那么将不使用该过程(参见前文)。
如果在“最大值”时间段期间,从节点F到达的时延更新大于节点A的中值,那么测试将中止表示一个回路。节点B将不用等到整个“最大值”时间段期满。如果该节点“满负荷”而被考虑的节点不“满负荷”,这种情况除外。
因为不在数据流中的节点仅可拥有一个队列选定目的地,当它挑选新的选定目的地时,它将停止使用旧的选定目的地。
当不在数据流中的节点转换到新的选定目的地时,它将记录当前选定目的地的“fUpdateLatency”和新的选定目的地的“fUpdateLatency”之间的差值。该值将被保存并用来帮助检测回路。(稍后论述)
满负荷检查
每个节点的每个队列还具有一种机制,以检测它何时发送或接收满负荷数据。当其队列中的数据时延超出
最大([所有选定目的地时延])-最小([所有选定目的地时延])例如大于5倍的时间间隔时,节点上的队列被认为是满负荷状态。时间间隔被定义为每个能够发送的目的地发送一定数量消息(例如,10)的时间,或某个时间段的最小值(例如,快速系统定时器的最小单位的双倍),或另一个时间段的最大值(例如6秒)。
重要的是,在选定目的地已有机会将队列中的数据总量带到最低点的可能性的时间间隔期间足够的时间已经过去。例如,如果数据以每秒100字节的速度流入,并以每5秒500字节的速度流出,5秒的绝对最小时间间隔将是需要的。
图45是在一个时间间隔期间的队列水平和最小值的示例。
如果节点不能在该时间段期间将队列时延降低到该水平,它就被认为满负荷。如果它不能这样做,那么有太多的数据流进该节点而不能在该数据一到达就把它成功发送出去。
如果节点处于满负荷,它就通知所有连接到它的节点。如果节点上的队列的所有“选定目的地”被标记为“满负荷”,那么那个节点通知所有它的直接连接节点它也处于满负荷。
“满负荷”更新与正常时延更新同时通过网络行进。它们不能取代正常的数据流。(参见前文的sQueueUpdate)
如前面所述,不在数据流中的节点将试图找到被标记“满负荷”的“选定目的地”的非回路替代者。如果节点在数据流中,它将不因为一个“满负荷”节点的“满负荷”状态而试图删除它作为“选定目的地”,它将仅基于时延做出删除该节点的决定。
当满负荷时寻找附加路由
“满负荷”的节点因为有太多的数据流入,它将制成一个利用直接连接节点的所有可能附加路由的列表。一个可能的附加路由是这样的节点:
1、不满负荷
2、不是正在发送到该节点
3、将不创建一个回路
4、具有除节点查询之外的队列的目的地(也就是,没有回路创建)
对于这些可能路由中的每个路由,该满负荷节点将创建唯一的GUID。该GUID将沿着每一个可能的路由被发送以便测试回路的每个路由。如果一个回路被检测到,那么该路由从可能的附加路由列表中删除。
接下来对应于一个可能路由的每个GUID沿着该路由被发送到目的地节点。该节点将保存并转发该GUID给所有它已作为“选定目的地”的节点。如果该节点为目的地选择一个新节点,那么该GUID将被传送到该新节点。一个节点通过通知所有“选定目的地”忘记该GUID而使该GUID无效。如果所有通知它记住该GUID的节点,通知它停止记住该GUID,或通知它们不再被选定作为目的地,或它们被断开连接,该GUID被无效。
图46是这种情况的一个示例。在图46中,如果满负荷的节点发现它发送给一个可能的附加选定目的地的GUID,它就知道该选择将是一个坏选择。
发送给选定路由的GUID将以同样的方式列举数据可从该节点沿着流动的所有路径。
如果满负荷状态中的机器发现它已发送出去的GUID中的一个从正在向它发送数据的一个节点回到它那儿,那么它知道它发送GUID所沿着的节点形成部分回路,并且作为一种用以减轻“满负荷”状态的选择,该可能的路由被删除。GUID消息由一个GUID、正在讨论中的该队列名、“行进时间”以及通知该节点或者“记住”或者“忘记”该GUID的符号组成。
当节点被通知去记住或忘记一个GUID时,它将尽可能快地发送该消息(参见传播优先)。如果它已经发现并处理了该GUID消息,它将忽略这一消息。
一个GUID消息将采取的结构为:
struct sGUIDProbe{
    sQueueName qnQueueName;//也可以是表示该队列的一个编
                      //号(前面所述)
    bool bRememberGUID;//如果节点被假定记住该GUID则为
                      //真;如果节点被假定忘记该GUID则为
                     //假。
    char cGUID[constant_Guid_Size];//真正的GUID
    float fMaximumGUIDTravelTime;//GUID将行进多远(基于
                              //fUpdateLatency)
}
该GUID的行进时间被设置为寻找新路由的节点的fLatencyUpdate和处于不满负荷状态的可能的新路由的fLatencyUpdate之间的差值的3倍(例如)。每次节点接收到一个GUID探测,它在通知它的直接连接节点该GUID探测之前,从fMaximumGUIDTravelTime时间中减去它对fLatencyUpdate值的贡献(而不是象它通常所做的那样,将该值加到fLatencyUpdate)。如果在节点从fMaximumGUIDTravelTime中减去它的贡献后,该值小于0,那么GUID探测不被传送到任何选定目的地。
它所减去的值是基于与该GUID探测所基于的队列相同种类的所有队列的循环更新所用的时间。(稍后论述,参见“传播优先”-“第二组”)
如果存在回路,满负荷状态的节点将等待它的初始化“fMaximumGUIDTravelTime”的最小值,以便给GUID机会去通过网络工作并循环回到该“满负荷”节点。如果时间已经过去,那么其GUID没有使它回到节点的所有潜在选择被认为是有效的选项。
最短的时延、非“满负荷”、无回路节点被选定并且消息被发送到表示它现在是“选定目的地”的节点。这样做是为了防止两个直接连接节点选择它们自己作为目的地,创建一个回路。
如果两个直接连接节点同时互相选择对方作为目的地,它们两个将立即转换回它们前面的目的地并重试找到附加目的地的过程。因为GUID机制包括随机的时间间隔,两个节点再次选择对方的可能性在每次迭代上显著降低。
如果所有可能的路由返回为回路,“满负荷”的节点将删除GUID。如果该节点在经过一段时间后仍然“满负荷”,它重试寻找替代的过程。该节点将等待用于最后一轮的GUID探测的“fMaximumGUIDTravelTime”最大值的3倍(例如)。
即使节点有几种发送数据到哪儿的选择,队列中所允许的最大时延仍然是
最大([所有选定目的地时延])-最小([所有选定目的地时延]),它受节点上可利用存储量的支配。一旦该新目的地被选定,该节点就可清除它的“满负荷”状态。
该最大值不是一个严格的限度,因为有可能存在未决的流控制指标,允许多一点的数据被发送。(参见流控制)
每次一个标记更新被发送到发送数据给该节点的节点,最近时间间隔上的当前最小时延以及“满负荷”标记被一起发送。这使得发送节点拥有能够使它们总是选择最佳路由的当前时延数据。
删除未使用的附加路由
因为不在数据流中的节点总是只具有一个选定目的地,它们不删除附加资源,而是从一个资源转换到一个更好的资源。(前面所述)。
数据流中的节点正好是那些被给定潜在可能性以便逐渐形成多条数据路径的节点。(前面所述)。
如果数据流中的节点在一段时间内没有使用特定的“选定目的地”来发送数据,那么该节点将从它的选定目的地列表中删除该选定目的地并且警告那个节点它不再是选定目的地。
通知一个节点不再是选定目的地也将删除“在数据流中”标记,除非另一个“在数据流中”的节点也已经选择该节点作为选定目的地。
在删除一个未被使用的选定目的地之前,所等待的时间与在第一位置创建该连接所需要的时间相比应该相对较长。维持选定目的地的时间也可以基于删除一个节点到该节点被重新添加之间所耗用的时间随着时间动态调整。
当不“满负荷”时,决定何时添加/删除选定目的地
要是存在任何可能的选择的话,节点必然总是拥有至少一个“选定目的地”。(如若不然,它的时延将是无穷大)
如果节点在特定队列的数据流中,且该队列是用来传送数据的队列,则它可能拥有多于一个“选定目的地”。在我们的TCP/IP信号交换示例中,这个队列为队列B1(前面图示)。
如果节点不满负荷,并且不能删除“选定目的地”,因为所有的“选定目的地”太活跃而不能被删除(参见前面),那么它将试图添加新的选定目的地,该目的地具有小于所有“选定目的地”的最大时延的时延。
它必须只选择可能的不“满负荷”的“选定目的地”。
该节点这样做是希望用更好选择替换它的当前“选定目的地”。这将允许该节点使得整个路由更快,并需要更少的缓冲区空间用来通过它传送消息。
节点利用GUID探测(以上所述)来探查可能的选择。如果该GUID探测失败(检测到一个回路),那么下次该节点试图使这条连接最优化,它将挑选具有次短时延的另一个直接连接节点。
图47是说明该过程的流程图。
解决意外创建的回路
如果在不是标记的数据流的一部分的节点中意外地创建了一个回路,那么它们的时延和“fUpdateLatency”将螺旋式上升。
图48示出了在不是在数据流中的节点中被意外创建的回路。
由于我们比较可能的新选定目的地时延的方法(参见上文),位于不在数据流中的节点中的回路是少见的。
因为我们利用GUID来明确探测用于回路的可能的新目的地,回路将不能在数据流中被创建,除了非常非常少地由于已经使用GUID机制后,中间路径的改变。
不涉及“满负荷”的节点或趋向无穷大的节点的简单回路利用标准“被动”回路寻找机制将轻易地被解决。
回路中的节点将创建知道不具有到队列的最终接收者的真正连接的队列的外貌。例如,如果一个回路被维持,并且真正的最终接收者离开了网络,该回路将继续自我维持该队列消息。
该问题将出现当:
1、回路内部的节点不是“满负荷”并且回路外部的节点是“满负荷”;
2、回路外部的节点是“无穷大”。
在这两种情况下,解决方案是检测回路的可能性并用上面所述的同样方式将它们的时延改变为无穷大。这将使得节点快速地进入非回路状态。
如果我们在一个不在数据流中的节点上,并且有这样的直接连接节点:
1、当该节点不是时“满负荷”;
2、当我们不是时拥有无穷大的时延;
那么回路测试将被调用。
在选择新的“选定目的地”的过程期间,该节点记录新的“选定目的地”的“fUpdateLatency”和旧的“选定目的地”的“fUpdateLatency”之间的差值。以秒计算的该时间乘以3后被称作“可能的回路时间”(PLT)。
我们的回路测试将从记录PLT的“fUpdateLatency”、“fLatencyFromStream”和“fLatency”的最小值开始。
如果在两个连续的迭代期间,所有三个所记录的值(“fUpdateLatency”、“fLatencyFromStream”和“fLatency”)小于以前的迭代,那么GUID探测被用来确定是否实际上有一个回路。该GUID探测(参见前面)被设置为通过网络行进PLT*5(例如)的时间。
如果一个回路被检测到,那么检测到它的节点将以与“到达被删除队列的路径”同样的方式趋向无穷大。
如果该GUID探测失败,那么该节点回到上文所述的它的回路测试。
如果该过程重复了3次,那么该节点无论如何都将趋向无穷大。(参见“到达被删除队列的路径”)
何时发送消息
在确定何时发送消息中,该节点决定正在发送给的节点是否:
1、有空间以便保存该消息;
2、在给定其他直接连接节点的时延和该节点队列中数据数量的情况下提供时延给有用的目的地。
只发送给有用的选定目的地
即使节点已经选定用来发送消息的多个“选定目的地”,这不意味着它们全部都被使用。仅当队列中数据的当前时延等于或大于下值时,“选定目的地”将被使用:
=[选定目的地时延]-最小[所有选定目的地]
如果一个“选定目的地”时延高于所有“选定目的地”时延的最小值x秒,那么该x秒的数据在利用该选定目的地之前将被保存在该节点上。
如果一个选定目的地拥有的时延高于当前队列时延(如前面所定义),那么我们可以选择发送消息给该节点请求它当该节点的时延下降到低于一指定值时通知我们。请求节点发送一个在指定值的更新也将促使该节点发送当前的时延。
这样解决了需要快速更新以保持发送者被通知以接收者时延的问题。
时延和“满负荷”更新都在标记更新中被传送(稍后定义),还在被限制为不超出节点带宽的节点的X%的固定流中传送。通常该数值为1-5%。该节点将以循环方式通过所有已知的可用时延循环。(参见传播优先)用来确定发送队列更新的顺序和频率的其他方式也可被使用:
1、百分比改变;
2、为了更频繁地更新,特定种类的队列名被标记;
3、“数据流距离”计数器可用来增大数据流附近的时延更新。
如果在一段时间内没有队列消息被发送到选定目的地,那么该选定目的地从该节点的选定目的地列表上被删除。该时间段将至少是一个大于最初建立该目的地所需要的总时间的数量的量级。也可采用一种适应性的方法(前面所述)。
流控制
每个节点具有可变数量的存储器,主要是RAM,用来维持有关连接到其他节点和队列的信息,例如,消息数据、时延、GUID、选定目的地等。
需要流控制的一个示例是如果节点A选定节点B作为消息目的地。重要的是不允许节点A用过多的数据超限运行节点B。
利用标记机制进行流控制工作。节点B将给节点A对应于节点A能发送给节点B的字节数的一定数量的标记。不允许节点A传送超出该数量的字节。当节点B拥有更多可利用的空间并且它意识到节点A在标记上得到的数量少时,节点B可向节点A发送更多的标记。
有两种层面的流控制。第一种是节点到节点的流控制,而第二种是队列到队列的流控制。节点到节点的流控制被用来限制从节点A发送到节点B的任何数据(队列和系统消息)的字节总数量。队列到队列的流控制被用来限制从节点A中队列移动到具有相同名字的节点B中队列的字节数量。
例如,如果有10字节队列消息从节点A移动到节点B,在节点到节点流控制中它将花费10个标记,在用于该特定队列的队列到队列流控制中它也将花费10个标记。
当节点B开始给节点A标记时,它将待处理的标记的总数量限制为一个小数量作为启动状态,从该启动状态调节到节点A的最大吞吐量。
当满足以下两个条件时,节点B知道它没有给节点A足够高的“待处理的标记”限度:
●如果节点A已通知节点B它有更多的消息要发送但是因为它用完了标记,所以不能发送,以及
●节点B遇到了“无数据发送”的情况,在此如果节点B已经让它发送,目的地将已经接受数据。
如果节点A已请求更高的“待处理的标记”限度,并且节点B没有达到“无数据发送”的情况,在增大节点A的“待处理的标记”限度之前,节点B将等待“无数据发送”的情况。
节点B将总是试图保持节点A有标记,不管该“待处理的标记限度”。节点B通过从它已经给节点A的标记数量中减去它发现的消息数来记住它认为节点A具有的标记数。如果它发现节点A低于节点B赋值给节点A的“待处理的限度”的50%,并且节点B能够接受更多的数据,那么节点B将发送更多的标记给节点A。节点B可随意地给节点A最高达50%的百分点,但是在该点它必须起作用。
分配更多的标记表示节点B部分上的所通知的估计,该估计是关于可利用来与数据一起发送的节点A拥有的标记的最大数量。
当标记的数量被添加到节点B的节点A拥有标记数量的通知的估计,该标记数量将不超过该“待处理的标记”的限度。它也可更小,取决于节点B队列中数据的数量。(稍后论述)
例如,让我们考虑正在协商中以便节点A可向节点B发送的节点A和节点B。图49示出了当前状态。
节点B已经创建了它想要提供给节点A的默认配额。那么它以该配额(在当前值和最大值之间的差值)向节点A发送消息。它还包括一个版本号,每次最大限度被改变时版本号增大。节点B发送给节点A的消息像这样:
struct sQuotaUpdate{
    unsigned integer uiVersion;//版本
    sQNName qnName;//队列名或编号(参见前面)
    unsigned integer uiAdditionalQuota;//多少附加配额被
                                       //发送
}
我们这样做使得当节点A通知我们它想要发送更多的数据时,它将仅在每次我们调整最大限度时这样做一次。图50示出了当前状态。
如果节点A想要发送5个字节的消息给节点B,它将没有足够的配额。然后节点A将发送一个消息给节点B说“我想要发送更多”。接着它将设置其“最后想要更高的版本”以便与当前版本匹配。这将防止如果节点B没有满足该原始请求时节点A一再地请求更高的配额。该消息像这样:
struct sRequestMoreQuota{
    sQNName qnName;//队列名或编号(参见前面)
}
图51示出了这一状态。
节点B在它的队列中没有数据并且它将已经能够向它的选定目的地发送,所以它将把节点A的最大配额限度增大到100字节。它将新的配额和新的版本号一起发送。图52示出了这一状态。
现在节点A拥有足够的配额来发送它的5字节消息。当消息被发送出去,节点A从它的可用配额中删除5字节。当节点B接收到该消息,它从它认为节点A拥有的当前配额中删除5字节。图53示出这个状态。
消息可继续流动直到节点A完成要发送的配额或消息。如果节点B认为节点A拥有的配额下降到低于50字节,节点B将立即发送配额更新。没有改变最大限度的配额更新将不能导致版本的增加。不同队列的配额更新可一起背载,因此如果一个配额更新“需要”被发送,那些恰好需要完成的其他配额更新可在同时被发送。这将减少特定消息只与一个配额更新一起发送的发生率。
通常,系统消息也可与数据消息一起被背载,以减少它们的影响。
扩大队列到队列流控制的“待处理的限度”的相同方法也适用于节点到节点流控制。
该“待处理的限度”也由该系统以小但是固定的速度(例如,每秒1%)不断地缩小。这允许随着时间的推移对“待处理的限度”进行自动修正,该“待处理的限度”在高容量环境中可变得巨大但是现在处在低容量环境中,该“待处理的限度”就没有必要高了。如果该持续的缩小使“待处理的限度”降得太低,那么先前的机制(如果接收节点遇到“无数据发送”的情况,就请求更多的标记并且更多地被给予)将检测它并再次增大它。
满负荷流控制
当给其他节点要发送的配额时,重要的是它们被给予足够的配额以便将接收节点移到“满负荷”状态并且要是可能的话保持它在该状态。
如果节点上队列中的时延超过(最大([所有选定目的地时延])-最小([所有选定目的地时延])),那么每个输入的数据流在此最大时延期间不可以得到多于它们的最大“待处理的限度”的配额数量。
通过将一个“过负荷标记计数”变量附加到当队列过负荷时记录从源端接收到的字节数量的接收端上的流控制结构中,来实现上述功能。
当它停止向发送节点提供更多的配额时,该数量从“最大待处理限度”中被减去。
如果队列时延降到低于它的最大时延,该“过负荷标记计数”变量设置为0。
当数据从超负荷的队列中被删除,我们得到已经被删除的字节数量并从所有大于0的“过负荷标记计数”变量中尽量均匀地减去该字节和。重要的是该“过负荷标记计数”总是等于或大于0。
例如,如果从队列删除了120个字节并且有四条将数据输入到该队列中的连接而它们的“过负荷标记计数”为0、100、20、50,我们将把字节数量(120)除以大于0的“过负荷标记计数”变量的数量(3),这样得出40。因为最低“过负荷标记计数”变量小于40(20),我们将从所有“过负荷标记计数”变量中减去该数量(20)。这样留给我们0、80、0、50,而仍然留有60字节。我们重复该过程并且从剩余的两个“过负荷标记计数”变量的每一个变量中减去30,这样留给我们0、50、0、20。
EUS队列流控制
在TCP/IP中,窗口尺寸选择是重要的。如果TCP/IP中的窗口尺寸太小,那么性能将受损害,如果窗口尺寸太大,那么将用光系统资源而没有提高性能。
本发明允许利用“仅发送端”算法快速汇聚到最佳窗口尺寸。
属于标记数据流一部分的节点将只缓冲足够数据以确保它们能以最快速度发送。这意味着即使有十亿字节的数据要发送,只有相对固定的、小百分比的数据将在给定的时间不断传送。
然而,如果有十亿字节的数据要发送(而不只是一个小消息),更多的路径将被用来传送该数据。然而,无论利用多少条路径,在传送中的数据的总数量将不能超过由最终接收者提供给最终发送者的缓冲区。
节点用来确定它们将发送给哪些节点的一个关键度量是时延。如果有1000秒的剩余数据要发送,那么所有到达目的地的时延低于1000秒的路径应该被考虑。如果有一个非常小的数据量并且发送它所需要的时延为10ms,那么非常少的路径(并且只有最快的)将被用来传送数据。
这允许节点根据需要补充多个节点或很少节点以便确保最快的数据传送。该方法允许我们在需要的时候通过牺牲不需要的时延暗中增大带宽。
传送中的数据数量也受发送节点能分配给队列的缓冲区的大小限制。发送缓冲区的最佳大小使得它的时延为:
发送缓冲区时延=>最大(所有选定目的地时延)-
最小(所有选定目的地时延)
这意味着如果我们能不断地把节点添加到选定目的地列表中,我们将能够在最终发送者上不断地扩大发送缓冲区。
具有EUS发送消息的节点应该允许该发送缓冲区增长到一个点,在该点该EUS可保持队列“满负荷”(以与流控制工作相同的方式)。这样确保所有“选定目的地”能尽可能多地被使用。
在最终接收者上,接收到的消息被放入重新排序的缓冲区。当节点能够按照顺序放置这些消息的时候,它们被转移到一个队列中,该队列被EUS用来使消息退出队列以供处理。该退出队列缓冲区的大小与节点之间队列缓冲区(流控制中所述)以同样的方式设置。
如果EUS用来取回消息的队列超过它的最大尺寸,那么该节点通知它的直接连接节点它是“满负荷”的,并且不会给直接连接节点更多配额。来自重新排序的缓冲区的有序消息仍然被放入EUS所用的这个队列,然而,进入重新排序缓冲区的输入消息流将被切断,因为该节点不再为该队列向直接连接节点分发配额。
如果该EUS所用的队列完全变为空,并且直接连接节点想要发送更多的消息给具有EUS的节点,那么该EUS所用的队列的最大尺寸被扩大(以与流控制工作相同的方式)。
该队列的大小也遭受与流控制期间该队列所遭受的同样的向下的压力。
重新排序缓冲区的大小与EUS所用的队列可保存的消息的数量(或字节的数量)无关。
如果接收EUS将要完全停止处理消息,网络中所有节点将为队列改变为“满负荷”,最终发送者将非常快地不再被给予配额,利用该配额可将消息推进网络。
传播优先
在更大型的网络中,将需要使用控制消息带宽限制。
我们将使用几种类型的限制。总“控制”带宽将被限制到所有数据可用的最大带宽的一个百分比。
控制消息将被拆分为两组。这两组将基于一个最大带宽的百分比被单独地进行带宽限制。每个直接连接节点将拥有这两组的它自己的版本。
例如,我们可为每个组指定最大带宽的5%,其中最小尺寸为4K。在简单的10MB/s的连接中,这意味着我们将每:
=4096/(10MB/s*0.05)=0.0819s
发送4K信息包。
因此在这样的连接中,对于每个组我们将能够每0.0819s发送一个控制包,或约每秒12次。
该百分比以及发送的块大小是示例,可由本领域技术人员来改变以更好地满足他们应用的要求。
第一带宽限制组
第一带宽限制组发送这些消息。这些消息应该被连接到一起以适合块控制消息适合的尺寸。
1、下列消息所需要的队列的名字编号映射;
2、标准流控制消息;
3、GUID探测器;
4、通知节点现在它是否是“选定目的地”;
5、HSPP消息;
6、HSPP队列的最初队列消息/到无穷大/从无穷大;
7、非HSPP队列的最初队列消息/到无穷大/从无穷大。
第二带宽限制组
第二组发送队列的时延更新。它将该队列分为3个组,并且以相互交错成1∶1∶1的循环方式发送这些组中的每一个组。
通过利用“fLatencyFromStream”值给所有队列排序创建最初两个组。如果该队列有多个选定目的地,那么具有最短时延的“选定目的地”被用来决定我们将使用哪个“fLatencyFromStream”值。
该队列以与前面所述的在单个路径实施方案中类似的方式升序排序。它们基于利用该限制带宽在半秒钟内可发送多少更新被划分为两组。这样确保第一组将频繁地被完全更新,而剩下的将仍然被更新——但不及那么频繁。
第三组由队列组成,在该队列该节点在数据流中。
每个时延更新包括一个“fUpdateLatency”值。该“fUpdateLatency”值针对三组的每一组中的队列分别被计算。它被计算为一次发送组中所有内容所花费的时间总数。该值被添加到具有最低“fLatency”的选定目的地的“fUpdateLatency”中。
当确定GUID探测器将行进多远时,也可使用该值。
发送这三组的每一组的时间应该基于当前的发送速度不断更新。
一个队列每次只可以是这些组的一个组的一个成员。这是重要的,否则该“fUpdateLatency”将很难计算。
该“fLatencyFromStream”以和“fUpdateLatency”同样的方式被计算,除了当在数据流中的所有节点传送它们的“fLatencyFromStream”到直接连接节点时,它们将不添加来自另外节点的“fLatencyFromStream”值。
例如,如果节点A在数据流中,并且更新具有特定队列在其中的组所花费的时间为3秒钟,它将通知所有直接连接节点距离该数据流是3秒。替代地,它可通知所有直接连接节点距离该数据流是0秒钟。
如果队列需要从高频率更新迁移到低频率更新,我们将改变其报告的“fUpdateLatency”时延数以匹配更低的频率组,但是在真正将它迁移到更低频率组前,保留高频率组中内容三个更新周期。
如果节点开始知道一个新的队列,它将该队列放到第二组限制更新中该队列属于的三组中的一组中的要更新的队列列表的末尾。
可能用途
这些是本发明可被使用的实施例。这些实施例并非想要限制本发明的用途:
1、用在通信网络中,它将能够使网络拓扑图采用无限制结构;
2、用在蜂窝电话网络中,它将消除当前“蜂窝”结构需要将一个移动蜂窝电话切断到下一通信铁塔的必要;
3、用在网格计算环境中,帮助消除过热点并处理失败节点;
4、在所有电装置中用于具有激活的软件的应用程序,这些装置可从中央命令中心被打开或关闭以实现系统负载管理;
5、用在计算中,它将使多个互连的CPU或计算机能够被链接,以便为诸如网格计算、大容量存储器或超级计算环境的应用交换消息,而这些应用目前受到灵活性缺乏、动态消息路由选择性能的限制;
6、用在军事应用中,它将使作战地区中的每个战士和每件装备能够通过不断改变的拓扑图结构处于持续通信中,并且使网络持续工作而不管正在删除、破坏或添加的元件;
7、用来形成或者以孤立形式或者作为更大型网络子集的离散的网络组,它将使任何组在任何时候形成它自己的网络;
8、用在交通管理中,它将使配备有该软件和通信能力的机动车辆能够更有效或更安全或交通管理更简易地调整它们的高速公路干扰;
9、用在交通信号的通信量管理中,它将使所有交通灯在管理运输流量中更加高效地与交通管理计算机通信以及相互通信,以及使交通信号添加到系统中或从系统删除而不需要对系统进行任何软件管理;
10、被用作“主网络”,它能成为用于一个团体或区域的通信公益设施,提供几乎是无限的容量和备份资源,因为网络中的每个参与者能够向整个网络提供链接和它的资源总和;
11、用于管理计算中心,该软件可添加或减去机器和应用并管理和监控该中心,当这么做的时候不需要人工干涉也不需要减少或停止工作;
12、用在电能量网格中,该软件可被用来集成产生、传输和消费为一体以便通过基于预先确定的标准作出决定并立即行动处理正常改变和失控事件;
13、通过在不需要人工干涉的情况下动态链接用户和远程站点用来启动远程计算;
14、通过管理和协调飞行器、空中交通和地面资源而用在航空交通控制中;
15、用于协调以及联网变化的通信技术诸如无线、陆线、卫星、计算机和飞机系统;
16、用于为实地传输货物到不同目的地创建有效路由,这样的路由可针对变化的环境,诸如交通模式改变、对路由目的地的添加或删除,而动态地被改变;
17、用作类似生物学计算的数学工具,用来解决多并发计算以便找到正确的解决方案,尤其是解决涉及许多标准的复杂问题。
本发明的上述实施方案旨在作为本发明的示例,本领域技术人员在不背离本发明范围的情况下可实现它们的变体和修改,所述范围在此由所附的权利要求单独限定。

Claims (18)

1.一种自组织网络,包括:
多个节点;
多条与所述节点的相邻节点互连的链路;
每个所述节点可操作地维持有关在所述节点的第一部分中的每个所述节点的信息,所述信息包括:
在所述第一部分中的所述节点中的另一个节点的第一标识;
对于每个第一标识,表示一个相邻节点的第二标识,该相邻节点是到达相应于所述第一标识的所述节点中的另一个节点的期望步骤;
每个所述节点可操作地维持表示一个相邻节点的第三标识,该相邻节点是发送信息请求的期望步骤,所述信息是关于不包括在所述第一部分中的所述节点的第二部分中的所述节点的信息。
2.如权利要求1所述的网络,其特征在于,所述第三标识是基于所述相邻节点中的哪个节点最频繁地出现在每个所述第二标识中来确定。
3.如权利要求1或2所述的网络,其特征在于,每个所述节点可操作地与其相邻节点交换信息。
4.如权利要求1、2和3中任一项所述的网络,其特征在于,每条链路具有一组服务特征,使得所述节点中的两个节点之间的任何一条路径具有服务特征的一个累积组。
5.如权利要求4所述的网络,其特征在于,所述信息包括所述累积组;并且与所述第二标识有关的所述期望步骤是基于哪条所述路径具有期望的服务特征累积组。
6.如权利要求4或5所述的网络,其特征在于,所述服务特征包括带宽、时延和比特误码率中的至少一个。
7.如权利要求1-6中任一项所述的网络,其特征在于,所述节点是计算机、电话机、传感器、个人数字助理中的至少一种。
8.如权利要求1-7中任一项所述的网络,其特征在于,所述链路是基于有线连接和无线连接中的至少一种。
9.如权利要求1-8中任一项所述的网络,其特征在于,网络核心在相邻节点之间被形成,所述相邻节点互相确定对方是在所述第二部分中定位所述节点的期望步骤。
10.如权利要求9所述的网络,其特征在于,每个所述节点可操作地给所述核心和其本身之间的其他节点传送指令,以维持其本身的信息。
11.如权利要求10所述的网络,其特征在于,所述信息包括一个值,对于每个所述第一标识,该值表示与所述第一标识有关的所述节点到数据标记流的距离。
12.如权利要求11所述的网络,其特征在于,与所述第一标识有关的节点以升序方式排名,该排名根据所述距离而增大,所述指令根据所述排名被传送给那些节点。
13.一种自组织网络,包括由多条链路互连的至少2,000个节点。
14.一种自组织网络,包括由多条链路互连的至少5,000个节点。
15.一种自组织网络,包括由多条链路互连的至少10,000个节点。
16.一种自组织网络,包括由多条链路互连的至少100,000个节点。
17.一种用于自组织网络中的节点,所述自组织网络具有多个其他节点和互连所述节点的相邻节点的多条链路;所述节点包括:
计算装置,可操作地维持有关在所有所述其他节点的第一部分中的每个所述其他节点的信息,所述信息包括:
在所述第一部分中的所述节点中的另一个节点的第一标识;
对于每个所述第一标识,表示一个相邻节点的第二标识,该相邻节点是到达相应于所述第一标识的所述节点中的另一个节点的期望步骤;
所述计算装置还可操作地维持表示相邻节点的第三标识,该相邻节点是发送信息请求的期望步骤,所述信息是关于不包括在所述第一部分中的所述节点的第二部分中的所述节点的信息。
18.一种用来存储一组在节点上执行的程序指令的计算机可读介质,所述节点构成部分自组织网络,所述自组织网络具有多个其他节点和互连所述节点的相邻节点的多条链路;所述程序指令用来使得所述节点中的计算装置维持有关所有所述其他节点的第一部分中的每个所述其他节点的信息,所述信息包括:
所述第一部分中的所述节点中的另一个节点的第一标识;
对于每个所述第一标识,表示一个相邻节点的第二标识,该相邻节点是到达相应于所述第一标识的所述节点的另一个节点的期望步骤;
所述程序指令,还用来使得所述计算装置维持表示一个相邻节点的第三标识,该相邻节点是发送信息请求的期望步骤,所述信息是关于不包括在所述第一部分中的所述节点的第二部分中的所述节点的信息。
CNA2005800113846A 2004-02-16 2005-02-16 网络体系结构 Pending CN1961531A (zh)

Applications Claiming Priority (8)

Application Number Priority Date Filing Date Title
CA2,457,909 2004-02-16
CA002457909A CA2457909A1 (en) 2004-02-16 2004-02-16 Method and system for self-organizing reliable, multiple path data flow transmission of data on a network
US60/544,341 2004-02-17
CA2,464,274 2004-04-20
CA2,467,063 2004-05-17
CA2,471,929 2004-06-22
CA2,476,928 2004-08-16
CA2,479,485 2004-09-20

Publications (1)

Publication Number Publication Date
CN1961531A true CN1961531A (zh) 2007-05-09

Family

ID=34865868

Family Applications (1)

Application Number Title Priority Date Filing Date
CNA2005800113846A Pending CN1961531A (zh) 2004-02-16 2005-02-16 网络体系结构

Country Status (2)

Country Link
CN (1) CN1961531A (zh)
CA (1) CA2457909A1 (zh)

Cited By (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101779520A (zh) * 2007-08-17 2010-07-14 高通股份有限公司 自组织服务提供方拓扑结构
CN101779519A (zh) * 2007-08-17 2010-07-14 高通股份有限公司 用于获取或发布与一个或多个备选自组织服务提供方相关的信息的系统和方法
CN101674631B (zh) * 2009-10-14 2011-10-05 南京邮电大学 自组织网络中基于最少信道切换的多信道路由方法
CN103039110A (zh) * 2010-06-30 2013-04-10 英特尔公司 用以使得在网状网络中合作通信成为可能的基于群体智能的方法
US8644206B2 (en) 2007-08-17 2014-02-04 Qualcomm Incorporated Ad hoc service provider configuration for broadcasting service information
US9179367B2 (en) 2009-05-26 2015-11-03 Qualcomm Incorporated Maximizing service provider utility in a heterogeneous wireless ad-hoc network
US9392445B2 (en) 2007-08-17 2016-07-12 Qualcomm Incorporated Handoff at an ad-hoc mobile service provider
CN105871636A (zh) * 2016-05-27 2016-08-17 合肥工业大学 基于最小树形图的无人机编队通信拓扑的重构方法及系统
CN109637107A (zh) * 2019-01-29 2019-04-16 北京盈拓润达电气科技有限公司 一种信息传输系统和方法
CN116095789A (zh) * 2022-11-07 2023-05-09 联桥科技有限公司 一种无线通信中的链路动态优化方法
CN116610533A (zh) * 2023-07-17 2023-08-18 江苏挚诺信息科技有限公司 分布式数据中心运维管理方法及系统

Cited By (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9398453B2 (en) 2007-08-17 2016-07-19 Qualcomm Incorporated Ad hoc service provider's ability to provide service for a wireless network
CN101779519A (zh) * 2007-08-17 2010-07-14 高通股份有限公司 用于获取或发布与一个或多个备选自组织服务提供方相关的信息的系统和方法
US8644206B2 (en) 2007-08-17 2014-02-04 Qualcomm Incorporated Ad hoc service provider configuration for broadcasting service information
US9392445B2 (en) 2007-08-17 2016-07-12 Qualcomm Incorporated Handoff at an ad-hoc mobile service provider
CN101779520A (zh) * 2007-08-17 2010-07-14 高通股份有限公司 自组织服务提供方拓扑结构
US9167426B2 (en) 2007-08-17 2015-10-20 Qualcomm Incorporated Ad hoc service provider's ability to provide service for a wireless network
US9179367B2 (en) 2009-05-26 2015-11-03 Qualcomm Incorporated Maximizing service provider utility in a heterogeneous wireless ad-hoc network
CN101674631B (zh) * 2009-10-14 2011-10-05 南京邮电大学 自组织网络中基于最少信道切换的多信道路由方法
CN103039110A (zh) * 2010-06-30 2013-04-10 英特尔公司 用以使得在网状网络中合作通信成为可能的基于群体智能的方法
CN103039110B (zh) * 2010-06-30 2016-08-17 英特尔公司 用以使得在网状网络中合作通信成为可能的基于群体智能的方法
CN105871636A (zh) * 2016-05-27 2016-08-17 合肥工业大学 基于最小树形图的无人机编队通信拓扑的重构方法及系统
CN109637107A (zh) * 2019-01-29 2019-04-16 北京盈拓润达电气科技有限公司 一种信息传输系统和方法
CN116095789A (zh) * 2022-11-07 2023-05-09 联桥科技有限公司 一种无线通信中的链路动态优化方法
CN116095789B (zh) * 2022-11-07 2023-12-26 联桥科技有限公司 一种无线通信中的链路动态优化方法
CN116610533A (zh) * 2023-07-17 2023-08-18 江苏挚诺信息科技有限公司 分布式数据中心运维管理方法及系统
CN116610533B (zh) * 2023-07-17 2023-09-26 江苏挚诺信息科技有限公司 分布式数据中心运维管理方法及系统

Also Published As

Publication number Publication date
CA2457909A1 (en) 2005-08-16

Similar Documents

Publication Publication Date Title
CN1961531A (zh) 网络体系结构
CN1160915C (zh) 用于在互联网路由提供商之间互连的专用网络接入点路由器
CN100336352C (zh) 内容发布系统、描述数据发布设备和内容发布方法
CN1762123A (zh) 使未采用集中管理的匿名非信任方之间的通信和资源共享安全的方法与装置
CN1496632A (zh) 用在扩展局域网中的以优先级为基础的负载平衡方法和设备
CN1679279A (zh) 网络系统、生成树构成方法、生成树构成节点和生成树构成程序
CN1795646A (zh) 数据通信系统、通信装置及其通信程序
CN1799228A (zh) 数据联网
CN1479988A (zh) 通信格网
CN1685672A (zh) 通信控制方法及系统,数据包转发及监测方法和系统
CN101047638A (zh) Mesh网路由方法和装置
CN1428033A (zh) 语义信息网络
CN1910870A (zh) 负载分散方法、节点和控制程序
CN1846419A (zh) 自管理媒介信息流
CN1647455A (zh) 在多群集网络中进行通信的方法、连接设备及网桥
CN1222902C (zh) 通信网中的方法和设备
CN1750543A (zh) 服务器负载平衡系统、装置以及内容管理装置
CN1756189A (zh) 基于snmp的ip网络拓扑发现方法
CN1770776A (zh) 传送设备及其控制方法、分布式处理系统、程序和记录介质
CN1579070A (zh) 一种多媒体通信的方法、系统和数据结构
CN1649341A (zh) 应用路由选择协议的堆叠式路由器
CN1881825A (zh) 通信系统
CN1499794A (zh) 通信设备中在第三层处理数据包的方法
CN1209240A (zh) 形成路由信息的方法
CN1764160A (zh) 移动通信系统,路由器,移动节点和移动通信方法

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication