分析比特幣網路:一種去中心化、點對點的網路架構

Tiny熊發表於2017-11-07

最新內容會更新在主站深入淺出區塊鏈社群
原文連結:分析比特幣網路:一種去中心化、點對點的網路架構

比特幣採用了基於網際網路的點對點(P2P:peer-to-peer)分散式網路架構。
比特幣網路可以認為是按照比特幣P2P協議執行的一系列節點的集合。
本文來分析下比特幣網路,瞭解它跟傳統中心化網路的區別,以及比特幣網路是如何發現相鄰節點的。

中心化網路

為了更好的理解P2P網路,我們先來看看傳統的中心化模型:

中心化網路模型

這是一種典型的星型(“中心化”)結構,我們常見B/S及C/S網路架構就是這種模型,C1 、C2 、C3等之間沒法直接的連線,C節點如果要連線必須要通過中心化S節點做為橋樑。
中心化節點充當服務者、中介作用,比如我們沒有辦法把資金直接從一個人轉移給另一個人,必須通過銀行這個中介。

P2P網路

P2P網路是指位於同一網路中的每臺計算機都彼此對等,各個節點共同提供網路服務,不存在任何“特殊”節點,每個網路節點以扁平(flat)的拓撲結構相互連通。
p2p網路模型

對比中心化網路,在P2P網路中不存在任何服務端(server)、中央化的服務。
P2P網路的節點之間互動連線、協同,每個節點在對外提供服務的同時也使用網路中其他節點所提供的服務,每個節點即是服務端又是客戶端。
P2P網路模型除應用於比特幣網路,使用廣泛的BT下載就是基於P2P網路。

P2P網路不僅僅去除了中心化帶來的風險(中心化可能作惡),還可以提高傳輸的效率。(中心化網路當能也有優點)

如何發現節點

既然每個網路節點都是平等的(是指在網路層面上節點是平等的,但各節點在功能上可以有不同的分工, 如錢包節點、挖礦節點等),不存在任何“特殊”中心節點,那麼當新的網路節點啟動後,它是如何跟其他的節點建立連線,從而加入到比特幣網路呢?

在中心化網路中,新加入的節點只要連線“特殊”的中心節點就可以加入網路。

為了能夠加入到比特幣網路,比特幣客戶端會做一下幾件事情:

  1. 節點會記住它最近成功連線的網路節點,當重新啟動後它可以迅速與先前的對等節點網路重新建立連線。

  2. 節點會在失去已有連線時嘗試發現新節點。

  3. 當建立一個或多個連線後,節點將一條包含自身IP地址訊息傳送給其相鄰節點。相鄰節點再將此訊息依次轉發給它們各自的相鄰節點,從而保證節點資訊被多個節點所接收、保證連線更穩定。

  4. 新接入的節點可以向它的相鄰節點傳送獲取地址getaddr訊息,要求它們返回其已知對等節點的IP地址列表。節點可以找到需連線到的對等節點。

  5. 在節點啟動時,可以給節點指定一個正活躍節點IP, 如果沒有,客戶端也維持一個列表,列出了那些長期穩定執行的節點。這樣的節點也被稱為種子節點(其實和BT下載的種子檔案道理是一樣的),就可以通過種子節點來快速發現網路中的其他節點。

節點通訊簡述

比特幣節點通常採用TCP協議、使用8333埠與相鄰節點建立連線, 建立連線時也會有認證“握手”的通訊過程,用來確定協議版本,軟體版本,節點IP,區塊高度等。

當節點連線到相鄰節點後,接著就開始跟相鄰節點同步區塊鏈資料(輕量級錢包應用其實不會同步所有區塊資料),節點們會交換一個getblocks訊息,它包含本地區塊鏈最頂端的雜湊值。如果某個節點識別出它接收到的雜湊值並不屬於頂端區塊,而是屬於一個非頂端區塊的舊區塊,就說其自身的本地區塊鏈比其他節點的區塊鏈更長,並告訴其他節點需要補充區塊,其他節點傳送getdata訊息來請求區塊,驗證後更新到本地區塊鏈中。

深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術部落格

相關文章