Как создать прямое соединение между двумя клиентами?
Как установить прямое соединение между двумя клиентами не имеющими белые IP и без участия центрального сервера?
Пытаюсь сделать небольшую децентрализованную сеть, рассматриваю вариант, при котором ни один из участников не имеет собственного IP.
Например, в Скайпе используется какая-то технология P2P, при том что у большинства пользователей нет личного IP.
Вадим ⚡️, Точно так же как и другие.
Биткойн например использует IRC канал для поиска серверов, а дальше уже по цепочке идет обмен пирами, так же как DHT в торрентах.
Вадим ⚡️, Будет, если у него получится узнать адреса других пиров.
Как правило они хранятся в кэше, их можно задать вручную при желании.
Т.е центр это один из способов получить координаты пиров для начала работы с ними.
Если центр недоступен и вы не знаете адреса других пиров - сеть работать не будет.
И да - в случае биткойна например, речь идет именно о белых IP адресах, клиент с серым адресом может подключиться к кому угодно, но к нему никто не может подключиться.
Прямые сосединения между двумя серыми в биткойне не поддерживаются, ибо это нафиг никому не нужно.
Такие вещи реализованы например в Teamviewer.
Вадим ⚡️, pwnat - это всего лишь тулза, которая использует внешний сервер. Tor использует т.н. "сервера директорий", их адреса хорошо известны (и неопределенное количество бриджей). Ну "не бывать вороне коровою, не летать лягушатам под облаком" (С)
Может быть и можно, все зависит от того, насколько сильно надо и насколько все готовы будут терпеть тормоза :)
АртемЪ, ну да, но это только в том случае, если порт можно открыть. Если же там наглухо через прокси - весь процесс пойдет через сервера. И в любом случае - начальная идентификация идет через сервера - забанить сервера - и все, аля улю. Правда, их много и распиханы они по КУЧЕ подсетей :D
CityCat4, Ну никто не спорит что тимвьювер это централизованный сервис - там весь процесс подключения идет через сервера.
Но прямые соединения между двумя серыми IP он умеет организовывать.
CityCat4, Из официальной документации pwnat: There is no middle man, no proxy, no 3rd party,
no UPnP/STUN/ICE required, no spoofing, and no DNS tricks.
Нет там никаких внешних серверов. pwnat отправляет запрос на неопределенный IP, который обычно не отвечает, для того чтобы открыть свой порт. Как там дальше - не знаю.
Вадим ⚡️, Ну хорошо, убедили прочитать про pwnat.
Быстро прочитав, я понял, что мне он не опасен - у меня IMCP на роутере блокируется.
Прочитав помедленнее понял, что я ничего не понял и что это надо щупать на модели. Но если там реально полагаются на ICMP - они могут быть весьма разачарованы...
1) Запускаем на машине в сетке А сервер — он будет просто слушать (не секьюрно — он будет слушать всех! — о безопасности заботьтесь сами).
2) Запускаем клиента в сетке B.
Что происходит?
— когда сервер запускается, он начинает отправку фиксированных ICMP «эхо
Запрос» пакетов на фиксированный адрес 3.3.3.3. Мы ожидаем, что эти пакеты
не будут возвращены.
— Теперь 3.3.3.3 НЕ есть тот хост, с которым мы хотим связаться! Но мы его ЗНАЕМ!
— Когда клиент хочет подключиться — он послылает ICMP «Время истекло» пакет якобы с информацией 3.3.3.3 от своего IP.
на адрес роутера сети А
И они попадают серверу в сети А, как якобы ответы на отлуп от 3.3.3.3! Но с дополнительным полезным содержимым (а именно IP адресом клиента и клиентской сети) внутри.
Таким образом, сервер получил IP клиента и его сетки.
Далее
3) Cервер начинает бомбить IP роутера клиента UDP пакетами, скажем, на порт 2222. Его роутер сети А замечает это и открывает обратный маршрут для ответов на этот же порт. Что нам и нужно.
Таким образом, мы получили двусторонний канал UDP пакетов, в который далее можно упихать что угодно — TCP сессии и т.д.
Вадим ⚡️, Можно. Модель надо строить ;) Два узла, соединенных между собой - это типа Интернет, на каждом NAT. За каждым узлом - по второму узлу, которые они маршрутизируют - это типа клиенты, которые хотят связь установить. И тестить на данной модели.
нужен хотя бы один белый ип. купить его у провацдера сейчас не дорого.
если хватит просто обмена файлами между конторами, то можно посмотреть в сторону p2p файлового обмена: торрент и системы автоматического обмена на нем основанные resilio sync (комерция) и syncthing (бесплатная)
anikavoi, понятно, что от насыщенности. А каким образом можно подключиться к определенному серверу за натом? Как он что-то транслирует в сеть? По бродкасту?
anikavoi, Я вообще не могу ничего понять, нет внятной информации ни о чём. Интернет кишит ненужной легкодоступной информацией, а когда ищешь что-то конкретное, получаешь доки без инструкций, без простых лендингов с кнопкой "Let's Start", вообще ерунда какая-то. На форумах ничего путного.
Что такое mesh? Вики вообще про беспроводные сети говорит.
Вадим ⚡️, это потому, что этим термином сейчас называют все децентрализованное :)
Короче. В грубом варианте это так работает:
Каждый нод сети периодически сканирует доступный сегмент сети на присутствие своих "родственников", и устанавливает с ними прямое ДВУНАПРАВЛЕННОЕ соединение.
Т.е. при резолве случается монгол шуудан - "ты такого-то знаищь? Нэт, но я спрошу у других".
Поэтому в таких сетях присутствуют разного рода пространственные индексы, чтоб хоть как-то снизить время на резолв.
Ну а раз соединение двунаправленное, то и вопросов с "проходом ната" нет.
В общем все это неэффективно и покачто не видел нормальных реализаций.