從Java角度看區塊鏈實踐系列3——P2P網絡:區塊鏈P2P網絡拓撲結構的演變史

這一節我將從網絡連接開始爲大家介紹主流的幾種區塊鏈p2p網絡結構,讓大家對區塊鏈網絡更加深層次的理解。

網絡連接

網絡連接是指網絡在應用級的互聯。在我們生活中無處不在,比如:人們使用的手機Wifi無限網絡、有點交換機網絡。網絡連接類型定義了網絡所連接設備的多少和方式,從而決定了網絡的通信機制。網絡連接類型在物理上僅有點到點連接和多點連接兩種。

點到點連接

點到點連接,這樣的網絡只涉及兩臺設備,例如,兩臺筆記本之間互聯進行數據傳輸。

多點連接

顧名思義,指三臺或多臺設備之間的連接組成的網絡。計算機網絡普遍是多點連接的。

網絡連接的機器之間通過傳輸層協議進行數據傳輸,目前除卻少數區塊鏈項目使用UDP協議以外,絕大部分都採用TCP/IP協議。

P2P網絡拓撲結構

P2P全稱“peer-to-peer”,顧名思義,就是網絡上節點到節點之間的網絡連接。網絡中的節點,既是資源服務的提供者,也是接受者,也就是說各個節點共同提供網絡服務,節點間是平等的,不存在任何“特殊”節點。

P2P網絡技術解決的兩個問題,一是資源定位,二是資源獲取。P2P網絡拓撲結構大致分爲四類中心化、全分佈式非結構化、全分佈式結構化、半分佈式。

中心化拓撲結構

即存在一箇中心節點保存了其他所有節點的索引信息,索引信息一般包括節點 IP 地址、端口、節點資源等。類似QQ就是此種網絡拓撲結構。

中心化拓撲結構

缺點

1、節點規模擴展時容易出現性能瓶頸;

2、存在單點故障問題,中央索引服務器的癱瘓容易導致整個網絡的崩潰,因此可靠性和安全性較低。

比較適合小型網絡而言,對於大型網絡會放大上述有限。

全分佈式非結構化拓撲結構

即在一個新加入節點和 P2P 網絡中的某個節點間隨機建立連接通道,從而形成一個隨機拓撲結構。

節點與節點之間的傳輸過程更接近“泛洪算法即:交易從某個節點產生,接着廣播到臨近節點,臨近節點一傳十十傳百,直至傳播到全網。

區別於中心化拓撲結構,他沒有中央服務器,每臺機器在網絡中是真正的對等關係。

全分佈式非結構化拓撲的P2P網絡

缺點

1、由於是非結構化的網絡,所以是一個完全的隨機圖,節點之間的鏈路不遵循預定義的拓撲結構,所以一般而言不提共任何性能保障;

2、存在分區,斷鏈現象;

優點

容錯性好,並且少數節點的頻繁加入退出對系統影響小

全分佈式結構化拓撲結構

全分佈式結構化拓撲的P2P網絡是採用分佈式散列表(Distributed Hash Table, 簡寫成DHT)技術來組織網絡中的結點,通過這類技術可以實現網絡的結構化,例如代表性的算法有Tapestry,Pastry,Chord和CAN。

Pastry 是微軟研究院提出的可擴展的分佈式對象定位和路由協議,可用於構建大規模的P2P系統。在Pastry中,每個結點分配一個128位的結點標識符號(nodeID) ,所有的結點標識符形成了一個環形的nodeID空間,範圍從0到2128 - 1 ,結點加入系統時通過散列結點IP地址在128位nodeID空間中隨機分配。

Pastry

半分佈式拓撲結構

混合了集中式和分佈式結構如下圖所示,網絡中存在多個超級節點組成分佈式網絡,而每個超級節點則有多個普通節點與它組成局部的集中式網絡。

一個新的普通節點加入,則先選擇一個超級節點進行通信,該超級節點再推送其他超級節點列表給新加入節點,加入節點再根據列表中的超級節點狀態決定選擇哪個具體的超級節點作爲父節點。

半分佈式拓撲結構

這種結構的泛洪廣播只發生在超級節點之間,可以避免大規模泛洪存在的問題。在實際應用中,混合式結構是相對靈活並且比較有效的組網架構,實現難度也相對較小,因此目前較多系統基於混合式結構進行開發實現。其實,比特幣網絡如今也是這種結構。

Ok,以上我們詳細的講解了P2P網絡拓撲結構,接下來進入正題,我們以比特幣P2P網絡爲例,那麼它又和我們上訴所說的有什麼區別呢?

首先我們知道,P2P是點對點的網絡,既然是點對點,那就存在着節點的發現(定位)以及交互,接下來我們就從這兩部分進行講解。

網絡節點發現

節點發現是任何區塊鏈節點接入區塊鏈 P2P 網絡的第一步。節點發現可分爲初始節點發現啓動後節點發現

初始化節點發現

一般分爲兩種,DNS-send和hard-code。

1、DNS方式:初始化時會進行中心化域名查找,比特幣的社區維護者會維護一些域名。

2、硬編碼方式:在代碼中硬編碼一些地址,這些地址我們稱之爲子節點,初始化時會嘗試進行連接。當所有的種子節點全部失效時,全節點會嘗試連接這些種子節點。

啓動後節點發現

在 Bitcoin 的網絡中,一個節點可以將自己維護的對等節點列表 (peer list) 發送給臨近節點,所以在初始節點發現之後,你的節點要做的第一件事情就是向對方要列表

在以太坊網絡中,也會維護類似的一個節點列表 (NodeTable),但是這個節點列表與比特幣的簡單維護不同,它採用了 P2P 網絡協議中一個成熟的算法,叫做 Kademlia 網絡,簡稱 KAD 網絡。

它使用了 DHT 來定位資源,全稱 Distributed Hash Table,中文名爲分佈式哈希表。KAD 網絡會維護一個路由表,用於快速定位目標節點。由於 KAD 網絡基於 UDP 通信協議,所以以太坊節點的節點發現是基於 UDP 的,如果找到節點以後,數據交互又會切換到 TCP 協議上。

資源定位——局域網穿透

區塊鏈的 P2P 網絡結構是一種全分佈式的拓撲結構但是,如今我們的網絡環境是由局域網和互聯網組成的。那麼公網上的節點怎麼發現你部署在局域網中的節點呢?

如果這個局域網是你可以控制的,那很好說,只需要在 VPC 網絡中配置路由,將公網 IP 和端口映射到局域網中你的 IP 和端口即可內網穿透

如果是不可控制又怎麼辦呢?辦法就是NAT 技術和 UPnP 協議

NAT技術簡而言之,就是替換TCP報文中的源地址並映射到內網。

UPnP是通用即插即用(Universal Plug and Play)的縮寫它主要用於設備的智能互聯互通,所有在網絡上的設備馬上就能知道有新設備加入。

比特幣和以太坊均使用了 UPnP 協議作爲局域網穿透工具,只要局域網中的路由設備支持 NAT 網關功能、支持 UPnP 協議,即可將你的區塊鏈節點自動映射到公網上。

資源獲取——節點間交互協議

一旦節點建立連接以後,節點之間的交互是遵循一些特定的命令這些命令寫在消息的頭部,消息體寫的則是消息內容。

命令分爲兩種,一種是請求命令(Ping),一種是數據交互命令(Pong)

節點連接後第一件事就是握手這一點在比特幣和以太坊上的流程是差不多的,就是相互問候一下,提供一些簡要信息。比如先交換一下版本號,看看是否兼容。只是以太坊爲握手過程提供了對稱加密,而比特幣沒有。

通過這種方式(握手),節點獲得可連接的對等節點列表,同時它也會向網絡發佈自己的消息以便其他節點查找。節點在本地會保存上次連接的同步對等節點信息,因此,當節點重啓時它可以快速與先前的對等節點重新建立連接。

Ping機制可以維護節點間的連接,如果節點持續某個連接長達90分鐘沒有任何通信,它會被認爲已經從網絡中斷開,網絡將開始查找一個新的對等節點。因此,比特幣網絡會隨節點和網絡的變化進行動態有機調整,而不需要進行中心化的控制,這就是去中心化自制

總結

這一節我們我們主要講解了P2P演變史,我們理解比特幣P2P網絡通訊打下基礎,在下一節我們將會根據不同節點論述他們不同的通訊方式。

 

參考文獻:

《精通比特幣第二版》

P2P網絡的拓撲結構

區塊鏈100問

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章