Перейти до основного вмісту

Reticulum зблизька: мережевий стек, де адреса — це ключ

· 18 хв. читання
UR3PKI
Software Engineer

Reticulum — не месенджер, не VPN і не «мережа для темних справ». Це повний мережевий стек, у якому адреса — відбиток ключа, шифрування не має вимикача, а носієм може бути LoRa-рація, шматок дроту чи звичайний TCP. Ця нотатка розбирає його пошарово: від бітів у заголовку пакета до плати на столі. Фізика радіо під ним — у розборі LoRa.

500 байтMTU — стеля розміру пакета. Обрана так, щоб пролізти в кадр LoRa
16 байтУся адреса: 128 біт зрізаного SHA-256 — і жодного реєстру
19 байтУвесь заголовок звичайного пакета, разом з адресою
128Максимум хопів, які пакет може пройти через транзитні вузли

Яку задачу він розв'язує​

Щоб зрозуміти Reticulum, спершу варто побачити, на яких припущеннях стоїть звичайний інтернет. Він не універсальний — він оптимізований під конкретний світ. Reticulum побудований під протилежний.

Назва — з латини: reticulum, «сіточка». Автор, Mark Qvist, почав із простого питання: що має бути в мережі, якщо забрати з неї провайдерів, реєстратори адрес, центри сертифікації й припущення, що канал завжди широкий? Виявилося, що переписати доведеться майже все — від адресації до формату пакета. Сам протокол автор передав у суспільне надбання ще 2016 року; еталонна реалізація на Python поширюється під власною Reticulum License.

звичайний інтернет припускаєReticulum припускаєщо з цього випливає
Канал швидкий і дешевий: мегабіти, затримка в мілісекундахКанал може бути 250 біт/с і з затримкою в секундиПакет — 500 байт. Кожен зайвий байт заголовка коштує реального часу в ефірі
Адреси роздає ієрархія: IANA → регіональний реєстратор → провайдер → DHCPАдресу обчислюють самі з власного ключаНі реєстрації, ні оренди, ні можливості адресу відібрати
Імена дає DNS, довіру — центри сертифікаціїНі DNS, ні CA. Адреса і є посвідченнямАдресами обмінюються поза мережею: QR-код, папірець, оголошення в ефірі
Вузли онлайн постійно, з'єднання — нормаВузол може вмикатися раз на добуПотрібне зберігання з подальшою пересилкою, а не лише живі сесії
Носій — Ethernet або Wi-Fi, кадри великіНосій — будь-що, що вміє передати байт: радіо, дріт, труба, TCPСтек свідомо нічого не знає про фізику під собою
Головне непорозуміння

Reticulum не заміна інтернету в побуті й не змагається з ним у швидкості. Він змагається з ситуацією, коли мережі немає взагалі — або вона є, але чужа, повільна й контрольована. Це різні змагання.

Три ідеї, на яких тримається все​

Далі буде багато деталей, але всі вони виростають рівно з трьох рішень.

ідея перша

Адреса — це відбиток ключа

Не «мені видали адресу», а «я порахував хеш свого публічного ключа, і це моя адреса». Звідси одразу: підробити адресу — те саме, що підробити ключ, а відібрати її не може ніхто, бо ніхто її й не давав.

ідея друга

Шифрування — не опція

У стеку немає режиму «без шифрування» для звичайного призначення. Не треба ні вмикати TLS, ні купувати сертифікат, ні домовлятися про ключі: хто знає адресу, той уже знає публічний ключ, бо адреса з нього й зроблена.

ідея третя

Стеку байдуже, по чому їхати

Від носія потрібно одне: «візьми цей блок байтів і спробуй донести». Радіо, серійний кабель, TCP-з'єднання, звукова карта — однаково. Тому одна мережа може їхати частково по LoRa, частково по інтернету.

Наслідок, який легко проґавити

Оскільки адреса вже містить ключ, а шифрування вбудоване, Reticulum не потребує рукостискання, щоб просто щось надіслати. Пакет можна зашифрувати незнайомцю й кинути в ефір, нічого не питаючи й не чекаючи відповіді. Цей режим далі називатиметься «опортуністичним».

