Я создаю сеть p2p без главного узла. Как подсчитать общие живые узлы? Точность - это не ключевой, но легкий и эффективный.Как оценить общее количество узлов в сети P2P?
В настоящее время я имею в виду два подхода, оба из них имеют большой недостаток ...
Каждый узел имеет случайное число в качестве идентификатора. Каждый узел имеет огромный бит-массив, изначально только бит в index == ID равен 1 и другим 0. Каждый узел обменивает его бит-массив с известными одноранговыми узлами. Битовый массив узла объединяется со сверстниками, используя бит OR. По ходу этого процесса каждый узел должен иметь аналогичный бит-массив, а число 1 указывает количество узлов в сети. Преимущество состоит в том, что это можно сделать параллельно и по времени. Во время запроса ответ может быть очень быстрым (потому что результат уже существует). Недостатки: а). Трудно обрабатывать узлы, которые ушли. б). Битовый массив слишком велик, если есть миллионы узлов.
Что-то вроде BFS. Из исходного узла он запрашивает у всех известных одноранговых узлов, сколько узлов связано. Затем суммируйте все ответы как общий размер тестируемой сети. Это подход рекурсии. Если узел уже получил такой запрос, он будет игнорировать тот же самый запрос от других узлов. Также как BFS. Недостатком является то, что это имеет высокую вероятность быть неточным. Если посмотреть на дерево BFS, для каждого узла это может быть одноточечный сбой, из-за чего весь запрос с этого узла отсутствует. Рассмотрим инициализацию запроса от узла A, запрос подключенных узлов B & C. B & C затем распространите запрос в сеть, к которой они подключаются. По какой-то причине C терпит неудачу и не может ответить на A. Тогда все узлы, получающие прямой или косвенный запрос из C, не будут учитываться. Эта проблема может произойти в любом узле сети и может привести к минимальной неточности или большой неточности, как в вышеупомянутом подходе, вероятно, к 50% сети.
Любая идея, как практически оценить общие узлы в сети P2P?
Возможно, вам не нужен центральный сервер, но вам, по крайней мере, нужен «лидер» для возврата результирующего количества подключений. Вы можете отправить событие «считайте свои подключения», но вы не можете гарантировать, что ответ будет успешно возвращен, и если бы это было так, то вам нужно было бы суммировать результат этого запроса и последующие подключения как-то надежно –