<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # Go-libp2p Protocol Labs旗下目前有五個明星項目,每一個都有其獨特的定位和功能。五個項目彼此獨立又聯系,旨在建立一個更安全、高效、開放的網絡。在Protocol Labs的官網我們可以找到上面5個項目,即IPFS、Filecoin、Libp2p、IPLD、Multiformats。 ![](https://img.kancloud.cn/bd/5c/bd5c9ac8be4d0349b93e68e045ec280d_1926x1345.png) 其中,**Libp2p是一個模塊化的網絡棧**,通過將各種傳輸和P2P協議結合在一起,使得開發人員很容易構建大型、健壯的P2P網絡。 ![](https://img.kancloud.cn/58/8b/588bb6d46df564b2534273db9886852a_1192x1055.png) 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協議更簡單,因為連接、多傳輸支持、流控制等的復雜度得到了處理。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看