IPFS是一个p2p网络,先来看看BitTorrent的p2p网络是如何工作的?

想要bt下载一个文件,首先你需要一个种子文件torrent,种子文件包含至少一个 Tracker(一台服务器地址)信息和文件的分割记录信息。BT软件解析种子文件torrent,从里面找出来tracker,告诉tracker我要下载这个文件。tracker同时返回给你现在其它正在下载的节点信息,这个时候你的节点就正式加入了p2p下载网络,根据tracker返回的信息直接跟其它节点建立联系,开始数据传输。

这种情况下Tracker成为了沟通p2p网络的关键一环,如果tracker服务器全部关闭的话,p2p网络就被关闭了。

那么是不是说如果没有了Tracker,p2p就不能实现了?显然不是的,后来有了DHT(分布式哈希表),DHT技术的出现使得没有tracker也能进行p2p网络下载,用过电驴的读者应该都不陌生,电驴里面有一个选项,可以允许选择KAD(DHT的一种)网络进行搜索。这样一来p2p网络的适应性更强了,可以大大减轻tracker的负担。

以上就是传统的P2P软件大概工作方式。

电驴的KAD网络

IPFS的p2p网络使用的是DHT技术

什么是DHT ( Distributed Hash Tables ) ?

DHT是一个分布式系统, 它提供了一个类似哈希表一样的查询服务: 键值对存储在DHT中, 任何参与的节点都可以有效的检索给定键对应的值. 键值对的映射由网络中所有的节点维护, 每个节点负责一小部分路由和数据存储. 这样即使有节点加入或者离开, 对整个网络的影响都很小, 于是DHT可以扩展到非常庞大的节点(上千万)。

DHT广泛应用于各种点对点系统, 用来存储节点的元数据。比如:BTC系统使用 MainlineDHT来维护节点。

DHT具有以下性质:

  • 离散型(Autonomy and decentralization): 构成系统的节点之间都是对等的, 没有中央控制机制进行协调

  • 伸缩性(Scalability): 不论系统有多少节点, 都要求高效工作

  • 容错性(Fault tolerance): 不断有节点加入和离开, 不会影响整个系统的工作

来自于: https://en.wikipedia.org/wiki/Distributed_hash_table

简单介绍一席跟IPFS有关的三种DHT技术

Kademlia DHT

  • 高效查询:查询的平均复杂度是 log2(n),例如:10,000,000个节点只需要20次查询

  • 低开销:优化了发往其它节点的控制消息的数量

  • 可以抵御各种攻击

  • 广泛应用于各种点对点系统,包括:Guntella和BitTorrent,可以构建超过2千万个节点的网络

Coral DSHT

Coral继承了Kademlia并且做了一些改造 ( 它认为直接在DHT上存储数据是浪费存储和带宽) 。

S/Kademlia DHT

S/Kademlia DHT同样是继承了Kademlia,并且做了一些改进,系统可以防止恶意攻击,例如女巫攻击。

IPFS的路由系统

ipfs系统的节点查找有两个需求:

  1. 第一找到其他节点地址

  2. 第二找到存储有特定数据的节点

IPFS综合了S/Kademlia 、Coral和Mainline技术(能折腾吧,不过这种对技术的追求精神值得我们给ipfs团队鲜花和鼓掌)。Kademlia协议的工作方式比较复杂, 有兴趣了解的可以单独去查询一下, 本文不在进行更深入的讨论. KAD可以很高效进行路由查询服务。

IPFS DHT的数据存储是根据数据的大小进行的:

  • 小于1KB的数据直接存储到DHT上面

  • 大于1KB的数据在DHT中存储的是节点ID

节点加入

IPFS是基于DHT技术的,所以在IPFS网络里面是没有tracker存在的。那么一个新的节点创建后是如何加入网络的呢?

新创建的节点必须知道至少一个已经在网络上的节点地址,连上那个节点,就可以加入网络了,所以ipfs系统提供了bootstrap命令来完成这个工作(通常情况不需要自己来做这样的造作,除非有一些特殊需求,例如:指定自己比较近的启动节点,搭建IPFS私有网络等)。

ipfs bootstrap list 列出来启动节点

ipfs bootstrap add [<peer>] 添加启动节点

ipfs bootstrap rm [<peer>] 删除启动节点

上图是小编节点的bootstrap节点

通过命令行help可以查看命令的使用详情

localhost:~ tt$ ipfs bootstrap --help

USAGE

ipfs bootstrap - Show or edit the list of bootstrap peers.

SYNOPSIS

ipfs bootstrap

DESCRIPTION

Running 'ipfs bootstrap' with no arguments will run 'ipfs bootstrap list'

SECURITY WARNING:

The bootstrap command manipulates the "bootstrap list", which contains

the addresses of bootstrap nodes. These are the *trusted peers* from

which to learn about other peers in the network. Only edit this list

if you understand the risks of adding or removing nodes from this list.

SUBCOMMANDS

ipfs bootstrap add [<peer>]... - Add peers to the bootstrap list.

ipfs bootstrap list            - Show peers in the bootstrap list.

ipfs bootstrap rm [<peer>]...  - Remove peers from the bootstrap list.

Use 'ipfs bootstrap <subcmd> --help' for more information about each command.

小编在写这篇问写这篇文章的时候,还发现了一个小bug,当使用

ipfs bootstrap rm

