Обмен данными в распределенных сетях
В децентрализованных сетях обрабатывать данные гораздо сложнее, чем в централизованных. К тому же в техникумах и вузах обучают, в основном, программированию клиент-серверных систем. Поэтому p2p-программистов на порядки меньше, чем программистов клиент-серверных систем.
Этой статьей я решил частично восполнить пробел, перечислив восемь известных мне распределённых технологий: из них первые 3 описывают способы распространения (рассылки) данных по сети, другие 5 разъясняют способы распределения (разделения) данных.
1. Широковещание (broadcast)
Примеры: FM-радио, ТВ-сигнал.
При широковещании узел, подключенный к антенне или проводу, рассылает в эфир данные, а другие узлы одновременно принимают эти данные. Само по себе широковещание не является децентрализованной технологией, но даёт основу для следующего способа.
2. Широковещание на адрес
Примеры: Пейджеры, Ethernet, PON, mesh-сети, спутниковая «рыбалка».
Является разновидностью широковещания, где все узлы принимают из эфира или провода все данные. Разница в том, что данные идут не единым потоком, а в виде отдельных блоков и у каждого блока внутри задан адрес получателя. Например, каждый пейджер слушает эфир и читает блоки, но в память записывает только блоки со своим адресом, после чего выдает уведомление на экран и пищит.
Для того, чтобы сигналы от разных узлов не накладывались и не перекрывали друг друга, используется разделение трафика по времени (TDMA). Например в Ethernet при возникновении коллизии, каждый узел делает следующую попытку через случайный промежуток времени.
3. Рассылка соседям
Примеры: RetroShare, Pandora, aMule.
Рассылка данных происходит не сразу на все узлы сети, как при широковещании, а по очереди на каждый подключенный узел соседа. Узел соседа пересылает данные своим соседним узлам, и так далее вовне веером по цепочкам текущий соединений. В этот момент данные могут быть случайно или умышленно искажены, что хорошо видно на примере распространения человеческих сплетен из уст в уста. Гарантией от таких «искажений» в компьютерных сетях может быть использование шифрования или электронных подписей на ключах, имеющих подтвержденный рейтинг в распределённой сети доверия.
Рассылка соседям также может быть на адрес. Если в записи содержится адрес соседа, то пересылка идёт только ему. Если узел получил запись, в которой указан его адрес, то дальше эту запись он не рассылает.
Веерная рассылка по соседям очень часто используется в распределённых сетях с целью передачи: поисковых запросов, ответов на запросы, уведомлений присутствия, групповых чат-сообщений, передачи каскадных медиа-потоков (трансляций), передачи блоков блокчейна или блокнета и так далее.
4. Клонирование (replication)
Примеры: blockchain (Bitcoin, Etherium и другие), rsync, многие DB.
Представляет собой простое копирование базы данных с узла на узел до полного выравнивания данных. При изменении данных на каком-либо узле «разница» рассылается соседним узлам. Это самый примитивный способ. Важно, что данные не распределены по сети, а по сути одна база многократно копируется на каждый узел. Недостаток репликации существенный: если база большая, то хранить её целиком на каждом узле обычно становится нецелесообразно, а в некоторых случаях — физически невозможно (в силу ограничений дисков или фрагментации отдельных подсетей).
5. Кэширование
Примеры: ZeroNet, Diaspora (точнее, её «поды»).
Записи распределяются от узла к узлу «широковещанием» или «рассылкой», после чего какое-то время хранятся в локальном хранилище, а по истечении заданного времени (или по другому условию) удаляются. Например, в ZeroNet веб-страница после просмотра остаётся в кэше узла и раздаётся по запросу соседей;, а удаляется только вручную владельцем узла. (Веб-браузеры тоже имеют кэш и временно хранят там данные, полученные от сервера, но являются всего лишь клиентами для веб-серверов, сами не в состоянии обрабатывать и передавать данные к другим узлам сети, притом спроектированы с сильной оглядкой на централизованную службу доменных имен DNS).
6. Хэш-таблица (DHT)
Примеры: Kademlia, OpenDHT, Tox.
Каждому блоку данных сопоставляется некоторый хэш-идентификатор (обычно md5-хэш или sha1-хэш этого блока). Каждому узлу также назначается некоторый адрес-идентификатор (обычно md5-хэш или sha1-хэш открытого ключа). После этих двух условий данные распределяются по сети «широковещанием» или «рассылкой» и сохраняются на узлах в сопоставлении адреса-идентификатора с хэшем-идентификатором. Например, если хэш блока начинается с «A1», то этот блок будет храниться на узлах, с адресом начинающимся с «A1». Так как функция хэширования псевдослучайна, то и распределение данных происходит псевдослучайно. Запросы блоков также происходят «широковещанием» или «рассылкой». Недостатком такой сети может стать умышленная «подделка» данных. Так, например, сеть aMule была фактически выведена из строя тем, что копирасты, корпорасты и тоталитарщики «замусорили» сеть фейковыми блоками, после чего что-либо найти в ней стало практически невозможно.
7. Сеть доверия (F2F)
Примеры: WoT, PGP, GnuPG, RetroShare, Pandora.
Записи в сети доверия распределены не псевдослучайным образом как в DHT, а по доверенным узлам. Доверие — это специальная пометка (обычно в виде подписи или сертификата) открытого ключа другого узла, которому данный узел доверяет свои данные. Доверие строится либо на личном знакомстве (близкие, друзья, партнеры), либо на виртуальной дружбе в сети. Также основой доверия может быть авторитет владельца узла, обычно широко известного в узких кругах. В качестве рассылки записей и их обратного запроса используется «широковещание» и «рассылка». Преимуществом сети доверия является практическая невозможность безнаказанно подделывать данные и дезорганизовывать работу сети. Недостатком — необходимость строить и поддерживать в актуальном состоянии свои ветки доверия, а именно, добавлять новых знакомых и, по возможности, быстрее блокировать украденные ключи.
8. Блоковая сеть (DAG или blocknet)
Примеры: Dagcoin, IOTA, Byteball.
По сути является комбинациями, либо blockchain и хэш-таблицы, либо blockchain и сети-доверия. В качестве рассылки записей (блоков данных) и их обратного запроса используется «широковещание» и «рассылка». Преимуществом, в отличие от чистой сети доверия, является взаимная связность блоков данных. Это может быть полезно для защиты некоторых видов данных (нотариальные записи, долговые записи и денежные переводы) от будущего случайного или умышленного изменения. Блоковая сеть — технология, которая ещё находится в стадии начального развития.
Заключение
В целом любая распределённая система, как правило, использует не одну, а сразу несколько перечисленных распределённых технологий. Например, RetroShare использует рассылку соседям, хэш-таблицу и сеть доверия, а Pandora использует рассылку соседям, сеть доверия, кэширование и в планах — блоковую сеть.
Иногда к распределённым технологиям добавляется ещё и использование централизованных сервисов. Так, например, Bitcoin-приложение использует irc-сервера для поиска первых узлов сети, а в Tox-клиентах прописано несколько десятков первых узлов («суперноды»), с помощью которых происходит вход в DHT и через неё обнаружение других узлов.
Где могут использоваться распределённые системы? Практически везде: в деревенских радио-сетях, в домовых сетях городских многоквартирников, в локальных сетях предприятий, в полевых армейских подразделениях, в роях боевых роботов (в том числе плавающих), летающих дронов, звеньях самолётов-истребителей и так далее.
Какое может быть назначение у распределённых систем? Практически любое: социальное, экономическое, политическое и военное.
Распределённые системы устойчивы к уничтожению отдельных узлов и коммуникаций, к техническим неполадкам отдельных узлов и коммуникаций, к фрагментации подсетей, к узурпации центров плохими людьми. Поэтом, я считаю, за распределёнными системами будущее, и они по разным причинам будут всё больше и больше развиваться — с участием российских программистов, или без него.