Особистість і адреса: звідки береться <a4f1…>​

Найважливіші п'ять хвилин усього тексту: якщо стане зрозуміло, як із ключа виходить адреса, решта буде лише наслідками.

Особистість — це дві пари ключів​

Під час першого запуску будь-якого застосунку на Reticulum створюється Identity — не логін і не акаунт, а просто два згенеровані набори ключів:

X25519

Для обміну ключами

Дозволяє двом сторонам порахувати спільний секрет, жодного разу не передаючи його в ефір. Із нього виходить ключ, яким шифрується вміст.

Ed25519

Для підписів

Дозволяє довести, що пакет справді від цього відправника. Підпис — 64 байти; без приватного ключа його не підробити.

Публічні частини обох ключів разом — рівно 64 байти. Це все, що мережі треба знати про учасника.

Далі — два хешування​

крок 1 · хеш особистостіEd25519 pub · 32 BX25519 pub · 32 B64 байтисклеєні докупиSHA-256a4f1c8e0 7b2d9431 5fa6c70e 88d29d2c1e77b0a5 c3924dd6 0ab5e718 6f40c99b32 байти на виході — а треба 16решту просто відкидають — 128 біт це вже 3,4 × 10³⁸ варіантівкрок 2 · адреса призначенняім'я застосунку"lxmf.delivery"SHA-256 → 10 байтхеш іменіхеш особистості16 байт із кроку 1+склеїтиSHA-256адреса призначення · 16 байт<a4f1c8e0…88d29d2c>Одна особистість — багато адрес: для месенджера, для файлів, для вузла мережі. За адресою месенджеранеможливо вгадати адресу файлообмінника тієї самої людини, хоча ключ під ними один і той самий.
Чому саме так: у адресу зашито і хто (ключ), і для чого (ім'я застосунку). Тому вузол, отримавши пакет, одразу знає, якому застосунку його віддати, — без портів і без окремого поля в заголовку. Порти в Reticulum просто не потрібні.

Чотири типи призначень

типщо означає
SINGLEАдресоване одній особистості, шифрується під її публічний ключ — прочитає тільки вона. Цей тип використовують майже всюди
GROUPСпільний симетричний ключ, роздатий учасникам заздалегідь. Хто має ключ, читає все
PLAINБез шифрування взагалі. Для службових речей, де нічого ховати, — маяк, публічний ретранслятор
LINKАдреса живої сесії — про неї в розділі про Link нижче. Існує, лише поки сесія жива

Цифри, які варто пам'ятати

  • ключі — 32 + 32 = 64 байти публічної частини
  • хеш — SHA-256, зрізаний до 128 біт = 16 байт
  • ім'я — хеш імені застосунку, 10 байт
  • підпис — 64 байти (Ed25519)
  • адреса — 16 байт = 32 шістнадцяткові символи

Про колізії. 128 біт — це приблизно 3,4 × 10³⁸ можливих адрес. Випадково вони не збігаються, а підібрати навмисно — окрема серйозна робота.

Анатомія пакета: усі 500 байт​

У пакеті видно всю філософію. Коли канал дає 250 біт/с, кожен байт заголовка — це реальні мілісекунди в ефірі й реальні міліампери з акумулятора. Тому заголовок аскетичний до непристойності: два байти службових полів — і одразу адреса.

1прапорці
1хопи
16адреса
1контекст
481корисні дані
0заголовок 19 байт — усе інше під дані500 байт
Три режими: у звичайному пакеті адреса одна. Щойно пакет треба вести через чужі вузли, з'являється друга адреса — «кому передати далі», і корисного місця стає на 16 байт менше. В announce корисне навантаження цілком з'їдають ключі й підпис — але це єдиний пакет, який має розповісти мережі всю правду про вузол.

Що всередині першого байта​

Вісім біт, у яких лежить усе, що стек має знати про пакет, ще не почавши його розбирати:

IFACчи підписаний кодом доступу до інтерфейсу
HTодна адреса чи дві
CFконтекстний прапорець
PTширокомовно чи транспортом
DTтип призначення: SINGLE / GROUP / PLAIN / LINK
PKTтип пакета: DATA / ANNOUNCE / LINKREQUEST / PROOF
Другий байт — лічильник хопів. Кожен транзитний вузол збільшує його на одиницю; коли лічильник упирається в стелю (128), пакет помирає. Це захист від вічних петель — простий, як у IP, тільки лічильник тут росте, а не спадає.

Чотири типи пакетів — і це весь протокол​

типкоднавіщо
DATA0x00Власне дані. Усе, що не службове, — DATA
ANNOUNCE0x01«Я існую, ось мій ключ». Єдиний спосіб потрапити в чужі таблиці шляхів
LINKREQUEST0x02Запит на сесію з ефемерними ключами
PROOF0x03Криптографічний доказ: «я це отримав». Підтвердження доставки, яке не підробити
Порівняння масштабу

У TCP/IP заголовок IPv4 — 20 байт, TCP — ще 20, і це до будь-якого TLS. Тут службового — 19 байт на все разом, включно з адресою й криптографічним контекстом. На каналі 250 біт/с різниця між 19 і 60 байтами — це різниця між «дійшло» і «не встигло».

Як вузол знаходять: announce​

Адресу порахували — але мережа про неї нічого не знає. Немає DNS, немає реєстру, немає сервера, де «зареєструватися». Є рівно один механізм: вузол кричить у ефір announce, а всі, хто почув, запам'ятовують, у який бік до нього йти.

В announce лежать: адреса призначення, 64 байти публічних ключів, хеш імені застосунку, випадковий хеш (щоб два однакові announce не виглядали однаково), підпис — і опційно невеликий шматок даних застосунку, наприклад ім'я, яке месенджер покаже в списку.

announce розходиться мережею · кожен вузол записує собі напрямокТИджерело announceB1 хопC2 хопиD2 хопиE3 хопиF4 хопиG4 хопиДо E announce приходить двома шляхами — через C і через D. Вузол лишає той, що коротший і прийшов першим, а дублікат просто відкидає.
Що саме запам'ятовує вузол: не маршрут цілком, а лише «кому передати наступному» й скільки хопів лишилось. Ніде в мережі не існує повної карти — кожен знає тільки свій крок. Саме тому таблиці маленькі й мережа не вимагає ніякої центральної координації.
вузолкого навчився знаходитипередавати черезхопівколи дізнався
Ba4f1c8e0…88d29d2cджерело (напряму)1+1,9 с
Ca4f1c8e0…88d29d2cB2+3,5 с
Da4f1c8e0…88d29d2cB2+3,5 с
Ea4f1c8e0…88d29d2cC3+5,1 с
Fa4f1c8e0…88d29d2cE4+6,7 с
Ga4f1c8e0…88d29d2cE4+6,7 с

А якщо шляху ще немає?

Тоді в мережу йде запит шляху (path request) з потрібною адресою, і вузли, що її знають, відповідають. Це протилежний бік announce: announce — «я тут», path request — «а де ось цей?». Тому месенджер іноді думає кілька секунд перед першим повідомленням новому контакту — він шукає дорогу.

Шляхи не вічні

Запис має строк придатності. Якщо про вузол давно не чути, шлях забувається, і наступного разу дорогу доведеться шукати заново. Тому вузли, які хочуть бути знайденими, час від часу повторюють announce, а ті, хто не хоче зайвої уваги, мовчать і ходять мережею самі.

Тут і ховається головний компроміс приватності

Announce публічний за задумом, інакше вузол неможливо знайти. Тобто будь-хто в радіусі чутності бачить, що така адреса існує, і бачить її публічний ключ. Зміст повідомлень лишається закритим, але сам факт «цей вузол у мережі» — ні. Reticulum ніколи й не обіцяв анонімності.

Transport: хто насправді ретранслює​

Деталь, яку майже всі пропускають: не кожен вузол ретранслює чужий трафік. За замовчуванням вузол обслуговує лише себе.

Щоб вузол став транзитним, у конфігурації треба явно ввімкнути enable_transport = Yes. Такий вузол бере на себе роботу поштаря: тримає таблиці шляхів, переписує пакети з інтерфейсу на інтерфейс, склеює радіосегмент з інтернет-сегментом. Саме транзитні вузли перетворюють набір окремих островів на мережу.

звичайний вузол

Тільки для себе

Приймає й шле власні пакети. Чужі бачить, але не переносить. Це телефон у кишені.

транзитний вузол

Поштар мережі

Пересилає чуже, тримає шляхи, з'єднує різні носії. Зазвичай це щось, що працює цілодобово: Raspberry Pi, VPS, коробка на горищі з антеною.

вузол доставки

Ще й тримає пошту

Транзитний вузол, який додатково погодився зберігати повідомлення для тих, кого зараз немає в мережі. Про нього — у розділі про LXMF.

Режими інтерфейсів — інструмент, про який мало хто знає​

Кожному інтерфейсу можна задати режим, і це змінює, як через нього поширюються announce і будуються шляхи. Так вузьке радіо не заливається службовим трафіком із широкого інтернет-каналу.

режимповедінкатиповий випадок
fullУсе за замовчуванням: announce ходять в обидва боки, шляхи будуються вільноДомашня мережа, звичайний лінк
access pointІнтерфейс для «клієнтів», які самі нічого не ретранслюютьТочка входу для телефонів поруч
point-to-pointВиділений лінк рівно між двома вузламиРадіоміст між двома пагорбами
roamingЛінк, який то з'являється, то зникає; стек це враховуєВузол у машині, телефон у русі
boundaryМежа між сегментами: сюди пускають не всеСтик повільного радіо й швидкого інтернету
IFAC — приватна мережа в чужому ефірі

Інтерфейсу можна задати код доступу (Interface Access Code) — спільний секрет. Тоді вузли без коду не просто не приєднаються: вони взагалі не розпізнають цей трафік як Reticulum. Так на одній частоті співіснують кілька незалежних мереж, які не бачать одна одну.

Досі йшлося про поодинокі пакети: зашифрував під чужий публічний ключ, кинув у ефір, забув. Це працює, але має слабке місце: якщо хтось записує весь ефір і колись дістане приватний ключ адресата, він розшифрує все записане заднім числом. Саме проти цього придуманий Link.

встановлення лінка · діаграма послідовностіТИАДРЕСАТ1 · LINKREQUEST — мої одноразові публічні ключі2 · PROOF — його одноразові ключі та підпис4 · дані, зашифровані ключем сесії5 · PROOF — «доставлено», підписаноECDH → HKDFключ сесіїECDH → HKDFключ сесії3 · однаковий ключ, порахований з двох боків — по ефіру він не йшов жодного разуГотовність — приблизно за півтора обміни туди-назад. На LoRa це секунди, на TCP — мілісекунди.
Суть: обидві сторони генерують одноразові ключі, обмінюються публічними половинками й незалежно рахують однаковий спільний секрет. Сам секрет в ефір не потрапляє ніколи. Коли лінк закривається, ключі знищуються — і записаний кимось ефір лишається назавжди нечитабельним. Це і називається forward secrecy.

навіщо ще лінк

Підтвердження доставки

PROOF — не «галочка в месенджері», а криптографічний доказ: підписати його міг лише той, хто справді отримав пакет. Підробити «доставлено» неможливо.

навіщо ще лінк

Можна назватися

За замовчуванням у лінку відправник анонімний навіть для співрозмовника. За бажанням можна явно представитися — підписати сесію своєю постійною особистістю. Це окрема дія, а не побічний ефект.

навіщо ще лінк

Великі передачі

Ресурси (наступний розділ) їдуть саме поверх лінка: там є куди вписати прогрес, повтори й запити відсутніх частин.

А якщо лінк не потрібен

Для короткого повідомлення піднімати сесію — марна витрата ефіру. Тоді працює опортуністичний режим: один пакет, зашифрований під постійний ключ адресата, кинутий у мережу без рукостискання. Дешево, але без підтвердження й без forward secrecy. Для цього випадку в Reticulum додали ратчети — ключі, що регулярно «прокручуються», щоб і поодинокі пакети не читалися заднім числом.

Ресурси: коли даних більше, ніж 500 байт​

Фото, файл, сторінка з картинками в один пакет не влазять. Для цього є окремий механізм — Resource. Він не просто ріже дані на шматки: він переживає втрати, не починаючи все спочатку.

передача ресурсу · частина губиться й запитується зновуфайл180 КБстисненняякщо є сенсчастини + хешмапаполіт через мережу✕частину 6 не доїхало«надішли лише частину 6»отримувачскладає назаді звіряє хеші
прогрес видноу реальному часіВтрата однієї частини коштує однієї частини — а не всього файлу. Саме тому передача переживаєобриви радіо, які в звичайному завантаженні файлу означали б «почати спочатку».
Як це влаштовано: відправник рахує хеш кожної частини й надсилає отримувачу хешмапу — список того, що має приїхати. Отримувач звіряє, чого бракує, і просить точково. Плюс, якщо стиснення дає виграш, дані спершу стискаються — на каналі 250 біт/с це не дрібниця, а різниця в десятки хвилин.

Інтерфейси: по чому воно насправді їде​

Стек нічого не знає про фізику. Він знає лише «інтерфейс» — штуку, яка вміє взяти блок байтів і спробувати його донести; решта — подробиці драйвера. Тому один вузол може одночасно тримати радіо, кабель і TCP, і для мережі це буде одна суцільна тканина.

AutoInterface

Локалка, нуль налаштувань

Шукає інших через IPv6-мультикаст у тій самій мережі. Увімкнути на двох ноутбуках в одному Wi-Fi — і вони вже бачать одне одного. Найшвидший спосіб спробувати Reticulum узагалі без заліза.

Швидкість: як у локальної мережі

TCPClient / TCPServer

Через звичайний інтернет

З'єднує два сегменти мережі поверх TCP. Так влаштовані публічні вузли testnet: локальний радіоострів під'єднується до світової мережі одним рядком у конфігу.

Швидкість: скільки дасть канал

RNodeInterface

LoRa-радіо через USB

Той самий випадок, заради якого все затівалося: жодного провайдера, жодного дроту. Плата підключається як звичайний серійний пристрій, а стек сам виставляє частоту, смугу й spreading factor.

Швидкість: 0,25–5,5 кбіт/с

KISS / AX.25

Стара добра радіоаматорщина

Reticulum уміє їхати поверх звичайного TNC і аматорської рації — зокрема на КХ, де сигнал огинає планету. Повільно до непристойності, зате дальність міряють континентами.

Швидкість: 300–9600 бод

SerialInterface / Pipe

Байти будь-яким дротом

Два пристрої, з'єднані кабелем. Або пара дротових модемів. Або взагалі чужа програма, яка вміє передавати потік байтів, — Reticulum поїде і по ній.

Швидкість: яку задали

I2PInterface

Коли треба ще й сховатися

Reticulum їде всередині I2P. Вузол не має ні білого IP, ні домену, ні порту, який можна заблокувати, — а адресація лишається власною.

Швидкість: повільно, зате непомітно

Залізо: RNode і фізика радіо​

Тут закінчується софт і починається те, чого не обійти жодним кодом: антена, рельєф і закони поширення радіохвиль.

Що таке RNode​

RNode — відкрита конструкція радіомодема: мікроконтролер плюс LoRa-чип, прошиті спеціальною прошивкою. Збирається з дешевих плат для розробників (T-Beam, Heltec, RAK тощо). Для стека це просто серійний пристрій, для власника — автономний вузол, що працює від акумулятора й нічого ні в кого не питає.

RNode · що на платіUSBESP32SX127618650Li-IonTXантена — головний множник дальностіESP32 — прошивка RNode, KISS через USBSX1276/SX1262 — власне радіоакумулятор — вузол живе сам по собіекран і кнопка — стан без комп'ютерапогана антена з'їдає кілометри швидше за все іншета сама плата вміє бути й простим модемомчастота залежить від регіону: 433 / 868 / 915 МГцтипово — від кількох діб до тижнів у режимі очікуванняне обов'язковий, але дуже зручний у полі
Важливо: прошивка RNode перетворює плату на «тупий» радіомодем — уся логіка Reticulum лишається на комп'ютері чи телефоні. Тому плату не треба перепрошивати, коли оновлюється стек, і одна й та сама плата однаково працює з ноутбуком, Raspberry Pi й телефоном.

Чому LoRa чує те, чого «не чутно»​

LoRa передає дані не рівним тоном, а свистком із наростаючою частотою — чирпом. Приймач точно знає форму цього свистка, тому витягує його навіть тоді, коли сигнал слабший за шум ефіру. Платня — час: чим «розтягнутіший» свисток (вищий spreading factor), тим далі чутно й тим повільніше йдуть дані. Детально — в розборі LoRa.

spreading factorшвидкість, смуга 125 кГцдальність500-байтовий пакет в ефірі
SF7≈ 5,5 кбіт/снайменшаменш як секунда
SF9≈ 1,8 кбіт/ссередня≈ 2 секунди
SF12≈ 250 біт/смаксимальна≈ 16 секунд

Числа орієнтовні: швидкість залежить ще й від смуги й коду корекції помилок, а час в ефірі — від службових даних. Але порядок саме такий: перехід від SF7 до SF12 коштує приблизно двадцятикратного уповільнення.

вузол Aтранзитний, на пагорбівузол B8 км прямої видимості · SF12 · 250 біт/свузол у долині✕гора заважає бачити B напрямуа до A — видно, отже йдемо через A
Ось навіщо потрібні транзитні вузли. Радіо не огинає гори: якщо прямої видимості немає, жодні налаштування не допоможуть. Один вузол, піднятий на висоту, перетворює купу ізольованих точок на мережу — і це найдешевший спосіб збільшити покриття в рази.

Скільки реально пролазить​

Найчастіше розчарування виглядає так: піднята LoRa-мережа, надіслане фото — і воно летить годину. Ось чесні числа, щоб такого не було. Повзунок розміру показує будь-який свій випадок.

200 КіБ
SF7 · 5,5 кбіт/с5 хв
SF9 · 1,8 кбіт/с15 хв
SF12 · 250 біт/с1 год 49 хв
Чистий поділ обсягу на швидкість, шкала логарифмічна. Службові дані, підтвердження й повтори додають ще, тож реальний час більший — але порядок саме такий. Домашній інтернет на 100 Мбіт/с везе той самий файл у тисячі разів швидше.
що надсилаємоSF12 · 250 біт/сSF7 · 5,5 кбіт/свисновок
Текстове повідомлення, 1 КіБ≈ 33 с≈ 1,5 сКомфортно навіть на найповільнішому режимі
Сторінка Nomad Network, 8 КіБ≈ 4,4 хв≈ 12 сЧитабельно, якщо сторінка текстова
Голосове, 1 хв стисненого, 15 КіБ≈ 8 хв≈ 22 сНа SF7 — терпимо, на SF12 — ні
Фото, 200 КіБ≈ 1 год 49 хв≈ 5 хвТільки коли справді треба й нема куди поспішати
Відео——Ні. І не буде: це не питання оптимізації

Висновок не «LoRa погана», а «LoRa — для тексту». Далекобійний режим існує не щоб возити мегабайти, а щоб повідомлення дійшло за 30 кілометрів через гору, де нічого іншого не працює.

LXMF: пошта, яка вміє чекати адресата​

Reticulum сам по собі не знає поняття «повідомлення» — він возить пакети. Месенджери поверх нього говорять окремим форматом, LXMF. Саме він відповідає за те, щоб повідомлення дочекалося людини, яка вмикає рацію раз на добу.

три способи доставити те саме повідомленняспосіб 1 · опортуністичнийТИАДРЕСАТодин пакет, без рукостисканнядешево й швидко,але без підтвердженняспосіб 2 · через лінкТИАДРЕСАТсесія, ефемерні ключі, вкладенняназад — PROOF: «доставлено», підписанонадійно, але адресатмає бути в мережі заразспосіб 3 · через вузол доставкиТИpropagation nodeтримає зашифрованеАДРЕСАТколи з'явиться —прийде й забере самадресата може не бутив мережі хоч тиждень
Вузол доставки не читає пошту. Він тримає зашифрований конверт і не має ключа — рівно як поштова скринька, яку не можна відкрити. Тому ставити такий вузол може будь-хто, і довіряти йому не треба.

Що всередині повідомлення LXMF

  • кому — адреса призначення (16 байт)
  • від кого — адреса відправника
  • підпис — щоб підмінити відправника було неможливо
  • вміст — час, заголовок, текст і довільні поля; сюди ж лягають вкладення

Стани повідомлення в клієнті — не прикраса: «надіслано» означає «пішло в мережу», а «доставлено» ставиться лише тоді, коли повернувся PROOF.

Як тут борються зі спамом

Класичні фільтри неможливі: вузол не бачить вмісту. Тому LXMF використовує «марки»: відправник має витратити трохи обчислень, щоб його повідомлення прийняли. Для живої людини це непомітно, для розсилки на мільйон адрес — руйнівно дорого.

Плюс звичайне: від знайомих контактів марку можна не вимагати, від незнайомих — вимагати дорожчу.

Чого Reticulum не робить​

Найшвидший спосіб розчаруватися в інструменті — чекати від нього того, чого він не обіцяв.

  • ✕ Не анонімізує. Announce публічний, адреси призначення видно транзитним вузлам, а на спільному радіо видно, хто й коли виходив в ефір. Зміст закритий, факт спілкування — ні.
  • ✕ Не має глобальних імен. Нічого схожого на DNS немає. Адресу співрозмовника треба звідкись узяти: QR-код, папірець, оголошення в ефірі, спільний вузол-довідник.
  • ✕ Не гарантує доставку сам по собі. Гарантія з'являється лише там, де є PROOF або ресурс із повторами. Пакет, кинутий «опортуністично», може просто зникнути.
  • ✕ Не возить звичайний веб. HTTP і браузер сюди не приїдуть: MTU 500 байт — інший світ. Замість вебу є Nomad Network із власною легкою розміткою сторінок.
  • ✕ Не замінює інтернет у побуті. Стрімінг, дзвінки, хмари — ні. Текст, координати, невеликі файли, керування пристроями — так.

І це не Meshtastic — найчастіша плутанина, бо залізо в них однакове.

Reticulum і Meshtastic: та сама плата, різні задуми​

питанняMeshtasticReticulum
Що цеГотовий продукт: груповий чат і GPS по LoRaМережевий стек загального призначення, на якому пишуть свої застосунки
НосійТільки LoRaБудь-що: LoRa, радіо, дріт, TCP, I2P
МаршрутизаціяКерований флуд у межах невеликої групи вузлівТаблиці шляхів, до 128 хопів, склеювання різних носіїв
Адреса4 байти з MAC-адреси плати16 байт хешу від ключа, глобально унікальна
ШифруванняКлюч каналу для груп; власні ключі вузлів — для приватнихНаскрізне до конкретної особистості, завжди
Кому підійде«Увімкнув і працює» для групи в горахТим, хто будує власну мережу або застосунок під неї

Обидва проєкти живі й обидва працюють на тих самих дешевих платах: Meshtastic дає готовий сценарій, Reticulum — конструктор. На одній платі можна спробувати і те, і те, просто змінивши прошивку.

Практика: підняти за вечір​

Найдешевший спосіб зрозуміти — запустити. Для першого кроку залізо не потрібне взагалі: досить двох комп'ютерів в одному Wi-Fi.

Крок 1 — поставити стек

# сам стек і утиліти
pip install rns

# демон: тримає інтерфейси й шляхи
rnsd

# що з інтерфейсами просто зараз
rnstatus

# який шлях до адреси і скільки хопів
rnpath <hash>

# пінг транзитного вузла
# (у нього має бути ввімкнено respond_to_probes)
rnprobe rnstransport.probe <hash>

# забрати файл із віддаленого вузла
rncp --fetch ~/file.txt <hash>

Крок 2 — конфіг

Лежить у ~/.reticulum/config. Ось вузол, який одночасно в локальній мережі, на радіо й у світовій мережі:

[reticulum]
enable_transport = No
share_instance = Yes

[interfaces]

[[Default Interface]]
type = AutoInterface
interface_enabled = True

[[LoRa]]
type = RNodeInterface
interface_enabled = True
port = /dev/ttyUSB0
frequency = 867200000
bandwidth = 125000
txpower = 7
spreadingfactor = 8
codingrate = 5

[[Public hub]]
type = TCPClientInterface
interface_enabled = True
target_host = amsterdam.connect.reticulum.network
target_port = 4965

Частоту й потужність задають за правилами свого регіону — це не порада, а закон. Актуальні публічні точки входу — в документації проєкту: вони змінюються.

Крок 3 — прошити плату, коли дійде до радіо. Плата підключається по USB, далі — за підказками утиліти:

rnodeconf --autoinstall

Що поставити зверху​

месенджер

Sideband

Android, iOS, десктоп. Найпростіший вхід: після встановлення генерується особистість і видно контакти, які оголосилися в мережі.

веб-інтерфейс

MeshChat

Зручна панель у браузері: повідомлення, файли, карта вузлів, стан інтерфейсів.

термінал

Nomad Network

Текстовий інтерфейс у дусі BBS: сторінки з власною розміткою, файли, дошки. Найкраще відчуття «іншої мережі».

Словник​

  • Identity — пара ключових пар (X25519 + Ed25519), особистість. Файл, який варто берегти: відновити його нізвідки.
  • Destination — адреса: 16 байт хешу від особистості та імені застосунку. Те, що дають співрозмовнику.
  • Aspect — частина імені застосунку, напр. lxmf.delivery. Визначає, кому всередині вузла віддати пакет.
  • Announce — пакет «я існую, ось мій ключ». Єдиний спосіб потрапити в чужі таблиці шляхів.
  • Path — запис у таблиці: «щоб дійти до цієї адреси, передай ось цьому сусідові». Має строк придатності.
  • Transport node — вузол, якому явно дозволили ретранслювати чужий трафік. Без них мережа розпадається на острови.
  • Link — сесія з одноразовими ключами. Дає forward secrecy, підтвердження доставки й ресурси.
  • Proof — підписаний доказ отримання. Підробити «доставлено» неможливо.
  • Resource — механізм передачі даних, більших за пакет: стиснення, нарізка, хешмапа, точкові повтори.
  • Interface — драйвер носія: AutoInterface, TCP, RNode, KISS, Serial, I2P. По суті стек їх не розрізняє.
  • IFAC — код доступу до інтерфейсу. Чужі вузли навіть не впізнають цей трафік як Reticulum.
  • MTU / MDU — стеля розміру пакета (500 байт) і те, що лишається під корисні дані після заголовка.
  • LXMF — формат повідомлень поверх Reticulum. Те, чим насправді говорять месенджери.
  • Propagation node — вузол, що тримає зашифровану пошту, поки адресат офлайн. Ключів не має.
  • RNode — відкрита конструкція LoRa-модема: дешева плата плюс прошивка. Для стека — звичайний серійний пристрій.
  • Spreading factor — наскільки «розтягнутий» радіосигнал. Вище — далі чутно й повільніше дані.

Швидкості тут розрахункові; конкретні параметри конфігурації варто звіряти з документацією проєкту.

Серія «зблизька»