Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Сделать бы пира для DHT наноборды... #21

Open
username1565 opened this issue May 12, 2022 · 9 comments
Open

Сделать бы пира для DHT наноборды... #21

username1565 opened this issue May 12, 2022 · 9 comments

Comments

@username1565
Copy link
Owner

В пиринговых сетях - пир, это и сервер и клиент - одновременно. Пиры - равноправны.
Думаю, можно сделать p2p-наноборду, как-бы отдельно, или даже опционально.
Пока нашёл это https://github.com/username1565/Chord-DHT но это на плюсах, а не на шарпе.

Опишу пока в виде идеи следующее:

Сервер.
TCP-сервер.
Коннектится на порт.

Клиент.
Отправляет запрос мультикастом на 255.255.255.255
Получает ответы от нод, где они есть.
Соединяется с ними.
Пишет их IP'ы - в DHT.

Когда клиент соединяется с сервером, DHT отдаётся ему, и так она синхронизируется между пирами.
Клиент пытается подключиться на IP'ы из DHT.

Когда подключение есть, другая DHT с нанопостами, может синхронизироваться по подключению.

Вот это надо бы сделать. Пилить нет сил уже, но оставлю это - для потомков.

@username1565
Copy link
Owner Author

Вот ещё https://github.com/username1565/pastry-DHT из той статьи на википедии

@username1565
Copy link
Owner Author

Нашёл это: https://github.com/username1565/rhino-dht
Как юзать не знаю. но форкнул. Компилируется в dll-файл.

@username1565
Copy link
Owner Author

форкнул это https://github.com/username1565/simple-p2p-demo но пока не разобрался как оно работает.

@username1565
Copy link
Owner Author

Перерыл весь гитхаб, нифига не нашёл.
Короче, задача, сделать распределённую и децентрализованную хэш-таблицу key-value,
которая синхронизируется между пирами.
С# (CSharp), .NET Fmamework 4.0 или даже .NET 3.5.

Как я это вижу?

  1. Нода, peer - это [url=https://metanit.com/sharp/net/4.3.php]клиент и сервер[/url] одновременно.
  2. Список активных пиров сохраняется и синхронизируется между ними (Peer-Exchange).
  3. После запуска ноды, и поднятия сервера, клиент пытается подключиться к другим пирам из списка,
    а если не получается, то отправляя запросы мультикастом на 255.255.255.255.
    Если какой-то из них откликается - с ним устанавливается соединение, и его IP добавляется в список активных пиров.
  4. После подключения и добавления пира в список пиров, с ним удерживается активное TCP-соединение.
  5. Через это соединение - синхронизирутся общая хэш-таблица или Dictionary, вида {"хэш":"значение", "хэш1":"значение1", }.
  6. Хэш-таблица может иметь размер сотни гигов, поэтому надо бы как-то по кускам её отдавать.

Идея сырая, как кодить не знаю.

@username1565
Copy link
Owner Author

Поиск пиров в локальной сети, может осуществляться Multicast'ом.
Multicast поддерживает протокол UDP.
Однако, в наноборде, используется TCP-сервер.
Можно поднять сразу два сервера, как-то вот так: https://stackoverflow.com/questions/46882815/c-sharp-sockets-tcp-udp/46927710#46927710
Но как вкодить всё это - не знаю.

@username1565
Copy link
Owner Author

Короче, к чему я пришёл...
Есть два протокола TCP/IP и UDP.
Наноборда использует TCPServer (TcpServer.cs и HTTP-сервер по TCP).
Можно объединить TCP и UDP-сервер вместе, как-то вот так: https://github.com/username1565/CSharpServers/tree/TCPUDPChat
используя один и тот же порт и для TCP-соединений, и для UDP тоже.

UDP поддерживает широковещательную рассылку - Multicast: https://metanit.com/sharp/net/5.2.php
А значит, в локальной сети, можно искать пиров, отправляя multicast-запросы по UDP-протоколу.

После всего этого, как можно сделать пира?..

Tcp/UDP-сервер.
Peer Discovery over UDP Multicast.
Peer Exchange.

Как это работает?
Пир, это и клиент и сервер одновременно.
Когда запускается пир - поднимается TCP/UDP сервер, который слушает один и тот же TCP/UDP порт,
и может отвечать как на TCP-запросы, так и на UDP-запросы.

Peer Discovery (UDP Multicast)
Для поиска пиров в локалке, первым пиром, как клиентом,
производится рассылка UDP-сообщений, мультикастом.
Если другой пир получает UDP-запрос от какого-либо пира, то он как сервер - отвечает своим IP и TCP/UDP-портом.
Если другой пир ответил на UDP-запрос первго пира,
то IP:порт попадает в список пиров (Dictionary) на первом пире.
Дальше, первый пир пытается подключиться на этот IP:PORT, по TCP, и соединиться с ним.

Peer Exchange (Synchonize DHT)
После соединения, они синхронизируют список пиров (Dictionary).

Пока, это общие принципы, как вкодить - хз.

@username1565
Copy link
Owner Author

Пира буду делать здесь https://github.com/username1565/CSharpServers/tree/Peer

@username1565
Copy link
Owner Author

Чтобы раздать хэш-таблицу в децентрализованной сети,
для начала следует её написать.
Здесь, некое подобие хэш-таблицы: https://github.com/username1565/nanoboard/blob/master/nanodb.exe-source/Database/PostDb.cs , но она какая-то не похожая на хэш-таблицу.

Очевидно, что хэш-таблица - это структура данных ("ключ-значение"), в ключе которой - находится уникальнейший хэш.
Поэтому, нужно реализовать хранение структуры "key-value".
Судя по запросу https://github.com/topics/key-value-store?q=key-value+csharp - на гитхабе не густо, всего три репозитария:
https://github.com/JeringTech/KeyValueStore
https://github.com/kirubasankars/kdb
https://github.com/Andreas-Dorfer/in-memory-store

Поэтому пилить Key-Value database буду вот здесь: https://github.com/username1565/KeyValue

@username1565
Copy link
Owner Author

Тут, короче пир https://github.com/username1565/CSharpServers/tree/Peer
Пока, что он синхрит только примитивную хэш-таблицу, скидываемую в txt-файл.
https://github.com/username1565/KeyValue/tree/SimpleTXTStorage
SQLite3 не впиливался, но это несложно.
Вопрос теперь в том, как базу данных наноборды в хэш-таблицу конвертнуть.
Пердолинга будет немало, задним местом чую.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant