p2p網路中的節點發現之UDP

2021-09-02 14:59:57 字數 1008 閱讀 2167

server啟動的時候,除了監聽本地的tcp埠之外,還啟動了udp埠的監聽,而且udp埠的監聽與udp通訊在節點發現的時候起著關鍵作用。

先看下為什麼udp在節點發現中起著關鍵作用。

在 介紹了在節點啟動後連線到bootnode節點,然後每隔15s向bootnode傳送reqnodesmsg請求其他節點資訊,收到bootnode節點返回的resnodesmsg資訊後,將節點資訊放入到buckets中。前文介紹的節點的連線,nodesmsg的互換等都是通過tcp連線進行的。但在將節點資訊放入buckets之前,是有乙個節點的校驗的,這裡的校驗是通過udp pingpong來實現的,如果udp的ping訊息得不到正確的回應,則當前節點是不會加入到buckets中的,所以說udp在這裡是起了關鍵作用。具體**可參照table.go中的pingpong函式,從ping函式中可以看到,tab.net是實現ping的關鍵,這裡的net就是包含了udp連線的結構體,下面看一下這個net的**。

在server啟動的時候,有乙個udp埠的監聽,即下面的**

ntab, ourend, err := discover.listenudp(…)

在這個函式中主要做了3件事

1、通過resolveudpaddr查詢埠和ip位址是否可用,並返回乙個udpaddr

2、通過listenudp監聽udp埠,建立乙個接收目的地是本地位址udpaddr的udp資料報的網路連線conn,此連線

3、封裝乙個新的udp結構體,在這個newudp中有個newtable,傳參為udp,對應的就是table.net屬性。這就解釋了net的**問題。

4、在newudp中還啟動了兩個執行緒,loop()和readloop()。其中loop()中主要是對收到的訊息進行校驗,readloop中主要是接收來自其他節點的訊息,這裡的訊息包括ping訊息,pong訊息,nodereq,noderes訊息,主要是ping,pong訊息,實際上節點資訊交換用的tcp,而不是這裡的udp。

另外從**send函式中可以看出udp的訊息傳遞是明文的,並沒有進行加密,只是做了下簽名

P2P網路中的節點發現

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

P2P網路中UDP穿越NAT的原理

p2p網路中,udp穿越nat方式主要有 中轉方式 relay 反向連線 connection reversal udp打洞 udp hole punching 中轉方式是最簡單也是比較可靠的nat穿越方法,它將p2p通訊簡單地轉換為客戶端 伺服器通訊模式。假如有a和b兩個客戶端和乙個公共伺服器s,...

P2P之UDP穿透的簡單實現方式

full cone nat 內網主機建立乙個udpsocket localip localport 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網 publicip publicport 以後用這個socket向外面任何主機傳送資料都將使用這對 publicip public...