Netsukuku

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

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

На данный момент завершено портирование Vala и доступна beta-версия. Релиз второй версии запланирован на июль-август 2017 года.

Реализация 
Netsukuku — это ячеистая сеть передачи данных, или p2p сеть, которая автоматически генерируется и самостоятельно поддерживается. Она создана для управления неограниченным числом узлов с минимальными затратами процессорного ресурса и памяти. Благодаря этому в будущем возможно построение всемирной распределённой, анонимной и не контролируемой сети, отдельно от Интернет, без поддержки каких-либо служб, провайдеров и тому подобного.
Такая сеть состоит из компьютеров, физически соединённых друг с другом, поэтому нет необходимости надстройки над уже существующей сетью. Netsukuku создаёт только пути, которые соединяют компьютеры в единую сеть.
Иначе говоря, Netsukuku заменяет 3-й уровень современной модели OSI другим протоколом маршрутизации.

В качестве замены DNS (Domain Name System, системы доменных имён) авторы Netsukuku, предлагают использовать A Netsukuku Domain Name Architecture (ANDNA).

Netsukuku автоматически управляема. Она создаёт сама себя и может функционировать автономно. При подсоединении нового узла к Netsukuku сеть автоматически переписывает себя, и все остальные узлы знают наиболее быстрый и эффективный путь к новоприбывшему узлу. Узлы не имеют привилегий или ограничений по сравнению с остальными узлами: они представляют собой части одной сети.

С увеличением числа узлов сеть растёт, становясь более эффективной. В Netsukuku нет различий между локальной и глобальной сетью, поэтому говорить о локальной сети бессмысленно.

Такая сеть не может быть контролируема или разрушена, потому что она полностью децентрализованная и распределённая. Единственный способ разрушить такую сеть — это физически вывести из строя каждый сигнальный узел, входящий в неё, или разбить на несвязанные островки.

Внутри Netsukuku кто угодно, когда угодно и откуда угодно может подсоединиться к сети без каких-либо бюрократических проволочек или правового согласия. Более того, каждый узел динамичен и не постоянен. IP-адрес, идентифицирующий компьютер, выбирается случайно, поэтому его невозможно сопоставить с реальным физическим местом источника сигнала. К тому же, нет никакого контакта с какими-либо организациями.

Пропускная способность ограничивается возможностями нынешних сетевых карт.

Netsukuku — это ячеистая сеть, или p2p сеть, построенная на протоколе динамической маршрутизации Npv7_HT. В настоящее время существует достаточно много протоколов и алгоритмов для динамического управления, но они все отличаются от Npv7_HT, поскольку используются строго для создания маленьких сетей. Управление Интернетом также осуществляется различными протоколами, такими как OSPF, RIP или BGP, в основе которых лежат классические алгоритмы, способные находить наилучший путь для достижения узла в сети.
Данные протоколы требуют больших ресурсов процессора и памяти. По этой причине для подобных целей предназначены специальные компьютеры. Ни один из этих протоколов не сможет создать и поддерживать такую сеть, как Netsukuku, в которой каждый узел управляется самостоятельно, потому что маршрутная карта всех путей, хранящаяся на каждом компьютере в сети, требовала бы около 10 Гбайт пространства.

Структура Npv7 — сеть как фрактал. Для расчёта всех необходимых путей связи узла со всеми остальными узлами протокол использует особый алгоритм, называемый Quantum Shortest Path Netsukuku (QSPN). Фрактал — это математическая структура с дробной размерностью, которая обладает свойством рекурсивности: каждая её часть является уменьшенной копией целого. Поэтому возможно большое сжатие структуры, которая может безгранично расширяться. А это значит, что нужно всего лишь несколько килобайт для хранения всей карты маршрутов Netsukuku.
Структура маршрутной карты Netsukuku может быть также определена как высококластеризованный граф узлов.

С другой стороны, QSPN представляет собой метаалгоритм в том смысле, что не следует никаким математическим правилам, а использует случайность и хаос, которые не требуют сложных вычислений. QSPN выполняется в реальных сетях, узлы посылают QSPN-пакеты для создания сети. По этой причине не всегда верно утверждение, что определённый пакет будет отослан раньше какого-либо другого.

Netsukuku не ограничивается созданием только сетей из компьютеров. Это протокол, который может использоваться в любой ситуации, когда надо соединить точки между собой.

Мобильная телефонная сеть представляет собой тысячи узлов, связанных с одним узлом, который распределяет трафик и передаёт информацию узлу назначения.
Netsukuku может быть использована в мобильных телефонах, сделав бессмысленным существование многочисленных операторов сотовой связи.

Netsukuku может быть внедрена в любые коммуникационные системы, которые сейчас используются.

Протокол Npv7 
Протокол Netsukuku, первая версия.

Netsukuku использует свой собственный протокол Npv7, который родился из трёх предыдущих версий. Первый был очень похож на нынешние протоколы динамического управления: сеть была фактически разделена на несколько групп, и каждый сигнальный узел имел чёткую карту полной сети. Такая система не могла работать с Netsukuku, так как требовалось постоянно обновлять карту сети и каждое обновление приводило к перегрузке сети. Кроме того, после каждого обновления сети требовалось пересчитать все пути.

