交叉往返消除协议
背景
诸如联网计算机等分布式系统可能需要在通信期间知道彼此的状态。这通常要求两个系统循序而非同时进行通信。如果两个系统同时(即非循序)相互发送消息从而导致交叉往返的消息,则可形成竞争情况,其可导致有分歧的且被破坏的状态信息。
概述
下面提供本发明的简要概述以便向读者提供基本的理解。本概述不是本发明的详尽概观,并且既不标识本发明的关键/重要元素,也不描绘本发明的范围。其唯一目的是以简化形式提供在此公开一些概念作为稍后提供的更详细描述的序言。
本发明的示例提供了用于避免通信节点之间的消息竞争或交叉往返(crisscross)的有序消息传递的技术。例如,如果节点A向节点B发送消息3,并且此后不久节点B向节点A发送消息X,则节点A想要知道消息X是否反映节点B在接收消息3之后的状态。如果节点B在发送消息X之前接收到消息3,则可在节点之间维护适当的状态。但是如果消息3和X是交叉往返的,或者如果节点B从未适当地接收到消息3,则节点之间的状态可能被破坏。提供了用于避免这样的破坏的技术、系统和方法。
许多附带特征将随着参考下面的详细描述并结合附图进行理解而得到更好的认识。
附图描述
结合附图考虑以下详细描述,将更好地理解本说明书,在附图中:
图1是示出通信地耦合的两个示例启用交叉往返消除协议的节点的框图。
图2是示出包括示例交叉往返消除协议(“C3P”)首部的示例C3P消息的框图。
图3是示出示例交叉往返消除协议状态图的框图。
图4是示出用于初始化交叉往返消除协议实例并发送消息的示例方法的框图。
图5是示出用于处理交叉往返消除协议消息并检测消息交叉往返的示例方法的框图。
图6是示出两个示例节点之间的有序消息传输的示例的时序图。
图7是示出用于在处于竞争调整(fix)状态时处理交叉往返消除协议消息的示例方法的框图。
图8是示出消息交叉往返的示例以及后续恢复的时序图,其是图6的时序图的扩展。
图9是示出其中可以实现此处所描述的技术的示例计算环境的框图。
附图中使用相同的附图标记来指代相同的部分。
详细描述
下面结合附图所提供的详细描述旨在作为对本发明各示例的描述,而非表示用于构造或利用本发明各示例的唯一形式。本说明书阐明各示例的功能和/或用于构造和操作各示例的步骤序列的至少某一些。然而,相同或等效的功能与序列可由不同的示例来实现。
虽然在本文中将本发明的示例描述并示出为在计算和联网环境中实现,但是所描述的系统只是作为示例而非限制来提供。本领域的技术人员将会认识到,本发明的示例适于在各种不同类型的计算和联网环境和系统中应用。
图1是示出通信地耦合的两个示例启用交叉往返消除协议的节点的框图。节点A和节点B如线190所示地耦合,该耦合可以是任何类型的耦合、连接、通信链路、网络等。每一个节点都包括诸如应用程序110a和110b等示例应用程序,该示例应用程序可以是可从交叉往返消除协议受益的任何程序、系统、设备、软件、设备驱动程序、固件等。应用程序110a和110b可以相同或不相同。应用程序110a和110b通常经由交叉往返消除协议(“C3P”)层,诸如C3P 120a和120b来发送和接收消息。交叉往返消除协议经由诸如变量121a-124a的状态变量来维护适当的状态信息。交叉往返消除协议通常利用诸如传送器(transport)130a和130b的传送器来通过某种形式的通信链路发送和接收C3P消息。
状态字段或变量通常维护C3P的状态。每一C3P模块或C3P实例包括:计数值,诸如计数值状态变量121a和121b;现时值(nonce),诸如现时值状态变量122a和122b;远程计数值,诸如远程计数值状态变量123a和123b;以及远程现时值,诸如远程现时值状态变量124a和124b。在一个示例中,这些状态变量中的每一个都是64位数字。
现时值状态变量(即,122a)通常唯一地标识当前C3P会话。C3P会话通常在初始化C3P层时建立。通常在每一次启用C3P的节点需要与新的启用C3P的节点(例如,先前未与其通信的节点)通信时建立C3P层的新实例。一般而言,每一次初始化C3P层时,生成新现时值。
远程现时值状态变量(即,124a)通常用于记录由上一次从远程节点接收到的有效C3P消息的首部指示的远程节点(即,该远程节点的C3P层)的现时值。
如此处所使用的,术语“现时值”指的是密码随机现时值,即,不太可能被重用的计数值或随机或伪随机数字。这一现时值通常由C3P用来将每一个会话与任何其他会话唯一地标识开。由此,在节点崩溃等的情况下,在下一次初始化C3P时,建立指示新的且唯一的C3P会话的新的且唯一的现时值。
计数值状态变量(即,121a)通常是每发送一个消息递增1的单调递增变量、或者标识上一次发送的消息的值。在一个示例中,每一个发送消息时递增计数值。
远程计数值状态变量(即,123a)通常用于记录由上一次从远程节点接收到的有效C3P消息的首部指示的远程节点(即,该远程节点的C3P层)的计数值。
一般而言,应用程序将要发送给另一节点的消息向下传递至C3P层,该C3P层通常添加C3P首部(如结合图1所描述的),在发送缓冲区中缓冲该消息,并且将该消息传递给传送器,该传送器通过网络将该消息发送至目标节点。每一C3P层通常在发送缓冲区中缓冲单个传出消息。
在接收到有效C3P消息后,在目标节点的传送器将该C3P消息向上传递至C3P层后将该消息存储在C3P接收缓冲区中。在一个示例中,接收缓冲区存储一个或多个传入消息。C3P层验证消息有效,移除C3P首部并且将该消息向上传递至对应的应用程序。在一个示例中,一旦应用程序完成对接收到的消息的处理,该应用程序就指示C3P层将该消息从接收缓冲区中清空。在该示例中,C3P层直到接收缓冲区为空才发送消息,因为在接收缓冲区为空之前发送消息等效于消息交叉往返,应用程序在未处理完先前接收到的消息的情况下发送新消息。
两个通信C3P层互操作以便为应用程序提供有序消息传递并且避免消息竞争或交叉往返。如此处所使用的,术语“消息竞争”或“消息交叉往返”或“交叉往返”指的是以下情形:第一节点向第二节点发送一消息,在第二节点从第一节点接收到该消息之前,第二节点向第一节点发送一消息。这样的情形导致消息交叉往返或消息竞争情况。该情形结合图8更详细地描述。
如此处所使用的,术语“节点”指可通过网络等来唯一地定址或以其他方式唯一地标识,并且可用于通过该网络与其他节点通信的任何计算机系统、设备或进程。作为示例而非限制,节点可以是个人计算机、服务器计算机、手持式或膝上型设备、图形输入板设备、多处理器系统、基于微处理器的系统、机顶盒、消费电子设备、网络PC、小型计算机、大型计算机、可唯一地标识的软件应用程序等等。具有计算机系统900的形式的诸如节点A和节点B的节点的一个示例此处在下文中参考图9来阐述。
图2是示出包括示例交叉往返消除协议(“C3P”)首部210的示例C3P消息200的框图。C3P消息200通常包括消息字段中的应用程序消息220(由应用程序提供的消息、分组、数据等)和C3P首部210。在一个示例中,C3P首部210包括以下四个字段中的状态信息:现时值211、远程现时值212、计数值213、以及远程计数值214。在该示例中,状态值是64位数字。现时值211和计数值213通常在每一次发送消息时从发送C3P的对应状态变量中取得。远程现时值212和远程计数值214通常从发送C3P的远程现时值和远程计数值状态变量中取得,这些状态变量的值通常从上一次从远程节点接收到的有效C3P消息的首部中获取。C3P查验消息是不包括应用程序消息220的C3P消息200的一个版本。
图3是示出示例交叉往返消除协议状态图300的框图。特定C3P实例通常在以下两个状态之间转换:C3P普通状态310和C3P竞争调整状态320。一旦成功初始化C3P实例,该实例通常进入C3P普通状态310。每一次发送普通(非C3P查验)C3P消息时,C3P转换回到C3P普通状态,如箭头330所示。C3P保持C3P普通状态330直到检测到C3P消息交叉往返。如果检测到C3P消息交叉往返(如结合图5所描述的),则C3P转换到C3P竞争调整状态320,如箭头340所示。C3P保持C3P竞争调整状态320直到接收到不是消息交叉往返的C3P消息。每一次接收到与另一消息交叉往返的任何C3P消息时,C3P转换回到C3P竞争调整状态320,如箭头350所示。当接收到按序C3P消息(C3P查验或确实包括应用程序消息的C3P消息)或如结合图7所描述地满足其他适当条件时,C3P转换到C3P普通状态310,如箭头360所示。
图4是示出用于初始化交叉往返消除协议实例并发送消息的示例方法400的框图。C3P初始化包括框410和420所示的步骤。在每一次主存节点启动C3P实例时执行初始化步骤。这通常包括每一次节点启动新C3P实例以便与特定新远程节点通信,以及每一次节点在C3P会话期间重启,诸如重新引导或崩溃重启。
框410指示初始化C3P的现时值状态变量,如结合图1所描述的。这通常通过生成新现时值来完成。在一个示例中,现时值作为通常不同于前一现时值的随机数字来生成。一旦初始化现时值状态变量,方法400通常在框420处继续。
框420指示初始化C3P的计数值状态变量,如结合图1所描述的。这通常通过生成新计数值来完成。在一个示例中,将计数值初始化为零(0)。一旦初始化计数值状态变量,C3P初始化通常就完成了并且方法400通常在框430处继续。
框430通常指示等待要发送的应用程序消息。一旦初始化C3P,它就等待要发送的消息。消息通常由应用程序等来提供。一旦消息可供发送,方法400通常在框440处继续。
框440通常指示递增计数值状态变量,如结合图1所描述的。该计数值状态变量可递增1或更多。一旦递增了计数值状态变量,方法400通常在框450处继续。
框450通常指示格式化并发送C3P消息。格式化通常通过向由应用程序提供的消息(参见对框430的描述)添加C3P首部来执行。C3P首部和消息通常如结合图2所描述地构建。在一个示例中,C3P消息通过将其提供传送器来发送,如结合图1所描述的。一旦发送消息,方法400通常在框430处继续。
图5是示出用于处理交叉往返消除协议消息并检测消息交叉往返的示例方法500的框图。方法500通常通过C3P实例在处于如结合图3所描述的C3P普通状态时接收C3P消息来执行。一般而言,方法500将传入消息的首部中的状态信息与存储在接收该消息的C3P实例中的状态信息进行比较,如结合图1所描述的。
框510通常指示接收C3P消息。这一消息通常包括包含状态信息的C3P首部,如结合图2所描述的。一旦接收到消息,方法500通常在框520处继续。
框520通常指示确定传入消息的首部中的现时值是否正确。在一个示例中,将传入消息的首部的现时值字段(即,图2的项目211)中的值与存储在接收C3P实例的状态信息的远程现时值字段(即,图1的项目124a)中的值进行比较。如果两个值不匹配(例如,不相等),则接收C3P实例假定发送C3P实例自从上一次接收到消息以来已经崩溃。如果两个值不匹配,则方法500通常在框530处继续。否则,方法500通常在框550处继续。
框530通常指示使接收C3P实例的状态信息无效。在一个示例中,这通过将远程状态值(即,图1的项目123a-124a)中的每一个都设为零(0)来完成。一旦已使状态信息无效,应用程序通常就知道远程C3P实例已经历崩溃,并且然后方法500通常在框540处继续。
框540通常指示将接收C3P实例的远程现时值字段(即,图1的项目124a)设为传入消息的现时值字段(即,图2的项目211)中的。一旦设置远程现时值状态值,方法500就在框550处继续。
框550通常指示确定传入消息的首部中的计数值是否正确。在一个示例中,传入消息的首部的计数值字段(即,图2的项目213)中的值在严格意义上大于存储在接收C3P实例的状态信息的远程计数值字段(即,图1的项目123a)中的值。如果传入计数值不是更大,则接收C3P实例假定他已经接收到传入消息或稍后消息。如果传入计数值不是更大,则方法500通常在框552处继续。否则,方法500通常在框560处继续。
框552通常指示丢弃传入消息,因为已经接收到该消息,或者因为已经接收到稍后消息(参见框550)。一旦丢弃传入消息,方法500通常在框510处继续。
框560通常指示将接收C3P实例的远程计数值字段(即,图1的项目123a)设为传入消息的计数值字段(即,图2的项目213)中的值。一旦设置远程计数值状态,方法500就在框570处继续。
框570通常指示确定传入消息的首部中的远程计数值和远程现时值是否正确。在一个示例中,传入消息的首部的远程计数值字段(即,图2的项目214)中的值匹配(例如,等于)存储在接收C3P实例的状态信息的计数值字段(即,图1的项目121a)中的值,并且传入消息的首部的远程现时值字段(即,图2的项目212)中的值是零或者匹配(例如,等于)存储在接收C3P实例的状态信息的现时值字段(即,图1的项目122a)中的值。如果传入远程计数值不匹配,或者如果传入远程现时值既不是零也不匹配,则接收C3P实例假定一个或多个消息已经交叉往返。如果传入远程计数值不匹配,或者如果传入远程现时值既不是零也不匹配,则方法500通常在框572处继续。否则,方法500通常在框580处继续。
框572通常指示接收C3P实例进入C3P竞争调整状态,如结合图3所描述的。进入C3P竞争调整状态通常包括丢弃传入消息。在处于C3P竞争调整状态时,处理如结合图7所描述地进行。
框580通常描述将传入消息向上传递至接收应用程序。此持,确定传入消息有效。在一个示例中,在向上传递消息之前将C3P首部从该消息中剥离。一旦传递消息,方法500通常就在框510处继续。
图6是示出两个示例节点之间的有序消息传输的示例的时序图600。箭头610是对应于节点A的时间线而箭头611是对应于节点B的时间线。状态框612示出节点A的示例初始状态而状态框613示出在时间线开始时的节点B的示例初始状态。状态框612、613等及其所包括的字段对应于结合图1所描述的状态和字段。具体而言,字段612a对应于图1的字段121a;字段612b对应于图1的字段123a;字段612c对应于图1的字段122a;而字段612d对应于图1的字段124a。各个状态字段的值只是示例并且在实践中可以是任何适当的值。通常将每一个节点初始化成结合图3所描述的C3P普通状态并且通常根据结合图5所描述的方法500来操作。在一个示例中,各状态字段支持64位值并且此处可以如以下表A和表B所示的那样初始化:
表A-节点A初始状态:
现时值 |
0x1234567812345678 |
计数值 |
0 |
远程现时值 |
0x0 |
远程计数值 |
0 |
表B-节点B初始状态:
现时值 |
0x8765432187654321 |
计数值 |
0 |
远程现时值 |
0x0 |
远程计数值 |
0 |
如作为节点A和B的初始状态的示例的表A和B所示,每一节点都知道其自己的现时值而非其他节点的现时值(如远程现时值字段中的十六进制(0x0)中所示出的初始值0所指示的)。此外,在其初始状态中,每一节点都知道其自己的计数值(如图所示,其可被初始化为0),而不是其他节点的计数值(如远程计数值字段中的初始值零(0)所指示的)。现时值字段可以用随机值来初始化。在其他示例中,可使用除了零之外的初始值和/或可知道其他节点的初始值。
时序图600示出节点B向节点A发送第一消息,如箭头和消息首部620所示。消息首部包括节点B的现时值(N=98)、节点A的现时值(RN=0,节点B当前不知道)、节点B的已递增的计数值(C=11,在发送消息620之前从状态613的C=10递增)、以及节点A的计数值(RC=0,节点B当前不知道)。状态框615指示在发送消息620之后的节点B的状态。
在接收到消息620后,节点A用来自消息620的首部的信息来更新其状态,如状态框614所示。此时,节点A知道节点B的现时值(RN=98)以及节点B的消息计数值(RC=11),并且更新状态614以指示这些值。节点A可知道消息620是来自节点B的第一消息,因为节点A的、关于节点B的状态信息(远程现时值和远程计数值)在接收到消息620时被设为初始状态(零)。
按照时序图600,节点A现在向节点B发送一消息,如箭头和消息首部630所示。该消息首部包括节点A的现时值(N=12)、节点A的已递增的计数值(C=1,在发送消息630之前从状态612的C=0递增)、节点B的现时值(RN=98,节点A经由消息620知道)、以及节点B的计数值(R=11,节点A经由消息620知道)。状态框616指示在发送消息630之后的节点A的状态。
在接收到消息630后,节点B用来自消息630的首部的信息来更新其状态,如状态框617所示。此时,节点B知道节点A的现时值(RN=12)以及节点A的消息计数值(RC=1),并且更新状态617以指示这些值。节点B可知道消息630是来自节点A的第一消息,因为节点B的、关于节点A的状态信息(远程现时值和远程计数值)在接收到消息630时被设为初始状态(零)。
按照时序图600,节点B现在向节点B发送第二消息,如箭头和消息首部640所示。该消息首部包括节点B的现时值(N=98)、节点B的已递增的计数值(C=12,在发送消息640之前从状态617的C=11递增)、节点A的现时值(RN=12,节点B经由消息630知道)、以及节点A的计数值(RC=1,节点B经由消息630知道)。状态框619指示在发送消息640之后的节点B的状态。
在接收到消息640后,节点A确定其关于节点B的状态(远程现时值和远程计数值)未被设为初始值。之后,节点A验证来自节点B的消息首部640中的现时值(N=98)匹配其状态616中的关于节点B的现时值(RN=98)。如果存在匹配,则节点A知道节点B的C2P会话自从上一次从节点B接收到消息之后尚未重置。节点A还验证来自节点B的消息首部640中的计数值(C=12)大于其状态616中的关于节点B的计数值(RC=11)。如果传入消息的计数值大于节点A的状态中的关于节点B的计数值,则节点A知道尚未接收到消息640或稍后消息。节点A还验证来自节点B的消息首部640中的远程计数值(RC=1)匹配其状态616中的关于节点A的计数值计数值(C=1)。如果存在匹配,则节点A知道节点B在从节点A接收消息630之前未发送消息640,即,不存在消息交叉往返。如果消息640的现时值和计数值有效并且不存在消息交叉往返,则节点A用来自消息640的首部的信息来更新其状态,如状态框618所示。可以在节点A和B之间以类似方式发送其他有序消息。
图7是示出用于在处于竞争调整状态时处理交叉往返消除协议消息的示例方法700的框图。方法700通常通过C3P实例在处于如结合图3所描述的C3P竞争调整状态时接收C3P消息来执行。一般而言,方法700将传入消息的首部中的状态信息与存储在接收该消息的C3P实例中的状态信息进行比较,如结合图1所描述的。
框710通常指示C3P实例接收传入C3P消息。这一传入消息可以是如结合图2所描述的C3P消息、或者如结合图2和8所描述的C3P查验消息。当这一消息到达时,通常在单个消息接收缓冲区中缓冲该消息。当一消息到达时,方法700通常在框740处继续。直到消息到达,方法700通常在框720处继续。
框720通常指示确定是否是时候发送C3P查验消息。在一个示例中,查验消息在处于C3P竞争调整状态时基于退避算法来每隔一段时间发送,诸如以50毫秒的间隔开始并对于未导致返回到C3P普通状态的每一个查验使间隔翻倍。当是时候发送查验消息时,方法700通常在框730处继续。否则,方法700在框710处继续,等待传入消息。
框730通常指示发送C3P查验消息。这通常涉及基于如结合图2所描述的当前状态信息来构造消息首部。一旦发送了查验消息,方法700通常就继续至框710。
框740通常指示确认传入消息。在一个示例中,这通过对照C3P实例的状态变量检查消息首部来完成,如结合图5的框520到570所描述的。如果传入消息的首部值中的任一个不正确,方法700通常在框742处继续。否则,方法700通常在框744处继续。
框742通常指示丢弃传入消息。一旦丢弃传入消息,方法700通常就在框710处继续。
框744通常指示基于传入消息的首部值来更新C3P实例的状态变量。在一个示例中,这通过对照C3P实例的状态变量检查消息首部来完成,如结合图5的框520到570所描述的。一旦更新状态变量,方法700通常就在框750处继续。
框750通常指示确定发送缓冲区中是否存在已缓冲消息以及传入消息是否是查验消息。如果发送缓冲区中存在已缓冲消息并且传入消息是查验消息,则方法700通常在框760处继续。否则,方法700通常在框770处继续。
框760通常指示发送发送缓冲区中的消息。一般而言,该消息是先前未发送但处于竞争调整状态的非查验消息,并且对查验消息的接收导致重新发送已缓冲消息。一旦发送了已缓冲消息,方法700通常就在框770处继续。
框770通常指示C2P实例从C3P竞争调整状态转换到C3P普通状态。一旦处于C3P普通状态,处理通常就如结合图5所描述的那样继续。
图8是示出消息交叉往返的示例以及后续恢复的时序图600b,其是图6的时序图600的扩展。箭头610b是对应于节点A的时间线箭头610的继续,而箭头611b是对应于节点B的时间线箭头611的继续。状态框812表示时间线610/610b上的与图6的状态框618相同的点。状态框813表示时间线611/611b上的与图6的状态框619相同的点。示例消息交叉往返在消息820和830之间示出。
按照时序图600b,节点A向节点B发送一消息(如箭头和消息首部820所示),但节点B在从节点A接收消息820之前向节点A发送一消息(如箭头和消息首部830所示)。这导致与有序消息收发形成对比的消息交叉往返。
在接收到消息820后,节点B检测到来自节点A的消息首部820中的远程计数值(RC=12)不匹配其状态信息815中的关于节点B的计数值的计数值(C=13)。在该示例中,这是因为消息820和830的交叉往返,即,节点A和B各自在接收另一个节点的消息之前相互发送消息,从而导致每一个节点的状态信息变得与另一个节点的状态信息不同步。类似地,在接收到消息830后,节点A检测到来自节点B的消息首部830中的远程计数值(RC=1)不匹配其状态信息814中的关于节点A的计数值的计数值(C=2),这是消息交叉往返的结果。在该示例中,交叉往返的消息820和830通常被接收节点丢弃,并且每一个节点进入如结合图3所描述的C3P竞争调整状态。
按照时序图600b,节点A然后向节点B发送C3P查验消息,如虚线箭头和消息首部840所示。C3P查验消息通常是诸如图2的C3P消息200等其中不包括应用程序消息220部分的消息。这一查验消息由此包括消息首部,诸如图2的C3P首部210,但没有应用程序消息。另选地或另外地,节点B可如同它也处于C3P竞争调整状态那样向节点A发送查验消息。查验消息通常包括当前现时值和计数值数据,由此向接收节点提供发送节点的最新状态信息。每一个这样的查验消息都向接收节点传达“轮到你发送”。
在接收到查验消息840后,节点B将传入消息的首部信息与其状态信息817进行比较,并验证该传入消息的现时值字段(N=12)匹配其远程现时值状态值(RN=12),传入消息计数值(C=3)大于其远程计数值状态值(RC=2),以及传入消息的远程计数值(RC=13)匹配其计数值状态值(C=13)。因此,节点B验证查验消息840是有效的,基于传入查验消息来更新其状态信息819,并且从C3P竞争调整状态转换到C3P普通状态。此外,节点B重新发送其发送缓冲区中的消息,即消息830,如箭头和消息首部850所示。
在接收到消息850后,节点A将传入消息的首部信息与其状态信息818进行比较并验证该消息有效。因为传入消息850有效,所以节点A从C3P竞争调整状态转换到C3P普通状态。因为消息850有效并且因为它不是C3P查验消息,所以节点A认识到必须从发送缓冲区中删除应用程序消息820(只可传递来自导致交叉往返的消息对的一个消息,并且该示例中的节点A上的已缓冲消息是必须不传递的消息)。
此时,节点A和节点B两者都已经成功地从C3P竞争调整状态转换到C3P普通状态并且有序消息通信能够继续。
也可采用用于退出竞争调整状态的替换方法。例如,处于C3P竞争调整状态的节点可以在发送指定数量的查验消息后退出该竞争调整状态。这一改变可具有延迟有序消息通信的重新开始的负面结果,但可具有节省网络资源的正面结果。作为第二示例,每一个节点可改为以已更新的计数值发送其普通消息,而不是一旦检测到交叉往返就发送C3P查验消息。这一改变可具有在发生其他消息交叉往返的情况下使用多得多的网络资源的负面结果(因为应用程序消息可能比C3P查验消息大得多),但该改变可具有在没有发生其他消息交叉往返的情况下避免额外的消息延迟的正面结果。作为第三示例,节点A和节点B之间的正在传递的现时值可通过使用类似于传输控制协议(“TCP”)中的SYN/SYN-ACK(同步/同步-确认)握手的握手来折叠成单个现时值;这可具有还原与C3P层和C3P首部相关联的状态的正面结果,但可具有在两个节点首次经由C3P通信时需要附加消息的负面结果。
图9是示出其中可以实现此处所描述的技术的示例计算环境900的框图。合适的计算环境可用多种通用或专用系统来实现。公知系统的示例可包括但不限于蜂窝电话、个人数字助理(“PDA”)、个人计算机(“PC”)、手持式或膝上型设备、基于微处理器的系统、多处理器系统、服务器、工作站、消费电子设备、机顶盒等。
计算环境900通常包括耦合到诸如外围设备902、903、904等各种组件的计算设备901形式的通用计算系统。系统900可以经由一个或多个输入/输出(“I/O”)接口912耦合到各种其它组件,如输入设备903,包括语音识别、触摸垫、按钮、键盘、和/或诸如鼠标或跟踪球等定点设备。计算设备901的组件可包括一个或多个处理器(包括中央处理单元(“CPU”)、图形处理单元(“GPU”)、微处理器(“μP”)等)907、系统存储器909、以及通常耦合各组件的系统总线908。处理器907通常处理或执行各种计算机可执行指令以控制计算设备901的操作,并且经由诸如网络连接914等各种通信连接与其它电子和/或计算设备、系统或环境(未示出)进行通信。系统总线908表示任何数量的若干类型的总线结构,包括存储器总线或存储器控制器、外围总线、串行总线、加速图形端口、使用各种总线体系结构中的任一种的处理器或局部总线等等。
系统存储器909可包括诸如随机存取存储器(“RAM”)等易失性存储器形式的和/或诸如只读存储器(“ROM”)或闪存(“FLASH”)等非易失性存储器形式的计算机可读介质。基本输入/输出系统(“BIOS”)可以存储在非易失性等中。系统存储器909通常存储数据、计算机可执行指令和/或包括计算机可执行指令的程序模块,包括可由一个或多个处理器907立即访问或目前正在其上操作的计算机可执行指令。
大容量存储设备904和910可通过耦合到系统总线来耦合到计算设备901或被结合到计算设备901中。这些大容量存储设备904和910可包括非易失性RAM;对可移动、非易失性磁盘(例如“软盘”)905进行读和/或写的磁盘驱动器;和/或对诸如CD ROM、DVD ROM 906等非易失性光盘进行读和/或写的光盘驱动器。或者,诸如硬盘910等大容量存储设备可包括不可移动存储介质。其它大容量存储设备可包括存储卡、记忆棒、磁带存储设备等。
任何数量的计算机程序、文件、数据结构等可被存储在大容量存储910、其它存储设备904、905、906以及系统存储器909(通常受可用空间限制)上,作为示例而非限制,包括操作系统、应用程序、数据文件、目录结构、计算机可执行指令等。
诸如显示设备902等输出组件或设备可通常经由诸如显示适配器911等接口耦合到计算设备901。输出设备902可以是液晶显示器(“LCD”)。其它示例输出设备可包括打印机、音频输出、语音输出、阴极射线管(“CRT”)显示器、触觉设备或其它传感输出机制等等。输出设备可以使计算设备901能够与人类操作员或其它机器、系统、计算环境等进行交互。用户可以经由诸如触摸垫、按钮、键盘、鼠标、操纵杆、游戏手柄、数据端口等任何数量的不同I/O设备903来与计算环境900进行接口。这些和其它I/O设备可以经由耦合到系统总线908的I/O接口912来耦合到处理器907,和/或可以经由诸如串行端口、游戏端口、通用串行总线(“USB”)、火线、红外(“IR”)端口等其它接口和总线结构来耦合。
计算设备901可以经由通过一个或多个蜂窝网络、无线网络、局域网(“LAN”)、广域网(“WAN”)、存储区域网络(“SAN”)、因特网、无线电链路、光学链路等到一个或多个远程计算设备的通信连接来在网络化环境中操作。计算设备901可经由网络适配器913等,或作为替换,经由调制解调器、数字用户线(“DSL”)链路、综合业务数字网(“ISDN”)链路、因特网链路、无线链路等来耦合到网络。
诸如网络连接等通信连接914通常提供到诸如网络等通信介质的耦合。通信介质通常使用诸如载波或其它传输机制等已调制数据信号来提供计算机可读以及计算机可执行指令、数据结构、文件、程序模块和其它数据。术语“已调制数据信号”指以对信号中的信息进行编码的方式设置或改变其一个或多个特征的信号。作为示例而非限制,通信介质可包括诸如有线网络或直接连线连接等有线介质,以及诸如声学、射频、红外线或其它无线通信机制等无线介质。
诸如电池或电源等电源990通常向计算环境900的部分和全部提供电力。在计算环境900是移动设备或便携式设备等的情况下,电源990可以是电池。或者,在计算环境900是台式计算机或服务器等的情况下,电源990可以是被设计成诸如经由墙上插座连接到交流(“AC”)源的电源。
某些移动设备可能不包括结合图9所描述的组合中的多个。例如,电子证件可包括线圈连同简单处理单元907等,该线圈被配置成在其靠近读卡器设备等时用作电源990。这种线圈还可被配置成用作耦合到处理单元907等的天线,该线圈天线能够在电子证件和读卡器设备之间提供某种形式的通信。这种通信可以不涉及连网,但可以替换地是经由遥测、点对点、RF、IR、音频、或其它手段的通用或专用通信。电子卡可以不包括显示器902、I/O设备903、或结合图9描述的其它组件中的多个。可能不包括结合图9所描述的组件中的多个的其它移动设备包括电子腕带、电子标签、可移植设备等。
本领域的技术人员将认识到用于提供计算机可读以及计算机可执行指令和数据的存储设备可分布在网络上。例如,远程计算机或存储设备可以存储软件应用程序和数据形式的计算机可读以及计算机可执行指令。本地计算机可以经由该网络访问远程计算机或存储设备,并下载软件应用程序或数据的部分或全部并且可执行任何计算机可执行指令。或者,本地计算机可按需下载软件或数据的片断,或者通过在本地机器执行一些指令并且在远程计算机和/或设备执行一些指令来以分布式方式处理该软件。
本领域的技术人员还将认识到,通过利用常规技术,软件的计算机可执行指令的全部或部分可由诸如数字信号处理器(“DSP”)、可编程逻辑阵列(“PLA”)、分立电路等专用电子电路来执行。术语“电子装置”可包括含有任何软件、固件等的计算设备或消费电子设备,或不含有软件、固件等的电子设备或电路。
术语“固件”通常指的是在诸如ROM等电子设备中维护的可执行指令、代码、数据、应用程序、程序等。术语“软件”通常指的是在任何形式的计算机可读介质之中或之上维护的可执行指令、代码、数据、应用程序、程序等。术语“计算机可读介质”通常指的是系统存储器、存储设备、及其相关联的介质等。
鉴于可应用所公开的本发明的原理和上述示例的许多可能的实施例,应当认识到,此处所描述的各示例仅旨在是说明性的,并且不应被认为是限制本发明的范围。因此,此处所描述的本发明构想了可落入所附权利要求书和其任何等效方案的范围内的所有这样的实施例。