p2p - KronosDamocles/emule_cn GitHub Wiki
P2P文件分享
提要
P2P共享的概念,发展的两个阶段,DHT的原理,DHT骨干节点。
基本概念
Peer to peer file sharing,字面意思就是用户互相分享。 分享的对象未必是文件,只是文件占了绝大多数应用场景。 这一分享方式与传统的 服务器-客户端 模式有本质不同: 分享的文件不来自于服务器。
发展阶段
在P2P分享模式发展的第一阶段,仍然依赖于服务器提供索引功能。 比如电驴服务器,提供两种索引:文件名的关键字到文件hash的对应关系;文件hash到供档者 IP地址:端口 的对应关系。 BT服务器,只提供上述第二种索引。这是BT与电驴的根本区别。
在P2P分享模式发展的第二阶段,对中心化服务器的依赖被彻底移除,服务器的功能由全体用户分担。 这种模式学术上称为 Distributed Hash Table, 即 DHT. 电骡对这种模式的实现被取名为 Kademlia (论文链接)。 BT就干脆直接借用了它的学术名 DHT,为避免概念混淆,下文称之为 BT-DHT. 电骡的Kad与BT-DHT原理相同,只是实现方式不同。
P2P分享模式现已发展到了第三阶段,即基于虚拟路由的匿名共享。例如: ipfs, freenet, kmule+i2p 等。 此类分享工具使用有一定门槛,用户基数太小。它们不在本社区关注范围内。
DHT基本原理
DHT是一张由全体用户组织成的网格,每个用户都是网格里的一个节点。 每个节点有独特的ID,并直接连接若干个节点。每个节点都分担了一部分索引工作。 基本的索引有三个:
- 节点ID -> 节点IP:Port 的索引
- 文件hash -> 供档节点ID 的索引
- 关键字 -> 文件hash 的索引
当某个节点要查找某个文件hash的供档者时,它先检索自己的索引,如果没找到,就询问自己直连的节点, 被询问的节点也执行类似的操作,使检索行为在网格中逐渐扩散,直到得到结果(找到或失败)。 当文件hash与节点ID之间有固定的对应关系时,检索的扩散就具有明确方向了, 它会向 文件hash 与 节点ID 对应最紧密的方向递归检索,效率比广播式查找大大提高。 这一对应关系的最简单的形式,就是 hash = 节点ID。
DHT骨干节点
在DHT里,有固定IP地址并且长时间在线的节点是非常重要的,它们有求必应,是节点间联系的枢纽,是P2P分享中执行检索操作的桥梁。 即使是低配的云主机,512M内存加几个G的月流量,不共享任何文件,只需开着电骡和BT,就足够承担索引的任务,对DHT的生态起到关键作用。 家用电脑和宽带网络,即使容量高,带宽大,由于IP地址变动会导致索引的变化,它们对DHT的贡献并不大。