# Go-libp2p
Protocol Labs旗下目前有五個明星項目,每一個都有其獨特的定位和功能。五個項目彼此獨立又聯系,旨在建立一個更安全、高效、開放的網絡。在Protocol Labs的官網我們可以找到上面5個項目,即IPFS、Filecoin、Libp2p、IPLD、Multiformats。

其中,**Libp2p是一個模塊化的網絡棧**,通過將各種傳輸和P2P協議結合在一起,使得開發人員很容易構建大型、健壯的P2P網絡。

Libp2p被用作IPFS的網絡層,主要負責發現節點、連接節點、發現數據、傳輸數據。Libp2p 集成了各種傳輸協議和點對點協議,其主要作用是發現節點和內容,并且讓不同的網絡協議能夠互相之間順利的傳送數據。開發人員可以使用 Libp2p 輕松構建大型,穩定的 p2p 網絡。Libp2p 主要包含了如下技術實現:
Transports:傳輸
Discovery:發現
Peer Routing: 對等端路由
NAT Traversal: NAT穿透
Content Routing: 內容路由
# Libp2p 架構和流程
該項目主要包括了如下幾個模塊:
* **Peer Routing - 對等端路由**
用來決定使用哪些對等端路由指定的消息。這種路由機制可以遞歸甚至在廣播/組播模式下完成。
對等端路由子系統暴露出一些接口,用來確定一條消息應該被路由到DHT中的哪些對等端。它接受一個key,且返回一個或多個PeerInfo對象。以下是兩個對等端路由子系統的實例,第一個基于Kademlia DHT,第二個基于mDNS。然而,只要實現了同樣的功能和接口,其他的對等端路由機制也可以被實現。
**kad-routing**實現了Kademlia路由表,每個對等端都保存著一個k桶集合,每個k桶中都包含著幾個來自網絡中其他對等端的PeerInfo對象。
**mDNS-routing**使用mDNS探測來識別局域網對等端是否有指定的key或者他們是否在線。
* **Swarm - 連接處理**
負責管理節點之間連接的創建、維護、銷毀。包括協議多路復用、流多路復用、NAT穿透和連接中繼,同時進行多路傳輸。
關于中繼:由于NAT,反向代理,防火墻或不支持相同的傳輸(例如,go-ipfs與browser-ipfs),中繼在某些情況下是很有必要的。中繼連接使用起來和常規的連接差不多,也同樣是端對端加密的。中繼線路既是隧道傳輸,也是Swarm協議。傳輸是建立與接受連接的工具,swarm協議是中繼連接的工具。
* **Distributed Record Store - 分布式記錄存儲**
存儲和分發記錄的系統,負責記錄節點相關的各種信息,便于連接管理和內容尋址。
* **Discovery - 發現**
發現和識別網絡中的其他節點。
mDNS-discovery是一種局域網上使用mDNS的發現協議。它發出mDNS信標來探測是否有更多可獲得的節點。由于低延遲的特性,局域網節點是非常適用p2p協議的。
mDNS-discovery是一個獨立的協議,不依賴于任何其它的libp2p協議。mDNS-discovery能夠發現局域網中可用的節點,而不需要依賴于其它的基礎組件。在內網、不與Internet骨干網連接的網絡、暫時失去連接的網絡中,這樣做是非常有用的。
mDNS-discovery可以按照服務配置(例如,僅僅發現加入特定協議的節點,比如ipfs),也支持私有網絡(發現屬于同一個私有網絡的節點)。
Random-walk是DHT(以及其它有路由表的協議)的發現協議。它會進行隨機DHT查詢,以便快速了解到大量的節點。這使得DHT(或其他協議)收斂的更快,其代價是一開始時的小負載。
Bootstrap-List是一種發現協議,它使用本地存儲來緩存網絡中可用的、高度穩定且可信的節點地址。這允許協議發現網絡的其余部分。這本質上和DNS引導自身的方式基本相同。
**Libp2p 流程**
1. 運行 Libp2p 協議的節點在初始化之后需要通過各種方式發現更多的節點,比如Bootstrap list、mDNS、DHT 等,這主要由**Discovery(發現)模塊**負責與實現。
2. Libp2p 會把這些獲取到的節點信息存儲在**分布式記錄存儲模塊**中,供以后方便使用。
3. 當上層應用需要連接某個節點時,**節點路由模塊**會找到多條不同的路徑,**連接管理模塊**會對這些路徑進行嘗試連接。(由于P2P網絡本身的特性,節點之間的連接狀況始終在動態變化,故不是所有路徑都是可以成功連接的~)
4. 連接成功之后,上層應用將通過 Libp2p 與連接節點進行交互,互相傳遞數據 。
連接的建立過程,主要包括3個步驟,包括**地址解析、傳輸協議適配、雙方協商。**
**地址解析**
為了適應復雜的網絡環境,libp2p 支持多種不同的底層協議,甚至 IPFS 社區專門立了一個項目來標準化節點的地址。目前 libp2p 主要支持以下幾種地址格式:
* `**/ip4/127.0.0.1/tcp/4001/ipfs/QmNodeID**`: 這種格式跟傳統的 TCP 網絡里是一樣的,直接可以解析出對應的 IPv4 地址和端口號;
* `**/ipfs/QmNodeID**`: 這種格式的地址適用于 IPFS 網絡,只有節點ID的地址,需要節點路由模塊找到節點對應的IP地址,然后再進行連接;
* `**/dns4/http://ipfs.ipfsbit.com/tcp/443/wss/p2p-webrtc-star**`: 這種地址需要調用`multiaddr-dns`組件,把域名解析成IP地址,然后再進行連接;
* `**/p2p-circuit/p2p/QmNodeID**`: 這種地址是relay地址,用于中繼網絡,需要首先連接一個中繼節點,才能連接到目的節點;
通過地址解析,libp2p能獲知如何才能連接到目的節點,下一步就是嘗試建立連接。
**傳輸協議適配**
地址里面的`/tcp`、`/quic`、`/ws`、`/p2p`分別對應不同的傳輸協議實現。libp2p 定義了統一的傳輸協議接口標準,選擇地址對應的傳輸協議,調用傳輸協議的連接函數嘗試連接目的節點。
**雙方協商**
連接建立之后,libp2p 會首先進行雙方協商,確定對方支持哪些功能。負責協商功能的是identify協議,它是內置在 libp2p 的基礎協議,能夠交換節點的公鑰、本地監聽地址等。
協商完成后,連接兩端的節點會找到共同支持的協議,并且初始化它們。初始化時會注冊每種協議的handler(回調函數),當有協議數據到達時,相應的handler就會被調用。由于多種傳輸協議會復用同一個底層連接,所以連接會被拆分成多個“流(Stream)”。
Libp2p 可以通俗理解成適用于多種傳輸協議的P2P網絡層。由于目前網絡模式多種多樣,比如4G 網絡/寬帶網絡,撥號/固定公網IP,以及還有著各式各樣的傳輸協議(TCP、UDP等等)和網絡防火墻的通信阻礙,所以導致這個協議的實現是非常復雜的。
Libp2p 實現了在不同的網絡模式下,節點之間能夠互相進行通信并傳送數據。
**通信模塊-Streams**
網絡層處理所有關于連接到一個節點的問題,并且暴漏出簡單的雙向流。用戶既可以打開一個新的流(NewStream),也可以注冊一個流處理器(SetStreamHandler)。之后用戶可以自由的實現他想要的任何消息傳遞協議。這使得構造一個p2p協議更簡單,因為連接、多傳輸支持、流控制等的復雜度得到了處理。
- 重要更新說明
- linechain發布
- linechain新版設計
- 引言一
- 引言二
- 引言三
- vs-code設置及開發環境設置
- BoltDB數據庫應用
- 關于Go語言、VS-code的一些Tips
- 區塊鏈的架構
- 網絡通信與區塊鏈
- 單元測試
- 比特幣腳本語言
- 關于區塊鏈的一些概念
- 區塊鏈組件
- 區塊鏈第一版:基本原型
- 區塊鏈第二版:增加工作量證明
- 區塊鏈第三版:持久化
- 區塊鏈第四版:交易
- 區塊鏈第五版:實現錢包
- 區塊鏈第六版:實現UTXO集
- 區塊鏈第七版:網絡
- 階段小結
- 區塊鏈第八版:P2P
- P2P網絡架構
- 區塊鏈網絡層
- P2P區塊鏈最簡體驗
- libp2p建立P2P網絡的關鍵概念
- 區塊鏈結構層設計與實現
- 用戶交互層設計與實現
- 網絡層設計與實現
- 建立節點發現機制
- 向區塊鏈網絡請求區塊信息
- 向區塊鏈網絡發布消息
- 運行區塊鏈
- LineChain
- 系統運行流程
- Multihash
- 區塊鏈網絡的節點發現機制深入探討
- DHT
- Bootstrap
- 連接到所有引導節點
- Advertise
- 搜索其它peers
- 連接到搜到的其它peers
- 區塊鏈網絡的消息訂發布-訂閱機制深入探討
- LineChain:適用于智能合約編程的腳本語言支持
- LineChain:解決分叉問題
- LineChain:多重簽名
- libp2p升級到v0.22版本
- 以太坊基礎
- 重溫以太坊的樹結構
- 世界狀態樹
- (智能合約)賬戶存儲樹
- 交易樹
- 交易收據樹
- 小結
- 以太坊的存儲結構
- 以太坊狀態數據庫
- MPT
- 以太坊POW共識算法
- 智能合約存儲
- Polygon Edge
- block結構
- transaction數據結構
- 數據結構小結
- 關于本區塊鏈的一些說明
- UML工具-PlantUML
- libp2p介紹
- JSON-RPC
- docker制作:啟動多個應用系統
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基礎操作整理
- jupyter計算交互環境
- git技巧一
- git技巧二
- 使用github項目的最佳實踐
- windows下package管理工具