今天小編為大家介紹一下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整體的網路層級關係如下:
以上です。