详细描述
下面结合附图提供的详细说明旨在作为本发明的例子的描述,但是并不旨在表示可以构造或者使用本例子的仅有的形式。该描述阐述本示例的功能以及用于构造和操作本示例的步骤序列。然而,相同或等价的功能与序列可由不同的示例来完成。
本文中使用的术语“云”指的是在通信网络中可以访问对等文件分布协议并使用该协议来尝试获取诸如被分布文件的内容的特定片段的副本的多个节点。云在某些文献中还被称为图表(graph)。云中的节点使用上述协议各自与其他节点形成一个或多个当前连接。于是在节点丢弃或形成与已位于云中节点的连接时,该节点就加入或离开云。连接无需总是积极用于文件分布,虽然连接需要适用于使用特定协议进行文件分布,而这可能会使用也可能不会使用网络编码。连接可以是单向或双向连接。在本文描述的特定示例中,所有的连接都是单向的,这就使得云是不对称的,虽然本发明可适用于并包括在其中连接是双向的且单个连接同时支持上传和下载方向通信量的对称云。同样地,给定的节点同时可以是一个以上云的成员。例如,第一片云中的节点正尝试获取被分布的视频的副本而第二片云中的节点正尝试获取静止数字图像文件夹的副本。云可以相互独立,也可以部分或完全重叠。
图2是对等文件分布云10的示意图,云10包括经由互联网11或任何其他适合的通信网络连接的多个节点。云本身可以包括多得多的节点,但为了清楚仅示出了少于十个的节点。同样地,虽然并非是对等文件分布参与者也不是云的成员,但其他节点当前也可以连接在云成员之间或直接与其相连接,且上述节点未示出。
在云10中提供了一个或多个种子节点12。种子节点是内容(也可称之为文件)起源于其中的节点。例如,假设一个公司有一个想公开分布给云成员的产品演示视频。可以将该文件放在种子节点上。该种子节点通常“总是在工作”,这就使得内容文件在相当长的时段(不包括例如维护时段等)内可以从其上传。通常情况下,种子节点积极上传内容,但不下载内容。云中仅有有限且相对较小数量的节点能够同时从该种子节点中下载内容。种子节点可以使用也可以不 使用对等文件共享协议来将内容上传至云中的其他成员。然而,上述其他成员接着使用对等文件分布协议与云成员共享内容或内容的各部分。于是,其他云成员在它们允许从其自己上传内容的时段内可以有效地充当种子节点,但在此期间并不积极地下载内容。在某些情况下,一旦内容从种子节点12传送至云10中,种子12就可以下线而云10将仍然起作用。
在云10中提供了一个或多个跟踪者节点14。跟踪者节点14具有关于云成员的信息(诸如一对等体是否正参与该云)以及任何要共享的信息。这一跟踪者节点帮助云成员找出具有其所需内容的其他云成员。
在云中还存在多个对等体节点16、19,它们也被称为客户机。对等体节点是需要在云中分布的内容并且可以或者也可以不共享其已经获取的内容各部分的节点。对等体节点如上所述可以充当临时种子。在图1所示的示例中,对等体节点16位于诸如互联网的公网中,而对等体节点19则位于防火墙和/或网络地址翻译器(NAT)18后的专用企业网或家庭网中。
本文中使用的术语“吸血鬼(leech)”指的是只下载但不上传内容的对等体;吸血鬼是从系统中获取但给予很少或者根本不给予回报的寄生虫。例如,吸血鬼可以是频繁下载内容但只给其他对等体节点提供很少或者根本不提供上传容量的节点。
术语“孤独者(loner)”用于指代寻求加入对等内容分布云但尚未找到对云中对等体的最小连接数量的单独节点。
我们将我们的对等文件分布技术的全部目的指定为能让所有(或者大多数)的云成员在最短的可能时间内获取分布文件的完整副本。在某些情况下,我们还力图减少种子节点或始发服务器需要为待分布内容提供的上传次数。
考虑到这些目标,我们创建了一种拓扑管理过程,其中涉及在某些情况下移除或“拆除(tear down)”各节点之间的连接以尝试用更为优化的节点来代替这些连接。为此目的,我们创建了要在对等体节点上实现的多个条件和规则。这在我们与本申请共同提交的题为“在对等内容分布云中的连接管理(Connection management in peer-to-peer content distribution clouds)”的待决欧洲专利申请中有所描述。例如,在一指定时段之后拆除空闲连接。为了避免拆除目前空闲但很快将生成有用内容的连接,我们设计了用于云中连接的‘通知’ 状态。
通知状态在对等体请求经连接下载但远程对等体没有可用内容提供的情况下出现。它也会在对等体请求来自跟踪者的信息但是跟踪者没有新对等体信息可提供的情况下出现。我们开发了一种用于在对等消息收发协议中实现这一通知状态的方法,该方法将参考图4在如下更详细地描述。
我们还开发了一种用于适合在对等内容分布协议中使用的消息的可扩展数据结构。我们的对等内容分布协议被设计为经任何合适的基于分组的且能够保证有序传递的通信协议(诸如TCP)来进行操作。于是就能经保证数据的完整、正确排序传递的传送来发送各通信分组。这样就无需保证碎片和拼接的详细资料。
数据的每个分组在开始处都具有长度字段,以便允许从包括分组部分或多个分组的数据流中轻易地分离各分组。
每个分组还包括多个净荷。这些净荷是允许协议扩展的分组的逻辑分部。净荷顺序存储在无填充的分组中。每个净荷包括长度和类型,连同支持该类型的数据。可能会出现没有针对一特定净荷类型的实际数据的情况。
每条消息都由多个消息元素构成,而消息元素是净荷形式的。图3示出了消息是如何以此方式来构成的。消息本身30包括两个或多个消息元素32,每个消息元素各自存储在分组31的净荷内,该分组的部分在图3中示出。消息元素的唯一标识符存储在PayloadType(净荷类型)字段内。消息元素可以包含标志字段33,虽然不是必须的。
现在给出我们已经开发并选择用于我们的对等内容分布协议的消息元素的示例:
ELEMENT_HEADER(元素_首部)-这是存在于所有消息上的第一消息元素。在某些情况下它可以是仅有的元素。
ELEMENT_ACK(元素_确认)-被肯定确认的消息的详细信息。
ELEMENT_NAK(元素_否定确认)-被否定确认的消息的详细信息。例如,这些详细信息包括被拒绝的消息类型以及指示为什么会拒绝该消息的原因的代码。
ELEMENT_CONNECTIONREQUEST(元素_连接请求)-作出的连接 请求的详细信息。这包括例如,有关要使用的协议版本的信息、是否可用的协议任选项、客户机应用程序的详细信息以及有关连接类型的信息。例如,连接是与跟踪者还是与对等体,是上传还是下载连接,以及被分布内容的标识详细信息。
ELEMENT_DATASTATUS(元素_数据状态)-有关对等体当前状态的详细信息。它包含了有关内容接收的状态以及连接会话性能的信息。例如,保持、发送和接收到的块数量以及块接收或发送的速率。在某些情况下,还可利用有关对等体是否具有足够的块来解码原始内容文件以及对等体是否已完全解码该原始内容文件的信息。
ELEMENT_CONTENTREQUEST(元素_内容请求)-有关内容请求的详细信息。
这一消息元素包括标志字段,该字段是带有一些位的位屏蔽,例如这些位具有下列含义:
·NOTIFY_ON_NO_CONTENT(无内容通知)-如果没有内容变得可用,则将置位该位以使得在有新内容可用时将后续通知发送至发送节点。
·DESIRED_CONTENT_PRESENT(期望的内容存在)-已经提供服务器希望的内容描述。这是中断块恢复系统的一部分。如果该位被置位,则将以下项附至该元素。这与CURRENT_CONTENT_PRESENT互斥。
·CURRENT_CONTENT_PRESENT(当前内容存在)-已被提供的当前位于服务器内的内容列表。这与DESIRED_CONTENT_PRESENT互斥。
ELEMENT_ENDPOINTLIST(元素_端点列表)-端点结构列表。
ELEMENT_FILEIDENTIFICATION(元素_文件标识)-内容文件的标识。
ELEMENT_FILEINFORMATION(元素_文件信息)-要下载文件的详细信息。
ELEMENT_ENDPOINT(元素_端点)-端点结构。
ELEMENT_CONTENTOFFER(元素_内容供应)-对等体供应内容的详细信息。
ELEMENT_BLOCKREQUEST(元素_块请求)-服务器希望接收的在前提供的内容块的详细信息。注意块可以根据使用的编码方法而被不同地指定。
块的传输可以从块内的给定偏移量开始并继续到块的末尾。
ELEMENT_BLOCKDATA(元素_块数据)-在前请求的块的碎片。
ELEMENT_NOTIFICATION(元素_通知)-有关通知事件的详细信息。例如,这包括指示以下各通知类型的代码:
·CLOSING_AS_DOWNLOAD_COMPLETE(因下载完成关闭)-该连接正被关闭,因为下载已完成并且该对等体不再需要能够请求块。
·CLOSING_AS_TOO_SLOW(因太慢关闭)-该连接正被关闭,因为认为继续使用速度太慢。
·CLOSING_AS_DEAD(因停用关闭)-该连接正被关闭,因为看上去已停用。
·CLOSING_AS_CONTENT_DIFFERENT(因内容不同关闭)-该连接正被关闭,因为提供的内容与在前下载的内容不同。
·CLOSING_AS_BEHAVIOUR_SUSPICIOUS(因行为可疑关闭)-该连接正被关闭,因为对等体近来行为可疑。
·NEW_CONTENT(新内容)-服务器上现有新内容。
·NEW_PEER(新对等体)-新对等体已到达跟踪者处。
·CLOSING_AS_BARRED(因禁止关闭)-该连接正被关闭,因为节点现被禁止。
ELEMENT_PEERGUID(元素_对等体GUID)-描述单个对等体的简单guid。GUID是标识特定组件(在此是对等体)的全局唯一标识符。
ELEMENT_PEERLISTREQUEST(元素_对等体列表请求)-对等体列表请求的详细信息。这一消息元素包括标志,该标志是带有一些位的位屏蔽,这些位具有下列含义:
·NOTIFY_ON_NO_PEERS(无对等体通知)-如果没有新对等体 可用,则将置位该位以使得在有新对等体信息可用时将后续通知发送至发送节点。
FILEHASH(文件散列)结构-已经作为文件内容散列结果创建的HASH(散列)结构。
IDENTHASH(标识散列)结构-已经作为文件内容散列结果创建连同其文件名和创建日期/时间的HASH结构。
HASH结构-包括给定数据片段的散列值。
ENDPOINT(端点)结构-网络上节点的网络名和属性。
URILIST(URI列表)结构-URI列表。
URI结构-指定文本形式的唯一网络资源位置。
GUID结构-表示由Windows操作系统提供的guid的字节序列。
HOMOMORPHICHASH(同态散列)结构-同态散列值,它带有一系列分别针对内容中各块的种子值的系数值。
ENCODEDCONTENTOFFER(编码的内容供应)结构-描述内容供应。它包含正被描述的块数量的计数,以及针对每个块的编码系数。
CONTENTBLOCKID(内容块ID)结构-取决于编码方法的块的规格。
DATAENCODINGTYPE(数据编码类型)-使用的原始编码机制的枚举。存储为一字节。
DISTRIBUTIONENCODING TYPE(分布编码类型)-在分布中使用的编码类型的枚举。存储为一BYTE(字节)。它描述了在内容在云中分布时该内容在哪里被编码。
如上所述,我们开发了一种现将参考图4描述的用于在对等消息收发协议中实现通知状态的方法。描述了一种形成分组用以在对等内容分布云中的各节点之间发送的方法。从一组指定的消息元素中选择多个消息元素(见图4的框40)。每个消息元素存储在分组中相应的净荷内(见图4的框41)。在至少一个消息元素中设置标志字段(见图4的框42)以指示发送分组的该节点被安排用于在指定事件发生时将后续通知发送至目的地节点。
在一个示例中,一个节点是跟踪者而另一个是对等体。设置标志字段以指示在跟踪者处有新对等体信息可用时发起从跟踪者到对等体的通知。
在另一示例中,两个节点都是对等体节点,一个是客户机另一个是服务器。设置标志字段以在服务器处有新内容可用时发起从服务器到客户机的通知。
如上参考图3所述,消息由一系列消息元素组成并被存储在净荷结构中。现给出我们已经选择并开发以供我们的协议使用的消息示例:
MESSAGE_ACK(消息_确认)-消息接收的肯定确认。该消息由接收客户机作为消息已经被成功接收并接受的证实而发送给发送客户机。
不存在对该消息的响应。
MESSAGE_NAK(消息_否定确认)-消息接收的否定确认。该消息由接收客户机作为消息已被成功接收的通知来发送;但其接受有问题。
不存在对该消息的响应,虽然连接可以作为消息拒绝的结果而被关闭。
MESSAGE_NOTIFICATION(消息_通知)-由连接任一端发送的专门通知消息。
不存在对该消息的响应。
MESSAGE_CONNECTIONREQUEST(消息_内容请求)-两客户机之间连接的初始消息。该消息由始发节点发送以建立与接收节点的连接。
该消息的接收器可以发送如下响应:
·ACK(MESSAGE_CONNECTIONREQUEST)(确认(消息_连接请求))-接受连接。
·NAK(CONNECTIONREQUEST)(否定确认(连接请求))-连接拒绝,带原因代码TOO_MANY_CONNECTIONS(太多连接)、UNSUPPORTED_PROTOCOL(不受支持的协议)、NOT_INITIALISED(未被初始化)、BUSY(忙碌)、DUPLICATE_ENDPOINT(重复端点)、CONTENTID_NOT_PROVIDED(未提供内容ID)、CONTENTID_DIFFERENT(内容ID不同)。
MESSAGE_INACTIVITY(消息_不活动)-由节点在其已经检测到连接上一段时间的不活动时发送。它用于检查连接的另一端是否仍然连通且活动。接收节点应该立即返回确认。这条消息可以在连接已建立之后的任何时刻发送。如果服务器在指定时间内未接收到确认,则可认为该连接已经停用(或者由于连接或者由于接收节点),并且该连接被关闭。
该消息的接收器必须发送如下响应:
·ACK(MESSAGE_INACTIVITY)(确认(消息_不活动))-不活动已被证实。
MESSAGE_PEERREGISTER(消息_对等体登记)-这条消息被发送给跟踪者以标识服务器希望被认为是对等体。
发送给跟踪者节点以更新跟踪者关于传输如何进行的描述。有规律地发送该条消息,以便提醒跟踪者该节点仍然活动,并且还允许关于节点进行的信息更新到至今。该信息可由跟踪者用来宣称节点应该使用哪些对等体。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_PEERREGISTER)(否定确认(消息_对等体登记))-拒绝,带原因代码BUSY、DUPLICATE_ENDPOINT。
·ACK(MESSAGE_PEERREGISTER)(确认(消息_对等体登记))-接受登记。
MESSAGE_PEERDEREGISTER(消息_对等体撤销登记)-这条消息被发送给跟踪者节点以标识服务器不再希望被认为是对等体。这在对等体关机时使用以降低跟踪者负载。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_PEERDEREGISTER)(否定确认(消息_对等体撤销登记))-拒绝,带有原因代码BUSY、UNKNOWN_ENDPOINT(未知_端点)。
·ACK(MESSAGE_PEERDEREGISTER)(确认(消息_对等体登记))-接受撤销登记。
MESSAGE_PEERLISTREQUEST(消息_对等体列表请求)-这条消息被发送给跟踪者节点以请求提供内容的对等体列表。PeerListRequest.Count(对等体列表请求.计数)包含要提供的对等体的数量。可以指定必须大于0的对等体最大数量。提供一标志以允许在万一没有对等体返回时触发一通知。如果该标志被设置并且没有内容要返回,就用原因代码NOTIFICATION_PENDING(未决通知)拒绝该消息。当新内容到达时,则发送一通知以重新开始该请求循环。如果该标志未设置并且没有合适的对等体,就用原因代码NO_PEER(无对等 体)拒绝该消息。
跟踪者将返回尽可能多的对等体直至请求的最大数量,但是返回的数量可能会更少。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_PEERLISTREQUEST)(否定确认(消息_对等体列表请求))-拒绝,带原因代码BUSY、NO_PEER、NOTIFICATION_PENDING。
·MESSAGE_PEERLISTRESPONSE(消息_对等体列表响应)-要使用的对等体列表。
MESSAGE_PEERLISTRESPONSE(消息_对等体列表响应)-这条消息由跟踪者发送给已经请求为其提供内容的对等体列表的对等体。返回的对等体数量有可能少于请求的数量。
跟踪者在某些情况下可能返回一个对等体都未列出的响应。
不存在对该消息的响应。
MESSAGE_FILEREQUEST(消息_文件请求)-这条消息被发送给跟踪者以请求有关跟踪者正提供支持的内容的详细信息。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_FILEREQUEST)(否定确认(消息_文件请求))-拒绝,带原因代码BUSY、NO_CONTENT(无内容)、NO_CONTENT_PLEASE_SUPPLY(无内容请提供)。
·MESSAGE_FILERESPONSE(消息_文件响应)-正提供内容的详细信息。
MESSAGE_FILERESPONSE-这条消息由跟踪者响应于MESSAGE_FILEREQUEST发送。它包含有关跟踪者正提供支持的文件的详细信息。
不存在对该消息的响应。
MESSAGE_CONTENTREQUEST(消息_内容请求)-这条消息由节点发送给对等体以请求内容供应。
提供一标志以允许在万一没有合适内容返回时触发一通知。如果该标志被 设置并且没有内容要返回,则该消息是带原因代码NOTIFICATION_PENDING的NAK′d。当新内容到达时,则发送一通知以重新开始该请求循环。如果该标志未设置并且没有合适内容,则该消息是带原因代码NO_CONTENT(无内容)的NAK′d。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_CONTENTREQUEST)(否定确认(消息_内容请求))-拒绝,带有原因代码BUSY、NO_CONTENT、NOTIFICATION_PENDING。
·MESSAGE_CONTENTRESPONSE(消息_内容响应)-正供应内容的详细信息。
MESSAGE_CONTENTRESPONSE-这条消息由对等体响应于MESSAGE_CONTENTREQUEST消息发送。它包含对等体准备传送的内容供应的详细信息。
不存在对该消息的显式响应。在响应中给出的数据有可能出于各种原因与请求的对等体不兼容。在此情况下,调用对等体应该终止该连接并将这个对等体列入黑名单。
MESSAGE_BLOCKREQUEST(消息_块请求)-这条消息被发送给在前请求供应内容的对等体。
该消息的接收器可以发送如下响应:
·NAK(MESSAGE_BLOCKREQUEST)(否定确认(消息_块请求))-拒绝,带原因代码BUSY、INVALID_BLOCKID(无效块ID)、MISMATCHED_ENCODING(编码不匹配)。
·MESSAGE_BLOCKDATA(消息_块数据)-被请求块的实际数据。
MESSAGE_BLOCKDATA-这条消息被发送给在前请求块数据的对等体。
不存在对该消息的响应。
在一个优选实施例中,“通知”状态与内容请求/响应循环一起使用。内容请求和响应允许对等体估计相邻对等体处可用的内容。内容响应包括由相邻 对等体供应的内容。如果请求节点估计供应的内容不是新颖的,就可以作出新的内容请求,而这次的内容请求是在所收到供应的基础上修改的。然而,这不是必须的。内容请求没有必要包含指示请求者不喜欢有关最近的内容供应的具体内容的任何新数据。重复这种循环类型直到请求的内容被供应或者直到相邻节点不再能找出潜在内容。
图5是用于内容请求/响应循环的消息时序图。请求内容的对等体节点(在此示例中称为客户机50)被表示为垂直线。相邻节点(在此示例中称为服务器51)也由垂直线表示。垂直线之间的箭头表示在节点50和51之间发送的消息,而箭头的方向指示消息的方向。时间由页面上的高度表示,其中离页面底部最近的箭头在时间上是最新的。
客户机50首先发送内容请求消息52给服务器。服务器51生成潜在内容列表并在内容响应消息53中将供应内容的详细信息发送回客户机50。这一内容响应信息不包括全部的供应内容本身,而仅包括应该有关该内容的信息。
如果客户机50估计该内容不是新的,也就是说它不请求该内容因为它已经有了该内容,则客户机就将新内容请求消息54发送给服务器51。该内容请求消息54是在收到的内容响应53的基础上修改的。例如,第二内容请求消息54包括沿着线的“我不想要你之前供应的内容,你还有任何不同的内容吗?”的信息。服务器51生成新的潜在内容列表并在给客户机的第二内容响应消息55中发送其详细信息。这次客户机50想要供应的内容。它发送详细说明所请求的供应块的块请求信息56给服务器。见消息57,请求的块随后被发送给客户机50。
应该注意到图5中的方法步骤54和55不是必须的。在我们的文件分布协议的一些版本中,几乎确保内容响应消息53在服务器具有新内容供应的情况下提供新内容供应。
向编码的内容响应提供唯一的标识符诸如guid或其他标识符,从而可以在块请求消息中引用该唯一标识符来减小消息大小。跟踪提供对等体处的内容供应以减少重复的供应。
假若客户机请求并接收内容供应,则所有供应的新块都被请求并下载。作出检查以在与多个对等体谈话时移除重复块请求。
在内容请求/响应循环期间,服务器有可能无法找出潜在内容。在此情况下,内容请求消息是NAK′d。
在此情况下,标志位存在于内容请求中以确定服务器的行为。假若NOTIFY_ON_NO_CONTENT标志没被置位,则内容请求消息是带原因NO_CONTENT的NAK′d。客户机可以在一段时间之后重新尝试请求以查看现在内容是否可用。假若标志位没被置位,则内容请求消息是带原因NOTIFICATION_PENDING的NAK′d。当新内容由服务器接收时,它将带通知类型NEW_CONTENT(新内容)的通知消息发送给客户机,以便在无需通信开销的情况下允许客户机重新开始内容请求/响应循环。
本领域的技术人员将认识到用于存储程序指令的存储设备可分布在网络上。例如,远程计算机可存储描述为软件的该过程的示例。本地或终端计算机可访问远程计算机并下载该软件的一部分或全部以运行该程序。可替换地,本地计算机可按需下载软件的片断,或者可以在本地终端上执行一些软件指令而在远程计算机(或计算机网络)上执行一些软件指令。本领域的技术人员将认识到,通过使用本领域技术人员已知的常规技术,软件指令的全部或部分可由专用电路如DSP、可编程逻辑阵列等来执行。
如对于本领域的技术人员而言,显然此处给出的任何范围或者设备值可以被扩展或者改变而不失去所寻求的效果。
文本中描述的各方法步骤可以在需要时按任何合适的次序或同时执行。
可以理解,上面对于较佳实施例的描述仅仅是作为例子给出的,而本领域的技术人员可以做出多种改变。