Перейти к содержимому
ProgramCrafter

ThunderNet - глобальная сеть OpenComputers

Рекомендуемые сообщения

На форуме в последнее время начали появляться темы с сетевыми библиотеками и браузерами.

Продолжу это движение (да, скоро и мой браузер будет). Итак, представляю вам ThunderNet!

 

Кстати, анонс уже был: вот это сообщение как раз рассказывало про пришествие ThunderNet.

ovC2Jdp.png

 

ThunderNet - это сеть, позволяющая объединить множество компьютеров OC, даже на разных серверах.

По топологии это (почти) дерево, при этом корнем может быть любой компьютер. Уровней может быть любое количество.

Компьютеры взаимодействуют по некоторому каналу: сетевая/соединённая карта/красный камень/Stem/звёздные врата и т.д.

 

Идентификация происходит при помощи MUID (Minecraft-Unique IDentifiers): кодов, уникальных для каждого запуска на каждом компьютере OC.

Скрытый текст

MUID состоит из следующих элементов:

- 14 бит - разность времени сервера и реального с точностью до 6 секунд

- 32 бита - IP сервера

- 4 бита - версия OpenComputers

- 1 бит - версия Lua

- 128 бит - адрес компьютера как компонента

- 128 бит - адрес EEPROM

- 128 бит - адрес загрузочного диска

- 4 бита - вид подключения к ThunderNet

- 7 бит - средний пинг до корневого узла ThunderNet

- 128 бит - случайные данные

- 128 бит - адрес временной ФС (папки /tmp)

 

Спецификация протокола:

1. Подключение к сети:

— WTC <uid> (Want-To-Connect)

Ближайшие компьютеры запоминают этого соседа и отвечают (или не отвечают)
— CAC <uid> <level> (Can-Accept-Connection)
    (level - глубина дерева от корня до отвечающего компьютера);

Подключаемый компьютер подтверждает соединение:
— AC  <uid> (Accept-Connection)

Отвечающий компьютер ("родитель") отправляет сообщение до корня:
— UCA <uid> (Underlying-Connection-Accepted)

Все компьютеры от корня до отвечающего запоминают, в каком направлении посылать сообщение новому.

2. Пересылка сообщений:

— RM  <message> <target-uid> (Retranslate-Message)

Компьютер, получивший такое сообщение, должен:
1) Если он знает путь до <target-uid>, переслать этот пакет по пути.
2) Если он не знает путь и не является корнем, отправить этот пакет родителю.
3) Если он не знает путь и является корнем, забыть это сообщение (потому что куда его отправить? некуда.)

При получении сообщения с target-uid, равным uid текущего компьютера, библиотека вызывает событие:
thunderlib_incoming <message>

3. Отключение от сети:

— DC  <disconnected-uid>

Компьютеры выше по дереву забывают путь до указанного компьютера и его потомков.

 

Моя реализация этого протокола:

Библиотека сейчас состоит из трёх файлов: th_inform.lua, thlib.lua и th_interfaces.lua.

Для работы их надо сложить в ту папку, откуда будет запускаться программа.

 

Важное замечание: все методы Thunderlib являются синхронными, т.е. блокируют вызывающий поток!

В некоторых функциях есть параметр is_timeout, который завершает выполнение, когда функция возвращает true.

Документация по методам:

thunderlib.connect([is_timeout])  - подключение к ThunderNet
thunderlib.disconnect()           - отключение
    Отключение после использования крайне рекомендовано!
    В противном случае у компьютеров выше в иерархии может кончиться память.
thunderlib.send(<address>,<data>) - посылка сообщения заданному компьютеру по его MUID
thunderlib.run_server([is_timeout[, allow_connections]]) - запуск сервера ThunderNet
    Сервер нужен для приёма входящих подключений и обнаружения соседних компьютеров.

thunderlib.uid()                  - возвращает MUID текущего компьютера
thunderlib.parent_node()          - возвращает MUID родительского компьютера

 

Изменено пользователем ProgramCrafter
очепятка в описании send
  • Нравится 3
  • В шоке 3
  • Грусть 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Кто или что определяет, является ли компьютер корнем или нет?

Можно ли объединить две сети в одну? Кто при этом станет корнем?

Правильно ли я понял, что корень должен знать пути абсолютно ко всем абонентам сети?

А что будет если корень выключить?

Как осуществляется связь между серверами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, Zer0Galaxy сказал:

Правильно ли я понял, что корень должен знать пути абсолютно ко всем абонентам сети?

Вот это, кстати, хороший вопрос


Но его, как и многие другие, можно решить с помощью многооктетной адресации, используя адреса типа 1.2.3 - т.е. узел под номером 3 привязан к промежуточному узлу под номером 2, а тот, в свою очередь, к корню под номером 1.

Соответственно, корню достаточно знать путь под узла 2, а узлу 2 - до узла 3

А если заменить числа произвольными строками, то можно получить что-то вроде computerCraftServer.LagodromVasi.MainComputer - вот и удобочитаемые домены, считайте, подъехали

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Zer0Galaxy сказал:

Кто или что определяет, является ли компьютер корнем или нет?

Если компьютер начал принимать входящие подключения (запустил run_server), но не подключился ни к какому другому узлу (не запускал connect/не нашёл того, к кому можно подключиться), то он автоматически становится корнем.

 

1 час назад, Zer0Galaxy сказал:

Можно ли объединить две сети в одну? Кто при этом станет корнем?

Тот компьютер (корень), который вызвал метод connect, станет подчинённым. Корнем, соответственно, останется другой.

Однако сейчас это не реализовано - сети не объединяются.

 

1 час назад, Zer0Galaxy сказал:

Правильно ли я понял, что корень должен знать пути абсолютно ко всем абонентам сети?

Да, именно так. В моей библиотеке хранится только первый сегмент пути до абонента, дальше разбирается следующий компьютер в цепочке.

 

1 час назад, Zer0Galaxy сказал:

А что будет если корень выключить?

Сеть разорвётся на несколько поддеревьев, внутри каждого из них доставка сообщений будет работать.

 

1 час назад, Zer0Galaxy сказал:

Как осуществляется связь между серверами?

Любым удобным образом: сетевая карта, Stem или вообще звёздные врата.

Чтобы добавить свой интерфейс, надо отредактировать файл th_interfaces.lua: добавить туда компонент, как на строках 51-54.

 

4 часа назад, AtomicScience сказал:

Разве такая сложная система адресации необходима?

Придумывал я её, чтобы исключить коллизии для всех возможных вариантов. Да, можно сократить адреса, но не знаю, будет ли это иметь смысл.

 

1 час назад, AtomicScience сказал:

А если заменить числа произвольными строками, то можно получить что-то вроде computerCraftServer.LagodromVasi.MainComputer - вот и удобочитаемые домены, считайте, подъехали

Можно завести какой-нибудь DNS-сервер, который будет переводить названия доменов в адреса компьютеров. Но я планирую сделать это вне рамок Thunderlib.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, ProgramCrafter сказал:

Придумывал я её, чтобы исключить коллизии для всех возможных вариантов. Да, можно сократить адреса, но не знаю, будет ли это иметь смысл.

Тогда достаточно MAC-адреса сетевой карты

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вышла версия "0.0.1.5"!

 

Из нового - добавлена поддержка Stem (т.е. теперь компьютеры могут подключаться через интернет).

Для работы нужна библиотека stem, установленная в системе.

 

P.S. Все ссылки остались прежними.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...