Protocol

發送多少地址以響應 getaddr 消息?

  • June 3, 2016

我一直在嘗試確定節點在收到 getaddr 消息時發送的地址數量,但我有點困惑。

一方面,在 addrman.h/.cpp 我可以看到:

// the maximum percentage of nodes to return in a getaddr call
#define ADDRMAN_GETADDR_MAX_PCT 23

// the maximum number of nodes to return in a getaddr call
#define ADDRMAN_GETADDR_MAX 2500

[…]

int nNodes = ADDRMAN_GETADDR_MAX_PCT*vRandom.size()/100;
if (nNodes > ADDRMAN_GETADDR_MAX)
   nNodes = ADDRMAN_GETADDR_MAX;

所以看起來發送的地址數量是兩個條件中較小的一個,即 23% 的(活動已知)節點或 2500 個節點。

但另一方面,來自比特幣維基

getaddr 消息向節點發送請求,詢問有關已知活動對等點的資訊,以幫助辨識網路中的潛在節點。對接收到該消息的響應是與來自已知活動對等點的數據庫的一個或多個對等點一起傳輸 addr 消息。

…和…

[關於地址資訊]如果發件人發送了超過 1000 個地址,它們都將被忽略。

那麼,如果接收方要丟棄它們,為什麼節點會嘗試發送 2500 個地址呢?為什麼不發送最多 1000 個地址?

來自的結果CAddrMan::GetAddr()被饋送到CNode::PushAddress,它過濾掉對等方已經擁有的地址,並將它們插入到最多 1000 個地址的臨時緩衝區中。

稍後,在 中SendMessages(),該緩衝區的內容會定期發送出去。

根據 wiki 的說法,這些似乎是**“正在進行的“addr”廣告”**,因此是不請自來的。

引用自:https://bitcoin.stackexchange.com/questions/18673