Мне бы хотелось поделиться с сообществом интересными мыслями о создании автономной децентрализованной электронной почты и продемонстрировать на практике работу одной уже существующей реализации.
Изначально «Телеграф» разрабатывался как любительское средство связи между членами нашего небольшого студенческого сообщества, так или иначе свою деятельность посвятившего вычислительной технике и коммуникациям.
Nota Bene: «Телеграф» — любительское средство коммуникации; практическую выгоду извлечь в промышленных масштабах представляется довольно проблематичным, однако проблему эту едва ли хоть в какой-либо степени можно назвать существенной — преимущественно главной нашей целью мы считаем непосредственно привлечение внимания к разработке подобного рода коммуникационных систем.
Мы склонны считать, что повышение общей заинтересованности в сфере разработки различных систем коммуникаций — дело нужное и достаточно важное, потому как понимание основополагающих принципов того, как работают и на чём держатся эти системы — основной ключ к повышению осведомлённости граждан в вопросах информационной безопасности.
Система держится на добровольных началах и чистом энтузиазме — нам просто нравится то, чем мы занимаемся. Можете счесть это за хобби и не окажетесь неправыми — ведь до сих пор существуют любители общения посредством использования бумажной корреспонденции; «Телеграф» же в большинстве случаев можно представить как цифровую реализацию принципов работы обычной почты.
«Телеграф» представляет собой автономный аналог электронной почты, позволяющий передавать простые текстовые сообщения без использования интернета. «Телеграф» в той или иной степени можно отнести к Sneakernet — способ обмена информацией без использования сети.
В качестве почтовых ящиков используются флеш-накопители, а в роли почтовых отделений выступают терминалы — компьютеры, являющие собой своеобразные пункты доступа к получению и передачи электронной корреспонденции.
Рассмотрим простейший пример взаимодействия с системой. У нас в наличии имеется две флешки и один терминал. В самом скрипте прописанны необходимые глобальные переменные для последующего взаимодействия с системой — номер терминала, путь к корню и проч.
Если мы подключим съёмный накопитель к терминалу и запустим скрипт, то он попытается получить исходящие сообщения из директории /mnt/Telegraph/Outbox и перенести их в свою память, после — проверить наличие в своей памяти новых сообщений для текущего пользователя. Если таковые имеются — записать их в /mnt/Telegraph/Inbox.
Регистрация новых устройств
Происходит достаточно произаично. Скрипт находит новые флеш-накопители, подключенные к системе, и пытается сопоставить их уникальные идентификаоры с теми, которые представлены в корне. Если устройства ранее не подвергались регистрации, они будут отформатированы в соответствии с заявленными «Телеграфом» правилами.
После регистрации нового устройства структура корня принимает следующий вид:
В конфигурационном файле config.ini, расположенном в корне флеш-накопителя, находится системная информация — уникальный идентификатор и секретный ключ.
Дайте людям рому!
Нет, ну, право, серьёзно! Исходники раздобыть можно здесь, а нам уже потихоньку пора перебираться от теории к практике.
Но я должен сказать ещё несколько слов о том, как на практике устроена система обмена сообщениями.
Для начала давайте разберёмся, из чего состоит одиннадцатизначный уникальный идентификатор. К примеру, 10455000001.
Первая цифра, 1, отвечает за номер страны. Международный код — 0, Россия же в данном случае — 1.
Далее идут четыре цифры, которые отвечают за номер региона, в котором расположен терминал. 0455 — это Коломенский городской округ.
За ними идут две цифры, — 00, — отвечающие непосредственно за номер терминала.
И только потом — четыре цифры, которые являются порядковым номером пользователя, что закреплён за данным терминалом. У нас это — 0001. Также существует и 0000 — этот номер принадлежит непосредственно самому терминалу. На него нельзя отправить письменную корреспонденцию, но зато сам терминал использует этот номер для отправки служебных сообщений пользователям. Например, если сообщение не удалось доставить по каким-либо причинам.
В корне нашего «почтового ящика» находится две директории, необходимые для того, чтобы получать и отправлть текстовые сообщения. При подключении устройства к терминалу из директории «Outbox» на сервер отгружаются исходящие сообщения, а в директорию «Inbox», что логично, загружаются входящие.
Каждый файл в зависимости от директории поименован номером получателя или отправителя.
Если мы попытаемся отправить сообщение несуществующему адресату, то терминал нам отправит сообщение об ошибке.
Однако, если же мы решим отправить письмо адресату, находящемуся на другом терминале (вне зависимости от того, существует оный или нет), оно будет записано в память терминала до того, как агент не перенесёт письменную корреспонденцию с нашего терминала на свой.
Когда агент отделения 10500000000 (иными словами — почтальон) подключит своё устройство к нашему терминалу, исходящие письма будут переданы на его накопитель. Впоследствии, когда он подключит своё устройство к своему терминалу, эти письма окажутся сброшенными в память терминала и будут ожидать, когда адресат отгрузит их на свой флеш-накопитель.
Сеанс связи
Давайте попробуем передать сообщение с текстом «Привет!» от 10455000001 к 10455000002.
На этом всё!
Буду рад любой критике в адрес исходного кода проекта и непосредственно самой статьи.
Благодарю за внимание.
Комментарии (20)
csim
18.03.2019 15:38+4Ура! Вы придумали fido!
YMA
18.03.2019 16:05Если точнее и зануднее, то это транспорт фидо на ранних этапах — флоппинет.
ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%BE%D0%BF%D0%BF%D0%B8%D0%BD%D0%B5%D1%82
tretyakovmax
18.03.2019 15:49+1Да нормальная концепция. Сопротивление чебурнету. А флешки можно привязывать к голубям, кстати)
podivilov Автор
18.03.2019 15:54На самом деле, я просто достаточно увлечён изучением того, как устроены самые разные системы связи — так, например, за неделю летом набросал протокол обмена простыми текстовыми сообщениями через звук — 4K96.NET (одна из первых реализаций). Возможно, как-нибудь и про него черкану пару строк.
Акцентирую своё внимание на том, что код там требует полного рефакторинга, поэтому спешить с обещаниями касательно публикации не стану — в таком-то уж виде даже как-то стыдновато презентовать подобное детище сообществу.
0x9d8e
18.03.2019 17:12Можно письма шифровать и подписывать, после чего между терминалами они могли бы переноситься не только почтальоном, а любым пользователем (в некотором ограниченном объёме). Пакет письма имел бы ttl, который бы при каждой пересылке сокращался бы. Таким образом пакет письма или дошел куда надо или «протух». Одновременно в «сети» может быть несколько пакетов одного письма. С гарантией доставки выходит не очень, зато почтальоны не обязательны. Копии писем просто гуляют по сети пока не протухнут (или не попадут к адресату, который дальше пересылать уже не станет).
0x9d8e
19.03.2019 15:08+2Кстати, можно и без usb, просто по bluetooth обмен. Тогда пользователь мог бы просто пройти мимо такого терминала и за это время произошел бы обмен письмами. В первую очередь отправить/принять собственные, затем сколько получится попутных. Тогда, если расположить терминалы, скажем, вблизи светофоров и остановок, даже не придётся специально ходить к этим терминалам и вообще задумываться об их расположении.
YMA
19.03.2019 15:51+1Все упирается в дальние линки — фидошка держалась на «Искре» и прочих ведомственных сетях, позже — на появляющемся в образовательных и др. учреждениях интернете. А в этой системе как планируется передавать сообщения между городами и странами? Считаем интернет несуществующим. ;)
PS: Кстати, если вычеркнуть из системы терминалы — получается Firechat, насколько я понимаю — не взлетевший толком.
А вот если в ней учитывать ежедневные маршруты пользователей, то можно и оптимизировать доставку, собирая по этой распределенной сети возможные пути передачи сообщения из района А в район Б (у переносчиков сообщений маршруты сравнительно устойчивы и можно строить своеобразную маршрутизацию — представляю себе, как сообщения в Сибирь собираются у Васи, который периодически пересекается в метро с Петей, который регулярно летает из Москвы в Новосибирск).0x9d8e
20.03.2019 14:11Если ставить терминалы в терминалах загрузки/разгрузки грузовиков и самих грузовиках + использовать для «дальних» сообщений достаточно большой ttl, то всё будет работать. Тем более грузовики там достаточно долго стоят, могут много накачать. Дальнобойщики будут байты возить :)
Ещё бы как-то предусмотреть небольшую плату за такие перевозки. В принципе доната с сообщества хватило бы.
Между дальними странами уже хуже. Но опять же, морские порты и бортовые терминалы с кучей hdd для «тяжелых» сообщений на кораблях, терминалы в залах ожидания аэропортов для сравнительно быстрой доставки множества небольших сообщений.podivilov Автор
20.03.2019 14:25Всё, к сожалению, опять же упирается в целевую аудиторию. Ну, будет этим пользоваться полтора человека — кто же согласится ради этого в залах ожидания аэропортов размещать терминалы, когда гораздо проще черкануть пару строк и отправить своему товарищу в каком-нибудь уже существующем IM?
Fenzales
20.03.2019 16:37Учитывая, что данные в любом случае передаются на физических носителях и требуют какого-никакого личного участия, можно устроить Web of trust :)
nuclight
18.03.2019 18:08Уже изобретено NNCP www.opennet.ru/opennews/art.shtml?num=48756
Плюсом является то, что оно интегрируется с существующими почтовиками Exim/Postfix и не нужно этого ужоса с именами текстовиков вручную.
NetNazgul
20.03.2019 09:52Название проекта конечно более-менее запоминающееся, но при этом уж очень плохо индексируемое, распространить это не удастся уже только по данной причине.
maxp
20.03.2019 14:18Я не понял, вы придумали как обмениваться файликами «на флешках» что-ли?
Или систему адресации из 11 цифр?
Придется вас огорчить — и то и другое известно миру уже не один десяток лет, причем, в куда более продуманных вариантах.
Krylaty
Для полноты концепции надеюсь предусмотрена физическая транспортировка для синхронизации региональных телеграфов к центральному и обратно?
podivilov Автор
Что Вы имеете в виду под «физической транспортировкой»?
Если непосредственно передачу данных — см. пример из исходного кода.