時間:2023-08-10|瀏覽:242
星際文件系統(tǒng)(InterPlanetaryFileSystem,縮寫IPFS)是一個旨在創(chuàng)建持久且分布式存儲和共享文件的網(wǎng)絡(luò)傳輸協(xié)議。與傳統(tǒng)的文件系統(tǒng)不同,它是一種基于內(nèi)容尋址的點對點超媒體分發(fā)協(xié)議。IPFS網(wǎng)絡(luò)中的節(jié)點構(gòu)成一個分布式文件系統(tǒng)網(wǎng)絡(luò),其中Bitswap是IPFS的核心模塊,負(fù)責(zé)與網(wǎng)絡(luò)中其他節(jié)點之間請求和發(fā)送數(shù)據(jù)塊。
圖1
IPFS將文件分解為稱為block的數(shù)據(jù)塊,這些塊由內(nèi)容標(biāo)識符(CID)標(biāo)識。IPFS文件內(nèi)容存儲在不同的節(jié)點上,每個節(jié)點存儲rootblock,少量節(jié)點存儲完整文件數(shù)據(jù),大部分節(jié)點存儲部分文件block。因為block分散存儲在不同節(jié)點,Bitswap協(xié)議解決了從多個節(jié)點高效獲取全部數(shù)據(jù)塊的問題。
圖2 多節(jié)點文件存儲示意圖
總體架構(gòu)
本文基于Bitswapv0.3.3版本進(jìn)行分析。IPFS向Bitswap獲取block,Bitswap是IPFSexchange接口的具體實現(xiàn),負(fù)責(zé)完成IPFS網(wǎng)絡(luò)數(shù)據(jù)交換功能。
圖3 Bitswap組件架構(gòu)圖
Bitswap協(xié)議內(nèi)容比較繁瑣,為了降低實現(xiàn)復(fù)雜度協(xié)議劃分為block請求模塊、block發(fā)送模塊、會話管理模塊、block提供者發(fā)現(xiàn)模塊、網(wǎng)絡(luò)模塊等。Bitswap模塊負(fù)責(zé)接收新的消息并且提供對外數(shù)據(jù)交換接口。session管理模塊用來管理多個session,每個session管理一組文件的下載,來提高下載效率。block發(fā)送模塊負(fù)責(zé)管理向其它節(jié)點發(fā)送數(shù)據(jù)塊。block請求模塊負(fù)責(zé)管理數(shù)據(jù)塊的請求。block提供者發(fā)現(xiàn)模塊負(fù)責(zé)通過DHT網(wǎng)絡(luò)發(fā)現(xiàn)網(wǎng)絡(luò)中的數(shù)據(jù)塊,通常session找不到已擁有所需block的節(jié)點時會調(diào)用此模塊進(jìn)行數(shù)據(jù)塊發(fā)現(xiàn)。
**協(xié)議概述**
為了完成節(jié)點間block交換,Bitswap定義了通信消息及通信協(xié)議。
圖4
Bitswap消息處理流程: 1、IPFS請求文件區(qū)塊,Bitswap發(fā)送want-have消息攜帶CID1信息到連接的所有節(jié)點。節(jié)點根據(jù)自己是否有CID1文件塊返回have或dont-have消息。 2、client向擁有CID1的節(jié)點發(fā)送want-block消息,節(jié)點返回相應(yīng)的block消息。 3、當(dāng)沒有節(jié)點有請求的block,Bitswap廣播want-have到所有的連接節(jié)點,或者通過DHT查找擁有文件區(qū)塊的節(jié)點。
**模塊詳解**
**Bitswap模塊**
Bitswap模塊負(fù)責(zé)接收新消息并且實現(xiàn)對外的數(shù)據(jù)交換接口。當(dāng)接收到新消息后,Bitswap處理流程: 1、記錄有關(guān)消息的一些統(tǒng)計信息 2、通知發(fā)送模塊wants消息,這樣數(shù)據(jù)發(fā)送模塊可以根據(jù)實際情況向需求節(jié)點發(fā)送響應(yīng)消息。 3、通知發(fā)送模塊任何收到的blocks,發(fā)送模塊根據(jù)節(jié)點的需求列表可以將接收到的塊發(fā)送給任何需要它們的節(jié)點 4、向SessionManager通知接收到的blocks,HAVEs和DONT_HAVEs消息,這樣SessionManager可以通知消息相關(guān)的session。
Bitswap通過FacadePattern提高了模塊使用的便利性,使得Bitswap子系統(tǒng)的用法變得簡單,避免了IPFS和Bitswap的高度耦合。
**Session管理模塊**
session管理模塊用來管理多個數(shù)據(jù)塊下載session,每個session管理一組文件的下載。當(dāng)SessionManager收到新消息時,它將 1、通知BlockPresenceManager組件跟蹤每個block。 2、通知對接收到的block感興趣并想要的Sessions。 3、通知PeerManager組件收到的block,PeerManager檢查是否有任何wants被發(fā)送到節(jié)點以接收已經(jīng)收到的塊。如果是這樣,它將向那些節(jié)點發(fā)送“CANCEL”消息,防止其它節(jié)點重復(fù)發(fā)送消息。
Session管理模塊通過協(xié)調(diào)多個session的數(shù)據(jù)需求來提高數(shù)據(jù)交互的效率,避免數(shù)據(jù)塊的重復(fù)請求、發(fā)送。
**Session模塊**
Session管理一組文件的下載,用來提高一組文件塊,比如單個文件下載效率。當(dāng)IPFS調(diào)用Bitswap時,Bitswap會創(chuàng)建一個新的Session并調(diào)用Session的相應(yīng)方法,比如GetBlocks獲取blocks。Session會管理一個節(jié)點列表,數(shù)據(jù)獲取過程只會向session中的節(jié)點獲取數(shù)據(jù),而不是所有的連接節(jié)點。當(dāng)Session中的節(jié)點都沒有某個block時,Bitswap才會通過DHT獲取具有block的節(jié)點并加入session。
由于session剛開始沒有任何節(jié)點,處于“discovery”模式。當(dāng)IPFS最初從session請求block時,該session處理流程如下: 1、通知SessionInterestManager組件它感興趣的block。 2
熱點:ipfs 數(shù)據(jù)