图片来自wiki

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>] 删除启动节点

小编节点

通过命令行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指南(ipfs_guide),致力于IPFS的知识的普及,如果你对IFPS、Filecoin,挖矿感兴趣,敬请关注!

本专栏的文章允许转载,但请注明:原文来自于知乎专栏:IPFS指南(IPFS指南)作者:飞向未来

IPFS网络是如何运行的(p2p网络)相关推荐

  1. 【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系

    目录 一.简介 二.知识点 P2P 网络 区块链节点与 P2P 的关系 区块链节点功能分类 P2P 网络特征 三.什么是 P2P 网络,区块链式使用 P2P 网络做什么 1.P2P 网络概念 2.P2 ...

  2. 网络服务器没运行,「dns网络服务器」未响应应该如何解决呢

    「dns网络服务器」未响应怎么解决呢?我们日常上网的时候,有时候会遇到网络连接异常,显示DNS服务器未响应的状况.下面我们介绍下解决方法. 首先如果你的电脑上安装了360或者腾讯等其他的杀毒软件,可以 ...

  3. Rust P2P网络应用实战-1 P2P网络核心概念及Ping程序

    本系列文章首先研究P2P网络的核心概念,然后详细分析libp2p-rust库中的应用实例,为以后开发P2P网络应用程序打好基础. P2P网络 P2P(Peer-to-Peer)是一种网络技术,可以在网 ...

  4. 区块链P2P网络协议演进过程

    区块链是以加密机制.储存机制.共识机制等多种技术组成的分布式系统,可以在无中心服务器的情况下实现相互信任的点对点交易功能.区块链最大的特点是去中心化和分布式,区块链共识机制使得参与节点共同为系统提供服 ...

  5. P2P网络基础(学习笔记)

    P2P网络基础(学习笔记) 基本概述 P2P与C/S架构 P2P网络的特点 P2P网络的主要功能 P2P网络的分类 集中式 全分布式非结构化 全分布式结构化 混合式 比特币网络 P2P网络的应用 基本 ...

  6. “P2P网络“在区块链当中扮演的角色

    区块链与P2P网络简介         公组密码体制.共识机制和P2P网络是比特币系统的三大支撑技术, 其中P2P网络作为其系统的底层网络支撑具有极其重要的作用.比特币之后,加密算法与共识机制都有不少 ...

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

    JXTA 2 是开放源代码 P2P 网络的第二个主要版本,它利用流行的.基于 Java 的参考实现作为构建基础.在设计方面进行了重要的修改,以获得更高的性能.海量伸缩性和可维护的 P2P 网络.本文建 ...

  8. P2P 网络借贷信用风险及防范研究

    摘 要 互联网以开放性.广泛性.高效性.交互性等特点,正在改变着人类社会经济活动, 助推着社会经济的发展.以互联网为载体的移动支付.社交网络和云计算等现代信息科 技的发展,对金融模式产生了颠覆性影响, ...

  9. 基于侧链的P2P网络设计

    p2p网络是一种在组网节点之间进行任务分配和工作负载的对等网络.节点之间地位相等.功能相同.无主次之分.没有中心节点,每一个节点既是服务的请求者又是服务的响应者.资源冗余存储,部分节点的故障不影响整体 ...

最新文章

  1. python打印指定行数的分割线_在Python中的分隔线上打印列表元素
  2. python第三方库numpy-Python第三方库之Numpy库
  3. java scriptrunner_ScriptRunner.java
  4. [Leetcode] Integer to Roman
  5. git中的暂存区与工作区
  6. ef1a启动子_常见的真核和原核表达系统的启动子(promoters)
  7. 家用计算机在拔下网线的情况下,为什么只有拔掉网线才可以关掉电脑
  8. 东方通没有创造中间件 却在定义中间件的“化蝶”
  9. 11content_processor
  10. 电信基础设施共建共享
  11. linux 文本编辑器Vim/Vi详细介绍
  12. 好项目,不私藏!适用于单片机开发的开源轮子
  13. 信号处理算法方向的一些SCI杂志(他人经验)
  14. 游戏服务器redis mysql_redis服务器环境下mysql实现lnmp架构缓存
  15. JS设计模式(二)-Revealing Module(揭示模式)
  16. 服务器如何 建立远程连接?
  17. 《易中天中华史 - 第五卷 从春秋到战国》读书笔记
  18. 人一个月瘦多少斤比较合适
  19. JS编码解码对应C#编码解码
  20. python多线程(Multiprocessing)与多线程(Multithreading)区别优缺点最详细解释

热门文章

  1. 结对项目——电梯调度算法的实现和测试
  2. ArcGIS9.3全套下载地址
  3. 吴恩达 coursera ML 第六课总结+作业答案
  4. 基本电子电路系列——MOS管
  5. 基于SegNet和UNet的遥感图像分割代码解读
  6. 用matlab绘制升余弦函数
  7. Matlab对话框总结
  8. [云炬创业基础笔记]第六章商业模式测试11
  9. 实现串匹配的并行算法_5-1-KMP模式匹配
  10. Python脚本-批量修改文件名