删掉所有的启动节点之后,忘了添加自己的启动节点,发现节点无法连接到ipfs网络了,成了孤立节点,而且没有任何提醒。于是小编去报了一个bug,经过跟开发们的讨论给标记成了feature,未来如果出现这种情况,节点启动的时候会给出提醒,不至于让我们莫名其妙找不到问题。

文中涉及到的名词比较多,很多技术细节并没有说的很详细,如果感兴趣的读者可以自行Google,也欢迎跟小编交流,最近越来越多的技术爱好者跟小编交流可以基于ipfs做些什么事情,非常开心看到越来越多的国内的开发者关注这个项目了。

作者飞向未来,致力于IPFS/Filecoin在中国的技术推广,他的微信公众号和社群,目前是中国最活跃最顶级的IPFS社群。作者飞向未来是圆方圆区块链的特邀嘉宾,所有转载都已经得到飞向未来本人授权。

更多飞向未来导师的公众号,可以在IPFS指南公众号中找到。

圆方圆链圈

IPFS网络是如何运行的(p2p网络)的更多相关文章

  1. 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网

    任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技 ...

  2. JXTA 2: 具有高性能、海量伸缩性的 P2P 网络

    这是来自developerWorks的一篇文章,地址是 https://www.ibm.com/developerworks/cn/java/j-jxta2/ ———————————————————— ...

  3. 详解区块链P2P网络

    根据前一篇文章<从微观到宏观理解区块链>我们已经了解到,微观上,区块链本质就是一种不可篡改且可追踪溯源的哈希链条:宏观上,还具备了另外三个基本特征:分布式存储.P2P 网络和共识机制.分布 ...

  4. 使用Go语言编写区块链P2P网络(译)(转)

    转自:https://mp.weixin.qq.com/s/2daFH9Ej5fVlWmpsN5HZzw 外文链接: https://medium.com/coinmonks/code-a-simpl ...

  5. P2P 网络核心技术:Gossip 协议

    背景 Gossip protocol 也叫 Epidemic Protocol (流行病协议),实际上它还有很多别名,比如:“流言算法”.“疫情传播算法”等. 这个协议的作用就像其名字表示的意思一样, ...

  6. 2015年p2p网络借贷平台的发展现状

    2015年春暖花开,莺飞草长,股市大涨大跌起起落落,P2P网络借贷收到越来越多的人关注,P2P网络借贷平台是p2p借贷与网络借贷相结合的金 融服务网站,这么多P2P网络借贷平台排我们应该如何选择呢?小 ...

  7. go语言打造p2p网络

    传送门: 柏链项目学院 就像1000个人眼中有1000个哈姆雷特一样,每个人眼中的区块链也是不一样的!作为技术人员眼中的区块链就是将各种技术的融合,包括密码学,p2p网络,分布式共识机制以及博弈论等. ...

  8. Derek解读Bytom源码-P2P网络 upnp端口映射

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...

  9. Derek解读Bytom源码-P2P网络 地址簿

    作者:Derek 简介 Github地址:https://github.com/Bytom/bytom Gitee地址:https://gitee.com/BytomBlockchain/bytom ...

随机推荐

  1. uva1354 枚举二叉树

    这题很难,这几天一直在想这题,最后看了汝佳大哥的代码才明白.贴上代码 // UVa1354 Mobile Computing // Rujia Liu #include<cstdio> # ...

  2. 使用line_profiler查看api接口函数每行代码执行时间

    项目情景描述: 在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的50 ...

  3. iOS.Animations.by.Tutorials.v2.0汉化

    翻译自:iOS.Animations.by.Tutorials.v2.0 前五章将向你介绍动画API-UIKit框架.这个API是专门设计来帮助你轻松轻而易举的为视图控件赋予生命,同时避免了核心动画的 ...

  4. Xmind8 Pro安装教程 Windows

      xmind是一款优秀的思维导图制作软件,这一点相信不用太多解释. 尤其作为测试人员导出测试用例为excel极其方便.网上xmind的破解方法加自己琢磨,重新整理了破解步骤. 亲测可以永久激活截止2 ...

  5. linux 云计算Openstack搭建

    Openstack 由NASA和Reckspace合作研发并发起的项目,以Apache许可证为授权 云计算三大支柱模型 IaaS:基础架构即服务 提供服务器/虚拟主机/网络等设备资源 PaaS:平台即 ...

  6. equals 与 == 区别及用法

    ==: 1. ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同: 2.如果要比较两个变量是否指向同一个对象,这时候就需要用==操作符进行比较: 注意:= ...

  7. 【Unity3D】Unity3D开发《我的世界》之五、创建无限地形(视频)

    转载请注明出处:http://www.cnblogs.com/shamoyuu/p/unity_minecraft_05.html 一.导入Unity3D自带的第一人称角色控制器 直接导入就行,我们用 ...

  8. alsa声卡分析alsa-utils调用过程

    如何分析tinyplay 播放音频和tinymix的过程?需要相应的工具来支持追查: 一.利用strace工具分析tinyplay和tinymix: strace -o tinyplay.log ti ...

  9. 第3章 PCI总线的数据交换

    PCI Agent设备之间,以及HOST处理器和PCI Agent设备之间可以使用存储器读写和I/O读写等总线事务进行数据传送.在大多数情况下,PCI桥不直接与PCI设备或者HOST主桥进行数据交换, ...

  10. R语言︱缺失值处理之多重插补——mice包

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:缺失值是数据清洗过程中非常重要的问题 ...