P2P对等网络读后笔记


作者:赵培龙 日期:2013/11/8



### p2p的研究对象




p2p的研究有人说在三个方面:

1. 实现技术
2. 通信模式
3. 网络拓扑
我认为这三方面主要就是解决2个问题:

1. 如何在p2p网络中找到相应的资源
2. 如何从找到的资源里得到资源
就是如何找和如何得到的问题的研究。

之所以分为上面的三个方面,我个人觉得,网络拓扑就主要是为寻找资源做支撑,通信模式主要是为寻找资源和得到资源做支撑,
实现技术就是讲从网络拓扑、通信模式上如何实现。




我们先从p2p的网络拓扑模式说起。




### P2P网络拓扑的分类和发展

<div class="title">

第一代P2P网络:中央集权

</div>
<div class="content">

    第一代P2P网络的代表就是大名鼎鼎的Napster了,这个牛叉的音乐共享软件,掀起了一个共享的时代,让版权商无比头疼的时代。

    第一代P2P网络的特点就是“中央集权”,这种网络有一个中央服务器,这中央服务器是在整个P2P网络中知道全网所有的资源所处的位置,
    任何一个用户想要得到某个资源只需要向中央服务器问就好了。

    这相当于我们在现实生活中使用搜索引擎达到我们查找网站的目的类似,我们向搜索引擎寻找目标网站的关键字,搜索引擎返回网站的网址,我们然后在直接访问网站。

    这是一种非常朴素的思想,也是一种非常管用而且好实现的思想。

    but 这种P2P的网络有个明显的缺点:

    那就是单点瓶颈,很明显,第一代的P2P网络是围绕中央服务器形成的一种星状网络图,只要中央服务器挂了,那么维系这个网络
    的枢纽节点就没有了,那么这个网络就失效了。

    而且在那个年代,最致命的是这种模式很容易让版权商抓到小辫子,以侵权的借口就可以用法律的手段让这个网络立马陷入瘫痪。

    由于第一代网络的这种巨大软肋,于是出现了和第一代P2P网络完全不同,完全极端的方式的第二代P2P网络。

</div>
<div class="title">

第二代P2P网络:人民战争

</div>
<div class="content">

    由于第一代网络的致命弱点,推动产生了第二代的P2P网络:

    即纯分布式的P2P网络,形象的说就是“人民战争”。
    这个网络的特点是,完全没有一个中央服务器,甚至连类似中央服务器功能的节点都没有!

    每个参与这个网络的节点功能都完全一模一样。

    每个节点都是随机的加入这个网络,
    所以可以想象,这样子的网络会是什么样的拓扑结构?完全没有拓扑,完全的随机,网络拓扑是无比的复杂。

    <div class="qustion">
        <p>那这样子的网络,他们是如何查找资源呢?

    </div>
    我们可以联想一下,你面前有100万个人,你现在需要一块钱的硬币,你怎么才能最快的从人群中借到一块钱的硬币?(假设,每个人都是乐于助人的且,不是每个人都有一块钱硬币)
    最佳的方式应该只有你去问离你最近的人,你最近的人要是没有的话,你周边的人又去问他周边的人,这样子很快这100万人都会知道你需要一块钱的硬币,
    其中有一块钱的硬币的人就会借给你。(有一个很有意思的模型,叫做小世界模型,大概的意思就是说世界很小,每个不相识的人只需要通过他认识的几个人连续介绍几次就认识了)

    从上面的那个实例里,我们可以抽象成我们的P2P网络,比如我们的P2P网络中有100万个节点,某个节点需要查找某个资源,那么这个节点只有向他周围的节点去问!
    这就是一种泛洪的思想。只要是网络是连通的,那么总会通知到有这个资源的节点。这样就解决了内容查找的问题了

    but,这也有很大的缺点。
    当这个P2P网络足够大的时候,由于每一个节点都在产生或者转发请求消息,很有可能产生网络风暴,让网络的可用性变差。
    而且还有一个问题,就是响应风暴,比如我们刚刚举得那个借一块钱的硬币的例子,若是这个100万人之中有50万人有一块钱的硬币,他们直接把硬币向你抛过来,
    那么可以想象的结果是,你被钱给砸死了!哈哈。

    同理!请求资源的节点也极有可能被热情的群众们给弄死。

    这种纯P2P网络的代表主要有Gnutella
</p>
</div>
<div class="title">

混合式P2P网络:古人云,中庸之道

</div>
<div class="content">

        前面的P2P网络都是太过于极端了,要么中央集权,要么就是纯人民路线,人民其实也是需要领导的,在这种要求下,出现了混合式的P2P网络

        即局部是集中式的,整体上还是纯分布式的。
        这样子就可以大大降低纯分布式的P2P网络的规模,原先是每个节点都为P2P的节点,如今在纯分布式P2P的网络层面上,参与者不在是单个节点了
        而是有局部的中央节点和围绕中央节点组成的大一撮节点,有点像抱团。

</div>
<div class="title">

结构化的P2P网络

</div>
<div class="content">

    从上面的介绍我们可以看出,P2P网络的一个核心就在于如何定位到资源所在何处,由于这个问题的存在,所以才有中央服务器,或者泛洪查询
    这些机制,但是这些机制都有着或多或少的缺点,我们从问题的根本上出发,发现有一种数据结构能解决类似的这种问题。
    那就是哈希表。

    哈希表的特点是:我们计算出哈希值之后就能快速的定位到哈希表了,只要是原始数据一样,那么计算出来的哈希值就是一致的,就能快速定位到
    哈希表中的相关位置,这样子查询几乎是O(1).

    在P2P网络中,我们需要的资源的内容一致,那么我们就可以计算这资源的哈希值,我们希望通过哈希值能够快速定位到拥有资源的节点上。
    于是产生了DHT(Distribution Hash Table)分布式哈希表。

    从结构上看,DHT主要分为了三个部分
  1. key值空间

        这就是一个哈希值的集合,包含了所有会出现的哈希值。2.  key值空间分割
    
        这个的主要目的是将哈希值分割成若干部分,这是由于P2P网络中的分布式特性决定的,由每一个节点管理一部分哈希值空间,在整体上只要能覆盖全整个哈希值空间就行了3.  延展网路
    我们从DHT发布一个文件名为filename且内容为value的文件举个栗子
    
  2. 计算出文件名filename的哈希值key

  3. 使用put(key,value)的方法把这个随机送到参与分布式哈希表中的任意节点上
  4. 信息在网络中传递,一直传到key被管理的节点上
  5. 然后最终的节点存储

    具体的实现可以详细看看Chord、Pastry、CAN算法
    最后附上一个连接关于一致性哈希[一致性哈希](http://blog.csdn.net/sparkliang/article/details/5279393)
    

这里文章我主要是参考了P2P对等网络原理与应用/蔡康 … [等] 编著

</div>