P2P網路中的節點發現

2021-08-28 12:36:25 字數 1242 閱讀 7739

在p2p網路中,要發現並連線其他節點,常見的是通過種子節點連線到網路,然後通過種子節點獲取其他節點的位址。以太坊的種子節點在cmd/swarm/bootnodes.go中定義,hpb的種子節點在config/networkconfig.go中定義

以hpb節點為例說明:以太坊基本是一樣的。

1、節點啟動的時候呼叫server.go的start(),除了建立監聽埠之外,還需要將bootnodes資訊新增到靜態節點變數中,通過setfallbacknodes函式和newdialstate函式實現

2、在start的最後go run(),開啟連線節點的任務

3、在server.go 的run()中,通過newtasks函式建立新的連線任務,在newtasks中可以看到,節點資訊的**有兩個:乙個是靜態節點,乙個是ntab的buckets。節前剛啟動的時候buckets當然是空的,只能靠靜態節點,即bootnodes接入網路。

4、有了任務,就可以連線對應的節點了,run函式中通過starttasks函式進行節點的連線,實際執行的函式是task.do()–>dial.go中的dialtask.dial()。 通過dialer.dial()建立tcp連線,然後通過setupconn進行握手校驗。校驗通過後連線正式建立,校驗失敗會斷開連線。

以上即為bootnode的連線,到此,新節點已連線成功bootnode,接下來需要通過bootnode獲取其他節點資訊並建立連線。

6、在setupconn的最後有個checkpoint函式,至此觸發addpeer事件。 addpeer事件的處理在第3步提到的run函式中。然後通過server.runpeer(),實際為peerbase.run()來保持連線。

7、在peerbase.run()中,可以看到有個 go updatenodesloop(),在這裡將開始於bootnode請求其他節點資訊。

8、從updatenodesloop函式可以看出,這裡通過定時器每15s進行一次節點請求。

9、當前節點在收到bootnode返回的節點後,在protocol.go的handleresnodesmsg函式中處理,通過bondall函式一步一步將所有節點資訊寫入自己的buckets中。(其中bootnode收到請求後,在protocol.go的handelreqnodesmsg函式中處理,將自己的節點從buckets取出並發給請求者。)

10、至此,重複第3步的時候,buckets中就有了其他節點的資訊,可以與其他節點進行連線了。

在實際應用中,能拿到網路中所有節點的資訊,可能受作業系統,防火牆,網路等因素影響不一定所有的節點都能連線上。

p2p網路中的節點發現之UDP

server啟動的時候,除了監聽本地的tcp埠之外,還啟動了udp埠的監聽,而且udp埠的監聽與udp通訊在節點發現的時候起著關鍵作用。先看下為什麼udp在節點發現中起著關鍵作用。在 介紹了在節點啟動後連線到bootnode節點,然後每隔15s向bootnode傳送reqnodesmsg請求其他節點...

P2P網路模型

1 靜態配置模型 靜態配置模型是一種相對靜態而簡單的對等點定位模型。在該模型中,每個對等點都確切地知道存在於其p2p 網路中其它對等點的位置以及它們所提供的共享資源內容。缺點 網路無法應付不能預知的隨機事件和臨時變更,比如對等點隨機進入和退出網路。優點 整個網路在外部攻擊面前表現得很穩固。2 動態配...

P2P 殭屍網路入門

當人們正大肆宣傳zeroaccess被攻克的訊息,malwaretech 博主認為是時候介紹一下p2p殭屍網路 botnets 了。包括殭屍網路的工作原理和應對方法。傳統殭屍網路圖例 無論使用http irc或是其他協議,傳統殭屍網路的構成都是相同的。所有的殭屍主機 bot 都通過乙個或多個網域名稱...