暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

网络协议篇(四)P2P协议

码农的修炼之道 2019-09-20
3937


对于应用层来说,常见的协议有HTTP/HTTPs、FTP甚至目前流行的P2P协议。本文将介绍一下P2P协议相关的知识及其中的去中心化网络(DHT)的原理。同时,以太坊底层也是类似于这种P2P协议进行实现的。


1、什么是P2P协议及P2P协议优点?

    常用的下载文件协议为http或ftp底层都是使用传统的服务器-客户端模式(底层基于TCP协议)。其面临着一个比较大的缺点就是服务器带宽压力。然后P2P协议就是为了解决单一服务端带宽压力,将资源分布式存储到不同的节点上。P2P协议叫做peer-to-peer协议。当下载文件的时候,只需要和已经存在文件的peer建立连接,而不需要到中心服务器下载文件,一旦下载了文件,本机也变成了一个peer节点。由此可以想象,自己从别人那边下载文件,别人也从自己这边下载文件,这种参与的人越多,下载速度越快。

 

2、种子文件的格式与内容?

   种子文件很熟悉,就是.torrent文件。这个种子文件的目的就是要知道哪些peer节点存储了该文件,然后才能去下载。当然,远不止这么简单。一般种子文件有两大部分组成:

   Tracker URL和文件信息。先来看一下文件信息有哪些。

info区,这里一般指该种子有几个文件,文件多大,目录结构,目录名字等等。

段大小,由于BT协议把文件拆分成多个块,然后分段下载。

段哈希值,这个是为了下载完成这一块文件进行验证是否正确。


下载的时候,迅雷客户端(也可以其他BT客户端,比如迅风、电驴、快播等)首先解析种子文件得到tracker地址,然后连接中心服务器,中心服务器提供其他下载者的IP地址给迅雷,迅雷去连接其他IP地址,告诉对方自己有的块,然后交换对方没有的数据。此时不需要其他服务器参与。每次下载完成一块,就会计算哈希值并和种子文件中的哈希值对比,如果一致,则文件正确。

 

3、什么是去中心化网络DHT?

上面P2P下载过程不依赖于中心服务器,但是加入P2P网络的时候需要借助tracker服务器。假如tracker服务器挂掉了,迅雷就没法下载了。那么就提出了一种去中心化的方法,也就是DHT(Distributed Hash Table)。去中心化的目的就是每个peer对象还要存放部分网络里面文件信息和其他成员信息,这些peer节点一起构成了庞大的分布式存储服务器。比较有名的DHT协议叫Kademlia协议。


在DHT网络里,每一个DHT node都有一个ID,ID是一个长串(160bit,20字节)用于保存某些文件在哪些节点上。每个DHT node都有一个哈希值。在DHT算法规定,每一个文件计算出的Hash值相近的DHT node都有责任知道从哪里下载这个文件,即使自己没有保存该文件。

其中,每个DHT node都有两个端口,其中绑定一个TCP端口用于上传和下载文件。另一个UDP端口用于加入DHT网络。

 

4、如何维护DHT网络?

    DHT网络按照node的距离远近进行分层管理(也就是前缀二叉树)。比如某个节点ID为01010,如果另一个节点ID为01011,只有最后一位不同,则这样的节点归为“k-bucket 1”。同样,如果数第二位不同,这个ID则归属“k-bucket2”。

    随着加入的节点越来越多,每一层只能放置k个节点,这个是可以配置的。当然,每个节点的加入和退出都会动态的更新其他节点的每一层维护列表。

 

5、DHT如何查找节点?

   比如A需要查找C节点。首先通过距离算法,也就是异或得到不同的二进制位。如果是第五位不同,则去第五层的Bucket查找该节点C节点。如果自己的nodelist里面没有C,则取相似的节点B查找C节点。那么B和C节点肯定缩小一倍距离。这时候可能B只需要到bucket-4层去查找。这种就是一直二分查找算法,查找节点的复杂度为o(logN)。

 

 

6、DHT如何更新列表?

在DHT网络里,Kademlia算法有4个指令。

PING,用于测试某个节点是否在线。

STORE,要求某个节点存储一份数据。

FIND_NODE,根据节点ID查找一个节点,通过上面介绍的二分查找算法进行查找。

FIND_VALUE,根据文件的哈希值查找保存文件的节点。


每个bucket里面的节点都是按照最后一次接触的时间进行倒排,也就是排在最前的都是最近联系过的node。如果一个节点和自己接触,首先检查自己的k-bucket是否存在该节点,如果存在,则置顶一下。如果不存在,则PING一下最旧的节点,如果不能PING通,则直接删除最旧的节点,加入新节点。如果能PING通,则丢弃新节点,保留老节点。

这种机制保证了新加入和离开都不影响整体网络。

 

7、举例讲解新节点如何下载文件?

   假如此时DHT网络中已经存在了FILE文件。新加入的节点也就是某个新用户小明得到了一个种子文件,开始使用迅雷进行下载文件。


   迅雷解析了种子文件,得到了文件的哈希值,由于存储该文件或知道该文件地址的节点ID和该文件哈希值一致或相近。同时种子文件中也存在一个node list。然后迅雷会去联系其中的node list中的节点,找到最近的节点,联系上了该节点也意味着加入了这个DHT网络。(这个主要是本node使用UDP广播自己节点ID),其他节点会向该节点发送STORE进行保存与该节点ID类似的文件信息。


   然后,该节点通过联系上的节点进行层层查找,得到了FILE文件保存的节点有A。那么会联系A节点进行下载文件(通过TCP端口下载文件)。


文章转载自码农的修炼之道,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论