IPFS世界的物流系統:libp2p

買賣虛擬貨幣

今天小編為大家介紹一下IPFS的另一個重要元件:libp2p,它負責把IPFS的檔案塊(詳見本公眾號之前的文章:IPFS資料之旅(二):名正才能傳順)從一個節點搬運到另一個節點,讓上層應用不必關心複雜的網路細節,只需要像收發快遞一樣,填好收件人(目的節點ID)就可以了。

組成

按照libp2p官方文件,它主要包括如下幾個模組:


  • 節點路由:負責找到到達某個節點的可用路徑,類似於我們開車時候用的導航軟體

  • 連線管理:負責管理節點之間連線的建立、維護、銷燬,它相當於libp2p的大腦

  • 分散式記錄儲存:負責記錄節點相關的各種資訊,便於連線管理和內容定址

  • 節點發現:負責找到網路裡面的可用節點

只有找到了足夠多的節點,才能獲得對整個IPFS網路的認識。故libp2p會在初始化之後不停地透過各種方式“結識”更多的節點,包括利用Bootstrap list、mDNS、DHT等。libp2p會把這些獲取到的資訊儲存在分散式記錄儲存模組中,供以後查詢之用。當上層應用需要連線某個節點時,節點路由模組會找到幾種不同的路徑供連線管理模組嘗試(由於P2P網路本身的特性,節點之間的連線狀況始終在動態變化,故不是所有路徑都是可以成功連線的)。連線成功之後,libp2p會回撥上層應用來處理產生的資料,類似於快遞員喊你來取快遞。

下面我們具體分析一下連線的建立過程,主要包括3個步驟,包括地址解析、傳輸層適配、協議能力協商。

地址解析

為了適應複雜的網路環境,libp2p支援多種不同的底層協議,包括TCP、QUIC、WebSocket、WebRTC等,甚至IPFS社羣專門立了一個專案來標準化節點的地址——multiaddr。目前libp2p主要支援以下幾種地址格式:

  • /ip4/123.11.22.33/tcp/4001/ipfs/QmNodeID: 這種格式跟傳統的TCP網路裡是一樣的,直接可以解析出對應的IPv4地址和埠號;

  • /ipfs/QmNodeID: 這種只有節點ID的地址,需要節點路由模組找到節點對應的IP地址,然後再進行連線;

  • /dns4/ipfs.ipfsbit.com/tcp/443/wss/p2p-webrtc-star: 這種地址需要呼叫multiaddr-dns元件,把域名解析成IP地址,然後再進行連線;

  • /p2p-circuit/p2p/QmNodeID: 這種地址是relay地址,需要首先連線一箇中間節點,才能連線到目的節點;

透過地址解析,libp2p能獲知如何才能連線到目的節點,下一步就是嘗試建立連線。

傳輸層適配

地址裡面的

/tcp/quic/ws/p2p分別對應不同的傳輸層實現。libp2p定義了統一的傳輸層介面標準:

libp2p會選擇地址對應的transport,呼叫Dial函式嘗試連線目的節點。

協議能力協商

連線建立之後,libp2p會首先進行協議能力協商,確定對端支援哪些功能。負責協商功能的是identify協議,它是內建在libp2p的基礎協議,能夠交換節點的公鑰、本地監聽地址、對端觀察地址等。

協商後,連線兩端的節點會找到共同支援的協議,並且初始化它們。初始化時會註冊每種協議的handler(回撥函式),當有協議資料到達時,相應的handler就會被呼叫。由於多種協議會複用同樣的底層連線,所以連線會被拆分成多個“流(Stream)”。libp2p整體的網路層級關係如下:

以上です。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;