Doob 2 750 Опубликовано: 8 марта, 2021 Очередная сеть на OpenComputers модемах. Децентрализованная, одноранговая, как Zn, только лучше. Каждый узел сети видит все остальные и может отправить/принять сообщение на любом расстоянии. Отличия от сети Zn: Динамическая маршрутизация. Zn затапливает все узлы каждым сообщением. Moonlink же передает сообщение по самому короткому пути и никто, кроме промежуточных узлов, сообщение не видит. При изменении топологии сети, маршруты перестраиваются. Можно передавать больше одной строки за раз. Установка: wget https://raw.githubusercontent.com/OpenPrograms/zgyr-Programs/master/moonlink/moonlink.lua /usr/lib/moonlink.lua или через oppm oppm register OpenPrograms/zgyr-Programs oppm install moonlink Функции: connect([порт: number]) подключиться к сети, стандартный порт 8431, можно задать свой. disconnect() отключиться от сети. send(адрес: string, ...) послать сообщение узлу с указанным адресом. ping() принудительный пинг соседей (запрос маршрутов у соседних узлов). list():table получить список доступных узлов в сети. Событие только одно: moonlink_message(receiver_addr: string, ...) адрес получателя и сообщение. Пример использования: local event = require('event') local moonlink = require('moonlink') moonlink.connect() while true do local _, address, message = event.pull('moonlink_message') if message == 'bye' then break else print(message) end end moonlink.disconnect() 10 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 8 марта, 2021 Насколько хорошо поддерживается изменение топологии сети? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 9 марта, 2021 Что собой представляет адрес? Как он генерируется? Как узнать свой адрес? Событие moonlink_message возвращает адрес получателя. А можно ли узнать адрес отправителя? Интересует алгоритм динамической маршрутизации. Как часто обновляются таблицы маршрутизации? Если за секунду до отправки пакета отвалится один из промежуточных узлов, будет ли найден обходной путь или пакет потеряется? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 750 Опубликовано: 9 марта, 2021 12 часа назад, hohserg сказал: Насколько хорошо поддерживается изменение топологии сети? По таймеру каждые 30 секунд пингуются соседние узлы, в это время происходит сброс всех маршрутов и восстановление из поступающих ответов. Из-за медлительности пинг-понга может потеряться сообщение. Хотел добавить очередь для неотправленных сообщений, но почему-то не сделал. Скорее всего проблема будет в том, что при изменении топологии, с условием, что узел держащий сообщение, потерял связь с целевым, перенаправит по новому маршруту (следовательно, сообщение может вернуться к отправителю и будет гулять туда-сюда 2-3 раза). Можно сделать подтверждение доставки, тогда не нужна очередь, а реализуется это поверх базового протокола. Но проблема может возникнуть только если узлы часто меняют конфигурацию, выходят за пределы покрытия или выключаются. Для стационарной сети ретрансляторов достаточно пингануть и подождать, когда в списке появится нужный адрес, затем отправить ему сообщение и получить подтверждение доставки. 16 минут назад, Zer0Galaxy сказал: Что собой представляет адрес? Как он генерируется? Как узнать свой адрес? Адрес это UUID сетевой карты, работает так же как обычный modem.send 16 минут назад, Zer0Galaxy сказал: А можно ли узнать адрес отправителя? Любой промежуточный узел может подменить сообщение, поэтому идентификацию пользователи должны реализовать своим протоколом. 16 минут назад, Zer0Galaxy сказал: Если за секунду до отправки пакета отвалится один из промежуточных узлов, будет ли найден обходной путь или пакет потеряется? Если узел не успел получить новый маршрут, то да, потеряется. Наверно стоит сделать пинг перед отправкой сообщения, а не по таймеру. Будем тестировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 9 марта, 2021 21 минуту назад, Doob сказал: Наверно стоит сделать пинг перед отправкой сообщения, а не по таймеру. Процедура ping() затрагивает только соседние узлы или всю сеть? Если всю, то будет слишком накладно делать пинг перед каждым сообщением. Если только соседей, то может не обнаружить потерю узла, стоящего за соседним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 750 Опубликовано: 9 марта, 2021 3 минуты назад, Zer0Galaxy сказал: Если только соседей, то может не обнаружить потерю узла, стоящего за соседним. Да, как раз это и надо как-то хитро обойти. Для частной магистрали вполне годится и так, там администратор сети отвечает за узлы. А для работы с рандомными узлами нужен алгоритм самоорганизации. 4 года назад были наброски, но вспомнить как оно было, не получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 9 марта, 2021 Думаю, нужно различать пользовательские узлы и роутеры, чтобы кто то, просто подключившись на пять минут, не нарушал маршрутизацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Doob Автор темы 2 750 Опубликовано: 9 марта, 2021 Достаточно добавить буфер для неотправленных сообщений, получится динамический A*. Эксперименты показывают, что прервать передачу можно только изолировав/отключив узел до того как он отправит сообщение, а против этого ни у какого протокола нет защиты. Беда в том, что модемы работают крайне медленно, в реальных устройствах обмен данными идет очень быстро и два майнкрафт-тика, для настоящего сетевого интерфейса это бездна времени. Остается только гонять динамический A*, других вариантов не вижу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
AlexCatze 58 Опубликовано: 9 марта, 2021 Что будет, если я попробую отправить пакет размерлм больше 8 килобайт? 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах