IPFS网络是如何运行的(p2p网络)
圖片來自wiki
IPFS是一個p2p網(wǎng)絡(luò),先來看看BitTorrent的p2p網(wǎng)絡(luò)是如何工作的?
想要bt下載一個文件,首先你需要一個種子文件torrent,種子文件包含至少一個 Tracker(一臺服務(wù)器地址)信息和文件的分割記錄信息。BT軟件解析種子文件torrent,從里面找出來tracker,告訴tracker我要下載這個文件。tracker同時返回給你現(xiàn)在其它正在下載的節(jié)點(diǎn)信息,這個時候你的節(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)該都不陌生,電驢里面有一個選項(xiàng),可以允許選擇KAD(DHT的一種)網(wǎng)絡(luò)進(jìn)行搜索。這樣一來p2p網(wǎng)絡(luò)的適應(yīng)性更強(qiáng)了,可以大大減輕tracker的負(fù)擔(dān)。
以上就是傳統(tǒng)的P2P軟件大概工作方式。
電驢的KAD網(wǎng)絡(luò)(圖片來自網(wǎng)絡(luò))IPFS的p2p網(wǎng)絡(luò)使用的是DHT技術(shù)
什么是DHT ( Distributed Hash Tables ) ?
DHT是一個分布式系統(tǒng), 它提供了一個類似哈希表一樣的查詢服務(wù): 鍵值對存儲在DHT中, 任何參與的節(jié)點(diǎn)都可以有效的檢索給定鍵對應(yīng)的值. 鍵值對的映射由網(wǎng)絡(luò)中所有的節(jié)點(diǎn)維護(hù), 每個節(jié)點(diǎn)負(fù)責(zé)一小部分路由和數(shù)據(jù)存儲. 這樣即使有節(jié)點(diǎn)加入或者離開, 對整個網(wǎng)絡(luò)的影響都很小, 于是DHT可以擴(kuò)展到非常龐大的節(jié)點(diǎn)(上千萬)。
DHT廣泛應(yīng)用于各種點(diǎn)對點(diǎn)系統(tǒng), 用來存儲節(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)之間都是對等的, 沒有中央控制機(jī)制進(jìn)行協(xié)調(diào)
- 伸縮性(Scalability): 不論系統(tǒng)有多少節(jié)點(diǎn), 都要求高效工作
- 容錯性(Fault tolerance): 不斷有節(jié)點(diǎn)加入和離開, 不會影響整個系統(tǒng)的工作
來自于: https://en.wikipedia.org/wiki/Distributed_hash_table
簡單介紹一席跟IPFS有關(guān)的三種DHT技術(shù)
Kademlia DHT
- 高效查詢:查詢的平均復(fù)雜度是 log2(n),例如:10,000,000個節(jié)點(diǎn)只需要20次查詢
- 低開銷:優(yōu)化了發(fā)往其它節(jié)點(diǎn)的控制消息的數(shù)量
- 可以抵御各種攻擊
- 廣泛應(yīng)用于各種點(diǎn)對點(diǎn)系統(tǒng),包括:Guntella和BitTorrent,可以構(gòu)建超過2千萬個節(jié)點(diǎn)的網(wǎng)絡(luò)
Coral DSHT
Coral繼承了Kademlia并且做了一些改造 ( 它認(rèn)為直接在DHT上存儲數(shù)據(jù)是浪費(fèi)存儲和帶寬)
S/Kademlia DHT
S/Kademlia DHT同樣是繼承了Kademlia,并且做了一些改進(jìn),系統(tǒng)可以防止惡意攻擊,例如女巫攻擊。
IPFS的路由系統(tǒng)
ipfs系統(tǒng)的節(jié)點(diǎn)查找有兩個需求:
IPFS綜合了S/Kademlia 、Coral和Mainline技術(shù)(能折騰吧,不過這種對技術(shù)的追求精神值得我們給ipfs團(tuán)隊(duì)鮮花和鼓掌)。Kademlia協(xié)議的工作方式比較復(fù)雜, 有興趣了解的可以單獨(dú)去查詢一下, 本文不在進(jìn)行更深入的討論. KAD可以很高效進(jìn)行路由查詢服務(wù)。
IPFS DHT的數(shù)據(jù)存儲是根據(jù)數(shù)據(jù)的大小進(jìn)行的:
- 小于1KB的數(shù)據(jù)直接存儲到DHT上面
- 大于1KB的數(shù)據(jù)在DHT中存儲的是節(jié)點(diǎn)ID
節(jié)點(diǎn)加入
IPFS是基于DHT技術(shù)的,所以在IPFS網(wǎng)絡(luò)里面是沒有tracker存在的。那么一個新的節(jié)點(diǎn)創(chuàng)建后是如何加入網(wǎng)絡(luò)的呢?
新創(chuàng)建的節(jié)點(diǎn)必須知道至少一個已經(jīng)在網(wǎng)絡(luò)上的節(jié)點(diǎn)地址,連上那個節(jié)點(diǎn),就可以加入網(wǎng)絡(luò)了,所以ipfs系統(tǒng)提供了bootstrap命令來完成這個工作(通常情況不需要自己來做這樣的造作,除非有一些特殊需求,例如:指定自己比較近的啟動節(jié)點(diǎn),搭建IPFS私有網(wǎng)絡(luò)等)。
ipfs bootstrap list 列出來啟動節(jié)點(diǎn)ipfs bootstrap add [<peer>] 添加啟動節(jié)點(diǎn)
ipfs bootstrap rm [<peer>] 刪除啟動節(jié)點(diǎn)小編節(jié)點(diǎn)
通過命令行help可以查看命令的使用詳情
localhost:~ tt$ ipfs bootstrap --helpUSAGE
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.
小編在寫這篇問寫這篇文章的時候,還發(fā)現(xiàn)了一個小bug,當(dāng)使用
ipfs bootstrap rm刪掉所有的啟動節(jié)點(diǎn)之后,忘了添加自己的啟動節(jié)點(diǎn),發(fā)現(xiàn)節(jié)點(diǎn)無法連接到ipfs網(wǎng)絡(luò)了,成了孤立節(jié)點(diǎn),而且沒有任何提醒。于是小編去報了一個bug,經(jīng)過跟開發(fā)們的討論給標(biāo)記成了feature,未來如果出現(xiàn)這種情況,節(jié)點(diǎn)啟動的時候會給出提醒,不至于讓我們莫名其妙找不到問題。
文中涉及到的名詞比較多,很多技術(shù)細(xì)節(jié)并沒有說的很詳細(xì),如果感興趣的讀者可以自行Google,也歡迎跟小編交流,最近越來越多的技術(shù)愛好者跟小編交流可以基于ipfs做些什么事情,非常開心看到越來越多的國內(nèi)的開發(fā)者關(guān)注這個項(xiàng)目了。
本專欄的微信公眾號IPFS指南(ipfs_guide),致力于IPFS的知識的普及,如果你對IFPS、Filecoin,挖礦感興趣,敬請關(guān)注!
本專欄的文章允許轉(zhuǎn)載,但請注明:原文來自于知乎專欄:IPFS指南(IPFS指南)作者:飛向未來
總結(jié)
以上是生活随笔為你收集整理的IPFS网络是如何运行的(p2p网络)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPFS: BitSwap协议(数据块交
- 下一篇: IPFS: Merkle DAG数据结构