IPFS是一個(gè)p2p網(wǎng)絡(luò)主儡,先來看看BitTorrent的p2p網(wǎng)絡(luò)是如何工作的?
想要bt下載一個(gè)文件捕儒,首先你需要一個(gè)種子文件torrent望几,種子文件包含至少一個(gè) Tracker(一臺(tái)服務(wù)器地址)信息和文件的分割記錄信息。BT軟件解析種子文件torrent掰茶,從里面找出來tracker暇藏,告訴tracker我要下載這個(gè)文件。tracker同時(shí)返回給你現(xiàn)在其它正在下載的節(jié)點(diǎn)信息濒蒋,這個(gè)時(shí)候你的節(jié)點(diǎn)就正式加入了p2p下載網(wǎng)絡(luò)盐碱,根據(jù)tracker返回的信息直接跟其它節(jié)點(diǎn)建立聯(lián)系,開始數(shù)據(jù)傳輸沪伙。
這種情況下Tracker成為了溝通p2p網(wǎng)絡(luò)的關(guān)鍵一環(huán)瓮顽,如果tracker服務(wù)器全部關(guān)閉的話,p2p網(wǎng)絡(luò)就被關(guān)閉了围橡。
那么是不是說如果沒有了Tracker暖混,p2p就不能實(shí)現(xiàn)了?顯然不是的翁授,后來有了DHT(分布式哈希表)拣播,DHT技術(shù)的出現(xiàn)使得沒有tracker也能進(jìn)行p2p網(wǎng)絡(luò)下載,用過電驢的讀者應(yīng)該都不陌生收擦,電驢里面有一個(gè)選項(xiàng)贮配,可以允許選擇KAD(DHT的一種)網(wǎng)絡(luò)進(jìn)行搜索。這樣一來p2p網(wǎng)絡(luò)的適應(yīng)性更強(qiáng)了塞赂,可以大大減輕tracker的負(fù)擔(dān)牧嫉。
以上就是傳統(tǒng)的P2P軟件大概工作方式。
IPFS的p2p網(wǎng)絡(luò)使用的是DHT技術(shù)
什么是DHT ( Distributed Hash Tables ) ?
DHT是一個(gè)分布式系統(tǒng), 它提供了一個(gè)類似哈希表一樣的查詢服務(wù): 鍵值對(duì)存儲(chǔ)在DHT中, 任何參與的節(jié)點(diǎn)都可以有效的檢索給定鍵對(duì)應(yīng)的值. 鍵值對(duì)的映射由網(wǎng)絡(luò)中所有的節(jié)點(diǎn)維護(hù), 每個(gè)節(jié)點(diǎn)負(fù)責(zé)一小部分路由和數(shù)據(jù)存儲(chǔ). 這樣即使有節(jié)點(diǎn)加入或者離開, 對(duì)整個(gè)網(wǎng)絡(luò)的影響都很小, 于是DHT可以擴(kuò)展到非常龐大的節(jié)點(diǎn)(上千萬)减途。
DHT廣泛應(yīng)用于各種點(diǎn)對(duì)點(diǎn)系統(tǒng), 用來存儲(chǔ)節(jié)點(diǎn)的元數(shù)據(jù)酣藻。比如:BTC系統(tǒng)使用 MainlineDHT來維護(hù)節(jié)點(diǎn)。
DHT具有以下性質(zhì):
- 離散型(Autonomy and decentralization): 構(gòu)成系統(tǒng)的節(jié)點(diǎn)之間都是對(duì)等的, 沒有中央控制機(jī)制進(jìn)行協(xié)調(diào)
- 伸縮性(Scalability): 不論系統(tǒng)有多少節(jié)點(diǎn), 都要求高效工作
- 容錯(cuò)性(Fault tolerance): 不斷有節(jié)點(diǎn)加入和離開, 不會(huì)影響整個(gè)系統(tǒng)的工作
來自于: https://en.wikipedia.org/wiki/Distributed_hash_table
簡單介紹一席跟IPFS有關(guān)的三種DHT技術(shù)
Kademlia DHT
- 高效查詢:查詢的平均復(fù)雜度是 log2(n)鳍置,例如:10,000,000個(gè)節(jié)點(diǎn)只需要20次查詢
- 低開銷:優(yōu)化了發(fā)往其它節(jié)點(diǎn)的控制消息的數(shù)量
- 可以抵御各種攻擊
- 廣泛應(yīng)用于各種點(diǎn)對(duì)點(diǎn)系統(tǒng)辽剧,包括:Guntella和BitTorrent,可以構(gòu)建超過2千萬個(gè)節(jié)點(diǎn)的網(wǎng)絡(luò)
Coral DSHT
Coral繼承了Kademlia并且做了一些改造 ( 它認(rèn)為直接在DHT上存儲(chǔ)數(shù)據(jù)是浪費(fèi)存儲(chǔ)和帶寬)
S/Kademlia DHT
S/Kademlia DHT同樣是繼承了Kademlia税产,并且做了一些改進(jìn)怕轿,系統(tǒng)可以防止惡意攻擊,例如女巫攻擊辟拷。
IPFS的路由系統(tǒng)
ipfs系統(tǒng)的節(jié)點(diǎn)查找有兩個(gè)需求:
- 第一找到其他節(jié)點(diǎn)地址
- 第二找到存儲(chǔ)有特定數(shù)據(jù)的節(jié)點(diǎn)
IPFS綜合了S/Kademlia 撞羽、Coral和Mainline技術(shù)(能折騰吧,不過這種對(duì)技術(shù)的追求精神值得我們給ipfs團(tuán)隊(duì)鮮花和鼓掌)衫冻。Kademlia協(xié)議的工作方式比較復(fù)雜, 有興趣了解的可以單獨(dú)去查詢一下, 本文不在進(jìn)行更深入的討論. KAD可以很高效進(jìn)行路由查詢服務(wù)诀紊。
IPFS DHT的數(shù)據(jù)存儲(chǔ)是根據(jù)數(shù)據(jù)的大小進(jìn)行的:
- 小于1KB的數(shù)據(jù)直接存儲(chǔ)到DHT上面
- 大于1KB的數(shù)據(jù)在DHT中存儲(chǔ)的是節(jié)點(diǎn)ID
節(jié)點(diǎn)加入
IPFS是基于DHT技術(shù)的,所以在IPFS網(wǎng)絡(luò)里面是沒有tracker存在的隅俘。那么一個(gè)新的節(jié)點(diǎn)創(chuàng)建后是如何加入網(wǎng)絡(luò)的呢邻奠?
新創(chuàng)建的節(jié)點(diǎn)必須知道至少一個(gè)已經(jīng)在網(wǎng)絡(luò)上的節(jié)點(diǎn)地址笤喳,連上那個(gè)節(jié)點(diǎn),就可以加入網(wǎng)絡(luò)了碌宴,所以ipfs系統(tǒng)提供了bootstrap命令來完成這個(gè)工作(通常情況不需要自己來做這樣的造作杀狡,除非有一些特殊需求,例如:指定自己比較近的啟動(dòng)節(jié)點(diǎn)贰镣,搭建IPFS私有網(wǎng)絡(luò)等)呜象。
ipfs bootstrap list 列出來啟動(dòng)節(jié)點(diǎn)
ipfs bootstrap add [<peer>] 添加啟動(dòng)節(jié)點(diǎn)
ipfs bootstrap rm [<peer>] 刪除啟動(dòng)節(jié)點(diǎn)
通過命令行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.
小編在寫這篇問寫這篇文章的時(shí)候,還發(fā)現(xiàn)了一個(gè)小bug碑隆,當(dāng)使用
ipfs bootstrap rm
刪掉所有的啟動(dòng)節(jié)點(diǎn)之后恭陡,忘了添加自己的啟動(dòng)節(jié)點(diǎn),發(fā)現(xiàn)節(jié)點(diǎn)無法連接到ipfs網(wǎng)絡(luò)了干跛,成了孤立節(jié)點(diǎn),而且沒有任何提醒祟绊。于是小編去報(bào)了一個(gè)bug楼入,經(jīng)過跟開發(fā)們的討論給標(biāo)記成了feature,未來如果出現(xiàn)這種情況牧抽,節(jié)點(diǎn)啟動(dòng)的時(shí)候會(huì)給出提醒嘉熊,不至于讓我們莫名其妙找不到問題。
文中涉及到的名詞比較多扬舒,很多技術(shù)細(xì)節(jié)并沒有說的很詳細(xì)阐肤,如果感興趣的讀者可以自行Google,也歡迎跟小編交流讲坎,最近越來越多的技術(shù)愛好者跟小編交流可以基于ipfs做些什么事情孕惜,非常開心看到越來越多的國內(nèi)的開發(fā)者關(guān)注這個(gè)項(xiàng)目了。
原文來自于知乎專欄:IPFS指南(IPFS指南)作者:飛向未來