IPFS网络是如何运行的(p2p网络)
圖片來自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系統的節點查找有兩個需求:
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 --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.
小編在寫這篇問寫這篇文章的時候,還發現了一個小bug,當使用
ipfs bootstrap rm刪掉所有的啟動節點之后,忘了添加自己的啟動節點,發現節點無法連接到ipfs網絡了,成了孤立節點,而且沒有任何提醒。于是小編去報了一個bug,經過跟開發們的討論給標記成了feature,未來如果出現這種情況,節點啟動的時候會給出提醒,不至于讓我們莫名其妙找不到問題。
文中涉及到的名詞比較多,很多技術細節并沒有說的很詳細,如果感興趣的讀者可以自行Google,也歡迎跟小編交流,最近越來越多的技術愛好者跟小編交流可以基于ipfs做些什么事情,非常開心看到越來越多的國內的開發者關注這個項目了。
本專欄的微信公眾號IPFS指南(ipfs_guide),致力于IPFS的知識的普及,如果你對IFPS、Filecoin,挖礦感興趣,敬請關注!
本專欄的文章允許轉載,但請注明:原文來自于知乎專欄:IPFS指南(IPFS指南)作者:飛向未來
總結
以上是生活随笔為你收集整理的IPFS网络是如何运行的(p2p网络)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IPFS: BitSwap协议(数据块交
- 下一篇: IPFS: Merkle DAG数据结构