Разграничения Netsukuku.

Базовые определения:

src_node Исходный узел. Узел, который отправляет пакет узлу назначения dst_node.
dst_node Узел назначения. Узел, который получает пакет от исходного узла src_node.
r_node Удалённый узел от узла X — это любой узел, связанный с узлом X.
g_node Группа узлов или группа групп узлов.
b_node Пограничный узел — узел, соединённый с двумя (r_node) узлами из разных (g_node) групп узлов.
h_node Цепляющийся узел — узел, подсоединяющийся к Netsukuku.

int_map Внутренняя карта. Внутренняя карта узла X содержит информацию о группе узлов (g_node), к которой он принадлежит.
ext_map Внешняя карта. Карта содержит информацию о группах узлов.

bmap/bnode_map Карта пограничных узлов. Карта содержит информацию о (b_node) пограничных узлах.

Npv7 II Лазерная передача, направленная сразу нескольким неспецифицированным приёмникам.

Npv7 II вторая версия прокола Npv7.

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

QSPN 
Тому, кто знаком с физикой волны, будет просто понять, как работает qspn. Если бросить камень в бассейн с водой, то можно наблюдать следующее: волны начинают распространяться из начальной точки, причём каждая волна рождает новую волну, которая продолжает распространяться и рождать все новые и новые волны. Когда волна ударяется о края бассейна или о какую-то преграду, она отражается и начинает распространяться в обратную сторону. В применении к qspn камень — это qspn_starter, бассейн — gnode, а каждая волна — tracer_pkt. Каждая новая волна несёт с собой информацию о родившей её волне. Когда tracer_pkt (волна) достигает extreme_node (препятствия или границы бассейна), рождается qspn_open (отражённая волна).

QSPN базируется на описанном принципе. Начиная трассировку узлов, каждый узел посылает qspn_pkt, называемый qspn_close, становясь тем самым qspn_starter.
Qspn_pkt — это обычный tracer_pkt, но его метод вещания немного отличается от остальных.
Каждый пакет, который получает qspn_close, «закрывает» линк узла, от которого получил этот пакет и отсылает пакеты по всем своим остальным линкам. Все последующие полученные qspn_close-пакеты будут переправляется по всем оставшимся незакрытым линкам.
Через некоторый промежуток времени появляются узлы, у которых все линки будут закрыты.
Такие узлы становятся extreme_node и посылают в качестве ответа другой qspn_pkt-пакет (qspn_open). Другими словами, qspn_open-пакет отправляется после того, как получены qspn_close-пакеты от всех узлов.
Пакет qspn_open содержит всю информацию, собранную в последнем полученном пакете qspn_close. Extreme_node посылает пакет qspn_open по всем своим линкам, кроме того узла, от которого он получил последний qspn_close; этому узлу отсылается пустой пакет. Другими словами, пакет qspn_open отправляется после того, как узел получил пакет qspn_close от всех узлов.
Узел, получивший пакет qspn_open, открывает все линки. Узлы со всеми открытыми связями абсолютно ничего не делают. Таким образом гарантируется законченность обмена пакетами qspn_close.
У qspn_open-пакетов также есть идентификационный номер(sub_id) — число, которое идентифицирует во внешних картах узлы «extreme_node», сгенерировавшие эти qspn_open-пакеты. Sub_id, сгенерированный в самом первом пакете и не меняющийся во всех порождённых (qspn_open) пакетах, используется для управления большим числом qspn_pkt-пакетов, так как рано или поздно каждый узел сгенерирует пакет qspn_open, и все они должны быть независимы и отличны друг от друга.
Действительно, все узлы, которые имеют только одну связь, — это узлы extreme_node, ведь когда они получают qspn_close, они уже закрыты.
После отправки пакета qspn_open узел не может отвечать больше никому и ни на какие полученные qspn_pkt-пакеты, поэтому он больше ничего не отправляет.

Узел qspn_starter, который запустил qspn, становится обычным узлом, но не отправляет пакет qspn_open, поскольку отправил первый qspn_close. Кроме того, чтобы обновить свою собственную карту, узел будет использовать все полученные qspn_close-пакеты, кроме тех, которые были отправлены такими же qspn_start-узлами. Таким образом поддерживается стабильность в случае наличия более одного узла «qspn_starter».

Примечания

См. также 
 Анонимные сети
 Криптоанархизм
 Шифропанк
 Цифровой барьер
 I2P — анононимная сеть
 B.A.T.M.A.N.
 Freenet
 TOR
 Cjdns

Ссылки 
 what’s this? Документация
 Скачать релиз
 Netsukuku по-русски

Анонимные сети
Протоколы маршрутизации
Свободные файлообменные клиенты
Программное обеспечение для Linux
Свободное программное обеспечение, написанное на Python
Программное обеспечение с лицензией GNU GPL