本文首發於深刻淺出區塊鏈社區 原文連接:分析比特幣網絡:一種去中心化、點對點的網絡架構原文已更新,請讀者前往原文閱讀網絡
比特幣採用了基於互聯網的點對點(P2P:peer-to-peer)分佈式網絡架構。 比特幣網絡能夠認爲是按照比特幣P2P協議運行的一系列節點的集合。 本文來分析下比特幣網絡,瞭解它跟傳統中心化網絡的區別,以及比特幣網絡是如何發現相鄰節點的。架構
爲了更好的理解P2P網絡,咱們先來看看傳統的中心化模型: 分佈式
這是一種典型的星型(「中心化」)結構,咱們常見B/S及C/S網絡架構就是這種模型,C1 、C2 、C3等之間無法直接的鏈接,C節點若是要鏈接必需要經過中心化S節點作爲橋樑。 中心化節點充當服務者、中介做用,好比咱們沒有辦法把資金直接從一我的轉移給另外一我的,必須經過銀行這個中介。學習
P2P網絡是指位於同一網絡中的每臺計算機都彼此對等,各個節點共同提供網絡服務,不存在任何「特殊」節點,每一個網絡節點以扁平(flat)的拓撲結構相互連通。 區塊鏈
對比中心化網絡,在P2P網絡中不存在任何服務端(server)、中央化的服務。 P2P網絡的節點之間交互鏈接、協同,每一個節點在對外提供服務的同時也使用網絡中其餘節點所提供的服務,每一個節點便是服務端又是客戶端。 P2P網絡模型除應用於比特幣網絡,使用普遍的BT下載就是基於P2P網絡。server
P2P網絡不單單去除了中心化帶來的風險(中心化可能做惡),還能夠提升傳輸的效率。(中心化網絡當能也有優勢)blog
既然每一個網絡節點都是平等的(是指在網絡層面上節點是平等的,但各節點在功能上能夠有不一樣的分工, 如錢包節點、挖礦節點等),不存在任何「特殊」中心節點,那麼當新的網絡節點啓動後,它是如何跟其餘的節點創建鏈接,從而加入到比特幣網絡呢?get
在中心化網絡中,新加入的節點只要鏈接「特殊」的中心節點就能夠加入網絡。同步
爲了可以加入到比特幣網絡,比特幣客戶端會作一下幾件事情:博客
節點會記住它最近成功鏈接的網絡節點,當從新啓動後它能夠迅速與先前的對等節點網絡從新創建鏈接。
節點會在失去已有鏈接時嘗試發現新節點。
當創建一個或多個鏈接後,節點將一條包含自身IP地址消息發送給其相鄰節點。相鄰節點再將此消息依次轉發給它們各自的相鄰節點,從而保證節點信息被多個節點所接收、保證鏈接更穩定。
新接入的節點能夠向它的相鄰節點發送獲取地址getaddr消息,要求它們返回其已知對等節點的IP地址列表。節點能夠找到需鏈接到的對等節點。
在節點啓動時,能夠給節點指定一個正活躍節點IP, 若是沒有,客戶端也維持一個列表,列出了那些長期穩定運行的節點。這樣的節點也被稱爲種子節點(其實和BT下載的種子文件道理是同樣的),就能夠經過種子節點來快速發現網絡中的其餘節點。
比特幣節點一般採用TCP協議、使用8333端口與相鄰節點創建鏈接, 創建鏈接時也會有認證「握手」的通訊過程,用來肯定協議版本,軟件版本,節點IP,區塊高度等。
當節點鏈接到相鄰節點後,接着就開始跟相鄰節點同步區塊鏈數據(輕量級錢包應用其實不會同步全部區塊數據),節點們會交換一個getblocks消息,它包含本地區塊鏈最頂端的哈希值。若是某個節點識別出它接收到的哈希值並不屬於頂端區塊,而是屬於一個非頂端區塊的舊區塊,就說其自身的本地區塊鏈比其餘節點的區塊鏈更長,並告訴其餘節點須要補充區塊,其餘節點發送getdata消息來請求區塊,驗證後更新到本地區塊鏈中。
☛ 深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
☛ 個人知識星球爲各位解答區塊鏈技術問題,歡迎加入討論。
☛ 關注公衆號「深刻淺出區塊鏈技術」第一時間獲取區塊鏈技術信息。