Как стать автором
Обновить

P2P-форум с нуля | от NAT hole punching до автономной и полностью децентрализованной сети

Уровень сложностиСредний
Время на прочтение32 мин
Количество просмотров17K
Всего голосов 76: ↑76 и ↓0+76
Комментарии25

Комментарии 25

Осталось только примотать файлообменник!

Например, два телефона показывают друг другу QR-коды, после чего могут обмениваться файлами. Получится что-то типа https://ru.wikipedia.org/wiki/Shareit, только через интернет.

Вообще, необходимость иметь дополнительный канал связи для обмена адресами это проблема. Если хотим удобства, придётся использовать третью сторону для этого. А ей придётся доверять.

Я же правильно понимаю, что если я хочу добавлять в свой уютный чатик кого угодно, то кому-то из чатика придётся руками добавлять каждого нового участника?

Третья сторона нужна только чтобы пробить "тоннель". При обмене достаточно шифровать трафик чтобы исключить прослушку. Хотя тут уже проблема обмена ключами всплывает.

Я скорее про то, что если мы не хотим заниматься передачей портов друг другу, т.е. хотим удобства, то нужна третья сторона, которая сделает это за нас. Типа в приложении будет уведомление "Вася хочет подключиться к вам, Ок?".

Если вы оба за NAT, то без третий стороны никак.
А учитывая что кто угодно может пытаться пробить тоннель к вам, то даже если это ваш stun-сервер, нельзя быть уверенным что к вам реально подключается Вася. Это просто вариант создания канала для обмена сообщениями. А вот Вася на то стороне или нет, всё равно придется выяснять с помощью обмена сообщениями после настройки канала.

Т.е. всё-равно нужна идентификация по установленному каналу.


Вообще, пока я ещё не знал про hole punching у меня был рабочий прототип "штормового пробития")

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

С другой стороны, сетевое оборудование на это не рассчитано и процессор моего RouterBoard нормально так напрягался на этом моменте)

Для этого оба участника должны знать IP адреса роутеров друг друга + синхронизировать по времени "штормовое пробитие".

Это да, я уже походу привык к статичным адресам)

cp866

А что за приколы с кодировкой? Оно по-умолчанию прикидывается DOS?

Спасибо! Мой косяк. Проблемы никакой нет, просто забыл исправить на юникод (он же должен быть и по умолчанию)

Плюс с голым cp866 есть вероятность ошибки при энкодировании символа не из таблицы. Так что однозначно нужно выбирать из этих вариантов:

.encode('cp866', 'ignore')
.encode('utf-8')

Ну, ретрансляция не есть решение задачи p2p. Само собой, не каждый транслятор можно так пробить, не в каждой корпоративной сети вообще есть гейтвей в интернет)

Однако большинство кейсов покрываются STUN, иначе бы Telegram и Discord не работали с таким широким покрытием.

Вот что нашёл по теме

Преодоление барьера из двух симметричных NAT

http://yourcmc.ru/wiki/Преодоление_барьера_из_двух_симметричных_NAT

Т.е. пробитие возможно, но только не за разумное (для работы) время

Если кратко, то предлагается найти закономерность выделения портов

Не понял из статьи получится ли преодалеть Port Restricted

Так в чем уникальность метода если используются STUN сервера? Это десятки лет назад так же было реализовано. Что нового выдумал автор?

Я вот узнал что такое STUN сервера и мне было интересно.

Идея с децентрализованным форумом интересна, но не реалистична. Множеству участников надо независимо на своих устройствах хранить историю сообщений. Но при больших размерах сети места для этого не хватит. Тогда, выходит, клиенты будут стремиться удалять ненужное. При сильно больших размерах сети этого ненужного (в том числе спама) будет столько, что хранить будут только что-то вроде личных сообщений. Но в таком случае не будет даже стимула хранить чужие личные сообщения, на случай, если получатель находится вне сети. Тогда выйдет, что личные сообщения будут доходить, когда оба отправитель и получатель находятся в сети. В итоге вся концепция выродиться в нечто вроде децентрализованного мессенджера (вроде Tox).

Хватит места. Вся википедия 26 гигабайт.

Тут вопрос в том что данная архитектура позволяет спуфить чатик.

Спасибо автору за пост, очень интересно почитать на русском.

Если эта тема интересна советую посмотреть keet.io, и фреймворк под ним holepunch.to

А торренты же тоже используют без трекинговый обмен при включенном DHT. Насколько этот подход хуже вашего? или DHT это поверх аналога вашего только от bittorrent ?

У NAT есть киллер-фича — он представляет собой идеальный фаервол:

O_O Эта киллер фича реализуется просто настройкой дефолтного поведения нормального брандмауэра. Например, у меня на маршрутизаторе стоит OpenWRT и задано, что никого внутрь не пускать по IPv6 (как ни странно, дефолтное поведение из коробки). Мне не нужны никакие NAT. Всё работает и также защищено, как было бы «защищено» NAT.

А вот «киллер фича» NAT раскрывается в полной мере, когда я хочу пустить куда-то извне. В IPv6 я просто говорю брандмауэру, а пусти ка вот на этот хост или группу хостов соединения по вот этому порту. А теперь попробуйте сделать тоже самое при использовании NAT! А уж если хотите p2p соединений, то придётся пользоваться услугами посредников.

Услугами посредника придется пользоваться всегда

Для установления соединения, да. Сигнальную информацию всё-таки надо централизованно передавать как-то, иначе как друг друга найти. А вот трафик гнать через посредника с тем же IPv6 нет никакой необходимости, достаточно обменяться адресами.

Отлично, давайте кооперироваться! У нас есть проект $hyoo_crowd реализующий децентрализованную субд с крипто-аутентификацией, крипто-авторизацией, бесконфликтным слиянием изменений и, конечно, гуями. Хотелось бы переложить её на полноценные P2P рельсы (пока что клиенты коннектятся к серверам, но алгоритмически это такие же равноправные ноды, как и клиенты), а у вас есть как раз именно они. Так что давайте сообща сделаем что-то по настоящему крутое. Предлагаю обсудить это на нашем форуме.

Заканчивался 2023ий год ... на дворе свирепствовал древний cp866 ...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий