每日一读-如何从头开始构建类似BitTorrent的P2P网络

写在前面的话

Stay Hungry Stay Foolish!!!
每天进步一点点!!!

《每日一读》是博主每日学习的一篇文章所记录的笔记,大多数是提取文章中关键内容而成;文章类型不限,内容不限。

意义:培养自己的阅读能力,学习更多的知识

郑重声明:如果涉及到文章侵权深感抱歉,请及时联系我我会第一时间删除,谢谢!!

总结

收获:

  1. 去中心化的节点通信:很好的将现实中找人的模式来实现。
  2. 距离计算使用XOR的巧妙之处

正文

背景

三位IT大神由于对P2P网络及分布式系统感兴趣,于是就用Ruby开发了BitTorrent(BT)的系统。

ps:值得学习的精神,从事IT行业的人员不得不具备的一个元素,否则很容易被后浪给拍死

研究

P2P网络的两代网络架构:
1) 集中式系统:通过中央索引服务器来索引到所有文件信息,这里举例的是Napster

  1. 中央索引服务器:包含所有Node持有的文件信息
  2. Node节点:存储了文件信息
中心化

【缺点】

  • 中央服务器易受攻击
  • 存在单点故障的风险
  • 缺乏可扩展性

2)去中心化系统:每个Node节点充当客户端/服务端,维护自己的文件查找索引片段;Node之间可通信

典型系统:BitTorrentGnutellaFreenet

去中心化

建设

P2P网络构建的基础条件:

  • 分布式哈希表(DHT)
  • 文件切分/索引机制
  • 节点通信机制

分布式哈希表

几种分布式哈希表

这里选用的是Kademlia,原因:

  1. 普及率
  2. 最简单的远程过程调用
  3. 信息的自动传播

涉及到的概念:

  • 节点
  • 路由表
  • 桶(buckets)
  • 异或距离
  • 路由算法
  • 远程过程调用(remote procedure calls, RPC)

Kademlia

一个Kademlia由许多节点组成

1)节点信息:

  • 具有唯一的160位ID
  • 维护包含其他节点联系信息的路由表:路由表被划分为,其包含与当前节点的特定距离的节点的联系信息
    • 联系信息包含其他节点的ID、IP地址和端口号
  • 维护较大的分布式哈希表中那些自己的段
  • 通过4个远程过程调用与其他节点通信
Node节点

2)节点通信:

  • PING:探活
  • FIND NODE:需要特定节点的ID;
    • 查找过程:路由表查找,并返回一组最接近的该ID的联系节点
  • FIND VALUE:需要特定文件的ID;
    • 查找过程:从分布式哈希表段中查找,找到则返回value;否则返回最接近该文件ID的联系节点列表
  • STORE:在分布式哈希表段中存储key/value对(file_id/location),并更新彼此的联系信息

3)寻找对等点和文件
如果一个节点要从网络中检索一条信息(一个文件),其过程为:

  1. 该节点发送 FIND VALUE 的远程过程调用到它自己的联系节点子集,这些联系节点的 ID 与它要查找的文件的 ID“最为接近”。
  2. 如果任何接收节点在其分布式哈希表段中有这个 ID,则它们将返回相应的 value,
  3. 否则,它们将返回更接近所查询的 value 的节点列表。

4)距离的计算
节点之间的距离定义为节点ID的按位异或(XOR)

注:之后的运算基于4位秘钥空间的节点(只有0~15的ID是可能的)

XOR

XOR度量的一个重要特征:如果节点 ID 和当前节点的 ID 的二进制表示所共有的位相同个数越多,那么计算得到的 XOR 结果就越小。

ps:使用XOR最大的意义莫过于能更好的划分桶,使得一个桶中的ID具有连续性,联系程度越高

5)网络及路由表
Kademlia网络是由二叉树构成,其查找的时间复杂度为O(log n)

路由表:之前提到路由表被划分为,桶划分的过程:
划重点:每个桶中包含了一定距离的节点,而距离就是共享位长度,是通过节点ID和当前ID进行XOR运算得到

举个栗子,假设当前节点ID为11,则桶分布为:

  1. bukets0:0-7
  2. bukets1:12-15
  3. bukets2:8-9
  4. bukets3:10

解释:其 ID 与当前节点共享前 3 位前缀的节点存储在一个桶中,而 ID 与当前节点共享前 2 位前缀的节点存储在另一个桶中,以此类推。

11的二进制为:1011
10的二进制为:1010,与1011共享位为3位
8-9共享位为2位
12-15共享位为1位
0-7共享位为0位
image.png

6)文件切分和检索

文件切分是将文件切分成更小的片段,命名为切片,并将 files/names 记录在一个清单文件(即种子)中,这样它们就可以按照适当的顺序检索和重新合并。
文件切分提高了 P2P 网络的分布性和可靠性,因为多个节点可以存储共享文件的部分或全部切片。如果包含切片下载信息的节点离线了,此时可以从不同的源检索该切片信息。
文件切分还可以节省网络带宽,共享潜在大文件的负载分布在许多节点中。

文件切分

过程:

  1. 计算文件内容的SHA1哈希值作为ID,ID被用作种子的文件名,扩展名为”.xro“
  2. 原始文件被切分成1MB块,如果文件小于1MB,则切分为原始文件大小的50%
  3. 切片被写入磁盘,名称即为其内容的SHA1哈希值;并将名称按顺序写入种子文件,以及原始文件名和文件大小
  4. 种子和切片位置信息通过 STORE 远程过程调用广播给对等节点。对于每个 shard/manifest,宿主节点在自己的路由表中查找与文件 ID 最接近的节点。这些对等节点都接收包含文件的 ID 和位置的 STORE 远程过程调用。

种子内容json格式:

{
    // 真实的文件名
    "file_name" : "",
    // 文件大小
    "length" : 1000,
    "pieces" : [
        // 切片顺序写入的SHA1哈希值
    ]
}

开发

开发策略:从本地环境模拟并扩展网络应用到真实网络

1)测试模式:

  • 本地沙箱测试
  • Fake Network Adapter(伪网卡):本质上是一个由其他节点组成的数组,带有一些用于查找和远程过程调用代理的方法。
image.png

2)HTTP远程调用

  • Real Network Adapter (真网卡):从所提供的联系节点信息和对应于远程过程调用的路由中列出的 IP / 端口处理一个 HTTP Post 请求,可能包括请求主体中的相关数据——请求节点的联系信息、查询信息等。
image.png

3)RPC/HTTP在互联网环境下传递

  • Ngrok:第三方隧道服务
image.png

4)灵活的节点实例化和启动脚本

  • 节点广播机制

系统架构

系统架构.png

顶级对象是 XorroNode,它是一个模块化的 Sinatra 应用程序。

每个 XorroNode 包含:

  • 一个单独的 Kademlia 节点,负责维护自己的路由表和分布式哈希表。
  • 用于向其他节点发起远程过程调用的网卡。
  • 用于从其他节点、Web UI 和文件传输接收远程过程调用的 Sinatra 端点。
  • 用于文件接收、切分和清单文件的创建。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容