Kademlia , Serverless network(无服务器网络)。 一个点对点(P2P)的<键, 值>元组存储和查询系统。 Kademlia使用平行的,异步的查询请求来避免节点失效所带来的超时时延。通过节点记录相互的存在的算法可以抵抗某些基本的拒绝服务(DoS)攻击。每个参与的机器都拥有一个节点ID, 160位的键。一个基于节点ID的路由算法使得任何人可以在一个目的键附近定位到一个服务器。
Kademlia的许多的优点都是得益于它使用了一个很新颖的方法, 那就是用节点间的键作异或运算的结果来作为节点间的距离。异或运算是对称的, 允许Kademlia的参与者接收来自相同分布的并且包含在其路由表中的节点的查找请求。
当一个Kademlia节点收到来自另外一个节点的任何消息(请求的或者回复的),它将更新自己的一个K-桶,即发送节点ID对应的那个桶。
这样实现了剔除最久未联系节点的策略,提供了对一定的拒绝服务(DoS)的攻击的抵抗。
Kademlia协议
Kademlia节点存储互相的联系信息,以用于路由查询消息。对于任何0 =< i < 160, 每个节点保存那些到本节点的距离为2i 到2i+1之间的节点信息列表,包括<IP地址,UDP端口, 节点ID>。我们把这些列表称为K-桶。每个K-桶中的节点按最后联系的时间排序。
Kademlia协议由4个远程过程调用(RPC)组成:PING,STORE,FIND_NODE, FIND_VALUE。
PING RPC 测试节点是否存在。
STORE指示一个节点存储一个<键,值>对以用于以后的检索。
FIND_NODE 把160位ID作为变量,RPC的接收者将返回k个它所知道的最接近目标ID的<IP地址,UDP端口,节点ID>元组。通知其他节点帮助寻找node。
FIND_VALUE和FIND_NODE行为相似――返回<IP地址,UDP端口,节点ID>元组。仅有一点是不同的,如果RPC接收者已经收到了这个键的STORE RPC,则只需要返回这个已存储的值。通知其他节点帮助寻找Value。
ed2k ID的计算方法:
我们的id是通过ip进行如下的算法计算得出的
设我们的IP = A.B.C.D
那么我们的ID number= A + 256*B + 256*256*C + 256*256*256*D
low ID的产生是由于我们的ID计算结果小于16777216.
即 ID number= A + 256*B + 256*256*C + 256*256*256*D < 16777216
kad ID的计算方法:
他更关注我们是否open和freely。事实上它的计算方法是这样
ID number=256*256*256*A+256*256*B+256*C+D
三 Gnutella协议
Gnutella2是一份关于发布检索的协议。虽然Gnutella协议也支持传统的客户端/中心服务器的检索规范,但Gnutella协议更主要是支持点对点的,没有中心的检索。在这个模型中,所有的客户端也是一个服务器,同样反之亦然。这些所谓的Gnutella客户机正常情况下执行联系服务器和客户端的任务。他们提供客户端的接口使用户可以发出查询请求和看检索结果。同事他们也接收来自其它客户机的请求,检查他们自己的数据中匹配的部分,返回可用的结果。因为具有天然的分布性,一个执行Gnutella协议的网络是具有高度容错的,比如当部分客户机离线,网络服务不会被中断。
协议定义
Gnutella协议定义客户机通过网络通讯的方式。其中包括定义了通过客户机进行数据通讯的描述符号集和内部客户机相互交互的一些规则。以下是定义的内容:
描述定义
指令 |
说明 |
Ping指令 |
用于激活发现网络上的客户机。一个客户机收到一个Ping的描述符表示希望回应一个或多个Pong描述符。 |
Pong指令 |
用于回应Ping。包括一个被连接的Gnutella客户机的地址和他能提供的数据供共享的信息。 |
Query指令 |
首要的分布式网络检索机制。一个客户机收到一个Query描述符后,如果在自己的数据集中发现一个匹配的数据将回应一个QueryHit。 |
QueryHit指令 |
用于回应Query。这个描述符提供足够的信息来获取匹配Query请求的数据。 |
Push指令 |
一个用于允许防火墙中的客户端向网络提供基于文件的数据文件的机制。 |
分布式散列表(DHT)实际上是一个由广域范围大量结点共同维护的巨大散列表。散列表被分割成不连续的块,每个结点被分配给一个属于自己的散列块,并成为这个散列块的管理者。DHT的结点既是动态的结点数量也是巨大的,因此非中心化和原子自组织成为两个设计的重要目标。通过加密散列函数,一个对象的名字或关键词被映射为128位或160位的散列值。一个采用DHT的系统内所有结点被映射到一个空间 ,如果散列函数映射一个 位的名字到一个散列值 ,则有 。
分布式散列表起源于SDDS(Scalable Distribute Data Structures)[a]研究,Gribble等实现了一个高度可扩展,容错的SDDS集群。
最近的研究集中在采用新的拓扑图构建重叠路由网络,以减少路由表容量和路由延时。这些新的拓扑关系的基本原理是在DHT表一维空间的基础上引入更多的拓扑结构图来反映底层网络的结构。
DHT类结构能够自适应结点的动态加入/退出,有着良好的可扩展性、鲁棒性、结点ID分配的均匀性和自组织能力。由于重叠网络采用了确定性拓扑结构,DHT可以提供精确的发现。只要目的结点存在于网络中DHT总能发现它,发现的准确性得到了保证,最经典的案例是Tapestry,Chord,CAN,和Pastry。
http://sinofate.blogchina.com/2592657.html
http://www.zahui.com/html/1/1910.htm Gnutella协议中文版
http://www.ppcn.net/ 中国的P2P门户网站
http://iptps05.cs.cornell.edu/IPTPS_cfp.htm P2P领域著名的国际会议
http://www.jxta.org/ Java P2P 技术网站
http://www.hpl.hp.com/techreports/2002/HPL-2002-57R1.pdf 非常经典的P2P综述文章
http://david.weekly.org/code/napster.php3 第一个P2P 软件-Napster 协议
http://www.globus.org/alliance/publications/papers/kazaa.pdf 非常著名的kaZaa软件解析
http://p2p.weblogsinc.com/ 比较著名的p2p weblog