Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296

Передача данных между двумя клиентами с серыми динамическими IP с помощью сервера

11.02.2025, 14:03. Показов 777. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый.
Так получилось, что с разных сторон ситуации толкают в эту сторону, поэтому приходится погружаться глубже.
Сейчас пытаюсь понять, как работает технология p2p под капотом и для абстрагирования от привычных шаблонов (чатов и т.п.) буду использовать пример из жизненной ситуации, а именно - подключение по RDP к удаленному ПК.
Как я себе это представляю. Есть два клиента с серыми динамическими и сервер с белым статическим IP.
На клиенте, который подключается к другому, ставим службу на WebSockets, которая подключается к серверу и пробрасывает полученные и переданные данные на какой-нибудь порт localhost. Далее открываем RDP и вводим туда эти самые localhost и порт.
На клиенте, к которому
подключаемся стоит похожая служба, которая должна подключиться к серверу и перенаправить эти данные на localhost и порт RDP (3389 вроде).
На сервере стоит служба на тех же WebSokets, которая ждет, пока оба клиента установят с ним соединение и если обмен идет через него, то просто пробрасывает данные от одного подключения к другому и наоборот, а если соединение p2p, то связывает клиентов между собой.

А теперь вопросы:
1) Как практически серверу связать клиентов напрямую? Т.е. мы имеем по факту два webSokets - что мы должны делать дальше? Как сообщить клиентам, что им нужно теперь обмен варится данными через другую цепочку маршрутов?
2) Чем по факту, кроме шифрования и создания внутренней сети отличается такая схема соединения через сервер от обычного VPN?

Всем спасибо за участие!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.02.2025, 14:03
Ответы с готовыми решениями:

Передача данных между клиентами
Есть два клиента-приложения (в моём случае, на одном компьютере) и сервер. Как реализовать передачу объекта от одного клиента другому?...

Передача данных между клиентами: вопрос скорости и оптимальности
у меня есть сайт, с mysql базой, доступ по FTP и всё такое. как лучше и как будут быстрее передаваться данные между клиентами? вот думаю...

Создать VPN туннель между двумя компьютерами с серыми IP
TLDR: необходимо сделать из _овна и палок туннель к компьютеру для удаленки и работы в сети организации; аналог RadminVPN, но чтобы были...

9
2238 / 1558 / 394
Регистрация: 26.06.2017
Сообщений: 4,599
Записей в блоге: 1
11.02.2025, 15:28
Сервер, RDP, сокеты, VPN. Что, куда, зачем?

По идее, в случае р2р обмена, сервер ничего сам не обрабатывает, его задача отдать клиенту информацию для подключения к другим клиентам, всё.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
11.02.2025, 15:40  [ТС]
Uswer,
Разложу подробнее.

1) По вопросу 1 (тот что про p2p).
Сервер - связующее звено. Без него клиенты никогда не достучатся друг до друга.
Сокеты - классы .Net, которые дают нам доступ к подключениям.
Как вы верно подметили, в p2p сервер данные через себя не гоняет, а только связывает клиентов. Перед этим клиенты должны связаться с сервером. Соответсвенно, самый подходящий для такого сценария способ связи в .Net это WebSokets. И того - на сервере мы имеем два WebSokets к которым установлено подключение от клиентов (у каждого свой) и теперь нам нужно что-то сделать с этими WebSokets, чтобы клиенты перестали обращаться к серверу и начали общаться друг с другом напрямую. Вопрос - что сделать?

2) По вопросу 2 (тот, в котором обмен идет через сервер). Схема очень напоминает классический VPN, кроме шифрования и создания внутренней сети. В чем принципиально у их отличие?
0
2238 / 1558 / 394
Регистрация: 26.06.2017
Сообщений: 4,599
Записей в блоге: 1
11.02.2025, 16:05
Цитата Сообщение от a13428711 Посмотреть сообщение
Вопрос - что сделать?
Выглядит примерно так: клиент запрашивает у сервера список других активных клиентов. Заметьте, что я намерено не указал конкретный инструмент из dotNet для связи, так как можно делать по разному, например мне ближе взаимодействие типа запроса к WebAPI. В ответ на запрос Сервер формирует и отправляет список подключенных клиентов, в котором указаны данные для подключения к каждому клиенту, ну там IP-адрес, порт и всё такое. После чего Сервер регистрирует данного клиента в своём списке активных. Клиенты должны, но не обязаны, периодически обновлять информацию о других клиентах на Сервере. Таким образом все участники будут в курсе кто ушёл, а кто остался. После получения списка активных клиентов сам клиент устанавливает соединения со всеми другими клиентами или только с некоторыми (если есть какое нибудь ранжирование). Всё.
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
11.02.2025, 16:16
Цитата Сообщение от a13428711 Посмотреть сообщение
Как практически серверу связать клиентов напрямую?
1. юзера запускают приложение. Приложение переодически пингует сервер "я на таком IP". Как -- не подскажу, но подозреваю и интернете море инфы по этому вопросу.
2. юзер запрашивает другого юзера через сервер. Сервер отдает актуальный IP (либо что юзер не пинговался последние 5 минут)
3. юзер подключается по указаному IP

Я бы почитал про организацию торента. Там очень похожая история, кроме того момента что не нужно прокидывать трафик для сторонней программы. Теоретически вы можете в настройках RDP указать прокси, поднять этот прокси endpoint локально, а уже он будет перекидывать трафик на другой ПК. Для унификации действий этот прокси можно сделать SOCKS 5, который вроде как умеет разруливать много подключений для разных программ.

Цитата Сообщение от a13428711 Посмотреть сообщение
Чем по факту, кроме шифрования и создания внутренней сети отличается такая схема соединения через сервер от обычного VPN?
Шифрование как раз вы можете прикрутить. От VPN главное отличие -- ваш ПК будет по факту всё ещё работать в текущем подключении, а не виртуальном. Т.е. когда врубаете VPN, любая программа запускаемая на ПК будет работать через виртуальную сеть (по умолчанию), и при этом в этой сети могут быть определенный настройки (например вам можно выдать постоянный IP).

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

Вы же хотите тупо пробросить трафик путём p2p. Первое во что упретесь -- NAT. Он должен понимать куда перенаправить входящий трафик. Ещё провайдер может блочить входящие подключения. Для каждой программы придется настраивать это дело.

P.S. почему вам не подходит просто поднять VPN на двух устройствах?
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
11.02.2025, 16:16  [ТС]
Uswer, это в общих чертах, оно понятно. Мне интересна более конкретная реализация.
Мы же не можем просто отдать клиенту адрес другого клиента, чтоб он к нему подключился, так как сервер и клиенты могут (и скорее всего) находятся в разных подсетях за всякими NAT. Клиент тупо не сможет достучаться, насколько я понимаю.
0
2238 / 1558 / 394
Регистрация: 26.06.2017
Сообщений: 4,599
Записей в блоге: 1
11.02.2025, 16:29
Цитата Сообщение от a13428711 Посмотреть сообщение
Мне интересна более конкретная реализация.
Мне чёта не сильно хочется писать код Сервера и Клиента если честно, поэтому только теоретически
Цитата Сообщение от a13428711 Посмотреть сообщение
так как сервер и клиенты могут (и скорее всего) находятся в разных подсетях за всякими NAT
Вот-вот и Wolfdp об этом тоже указал. Тут вариантов не много, либо проброс портов, но это привет в безопасности, либо работать через общие порты вроде 80 с туннелированием. Возможно есть и другие варианты, но я их не знаю.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
11.02.2025, 16:43  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
юзер подключается по указаному IP
А разве клиент может подключиться к другому клиенту по IP, который ему выдал сервер? Т.е. разве этот IP является белым динамическим, который до закрытия соединения привязан к конкретному клиенту? Насколько я знаю, проходя через каждую подсеть в NAT присваевается свой адрес и сообтветстветсвенно путь, который проходит сервер чтоб дойти до клиента должен отличаться от пути, который нужен второму клиенту, так как они находятся в разных подсетях. Или я что-то путаю?
Цитата Сообщение от Wolfdp Посмотреть сообщение
Я бы почитал про организацию торента
Ок, спасибо за наводку, щас гляну.
Цитата Сообщение от Wolfdp Посмотреть сообщение
От VPN главное отличие -- ваш ПК будет по факту всё ещё работать в текущем подключении, а не виртуальном.
Но я же в теории тоже могу таким макаром сдлетаь а ля виртуальную сеть? Или VPN это прям некий протокол, в соответствии с которым упаковываются данные (IPseс, IKev2 и т.п.), а суть таже самая?
Цитата Сообщение от Wolfdp Посмотреть сообщение
Второе немаловажное отличие -- весь трафик VPN проходит через сервак
Ну это по первому вопросу с p2p. А по второму вопросу трафик также предполагается пускать через сервер.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Первое во что упретесь -- NAT. Он должен понимать куда перенаправить входящий трафик. Ещё провайдер может блочить входящие подключения.
Вот как раз по этой части у меня все вопросы по p2p)
Цитата Сообщение от Wolfdp Посмотреть сообщение
P.S. почему вам не подходит просто поднять VPN на двух устройствах?
RDP просто как пример, выбрал его так на нем можно рассмотреть большую часть вопросов которые имеются.
0
Эксперт .NET
 Аватар для Wolfdp
2667 / 1619 / 354
Регистрация: 15.06.2012
Сообщений: 5,973
Записей в блоге: 3
11.02.2025, 17:45
Цитата Сообщение от Uswer Посмотреть сообщение
Мне чёта не сильно хочется писать код Сервера и Клиента если честно, поэтому только теоретически
Чуть добавлю -- там пипец как много писанины. Написать свое сетевое приложение -- та ещё задача. Тем более p2p.

Цитата Сообщение от a13428711 Посмотреть сообщение
А разве клиент может подключиться к другому клиенту по IP, который ему выдал сервер?
Всё упирается в NAT. Динамический адрес означает что в момент когда вы подключаетесь к интернету вам выдают IP, и вы числитесь на нём до отключения. Это самое отключение может произойти принудительно со стороны провайдера. В остальном -- зависит от провайдера, но я не сталкивался с какой-то сложной маршрутизацией чтобы трафик уходил с разных публичных IP. А вот блокировка, или тот факт что ты за непробиваемым NAT (нужно понимать что он не один, а может быть несколько уровней) -- запросто.

Цитата Сообщение от a13428711 Посмотреть сообщение
Но я же в теории тоже могу таким макаром сдлетаь а ля виртуальную сеть?
В теории - да. Но это не тривиальная задача. Для начала любой VPN добавляет виртуальный сетевой адаптер, который даже в диспетчере устройств числится. Подозреваю там столько моментов нужно учитывать, что закопаешься по уши и не выплывешь. Банальный момент -- в момент инициализации сетевого подключения вам нужно получить IP, DNS и маску подсети. Кто за это будет отвечать?

Повторю вопрос: почему не просто VPN? У вас предполагается много трафика? Не хотите трафик пропускать через сервер? Кроме VPN существует обычное прокси соединение, которое зачастую можно указывать конкретным программам. Я подозреваю что сисадмины знают ещё сотню-другую методов туннелирования трафика. Готовое решение будет в 100 раз быстрее настроить и в 100500 раз надёжнее.
0
6 / 6 / 1
Регистрация: 09.02.2016
Сообщений: 296
11.02.2025, 21:52  [ТС]
Цитата Сообщение от Wolfdp Посмотреть сообщение
там пипец как много писанины
Глаза боятся, а руки делают)
Но в целом, не то, чтобы я хотел прям его писать. Сейчас больше интересно детально понять как работает, а там видно будет. В целом у шарпа, насколько помню, была какая-то библиотека для работы с p2p, но вроде древняя.
Цитата Сообщение от Wolfdp Посмотреть сообщение
Всё упирается в NAT.
Цитата Сообщение от Wolfdp Посмотреть сообщение
или тот факт что ты за непробиваемым NAT (нужно понимать что он не один, а может быть несколько уровней) -- запросто
Вот мне и не совсем понятно как там пробитие происходит. Читаю щас про торренты, дошел до STUN, но пока не сложился пазл)

Цитата Сообщение от Wolfdp Посмотреть сообщение
Повторю вопрос: почему не просто VPN?
У меня на данный момент две проблемы - сделать возможость доступа по RDP и дать возможность нескольким локальным серверам с динамическими серыми адресами обмениваться данными друг с другом.
Первую было бы иделаьно решить через p2p - сконнектил и пусть они там на максимально возможной скорости интернет соединения общаются. Хоть и говорят, что для RDP не так важна скорость, но по опыту знаю, что на быстрооткликающейся машине работать гораздо приятнее. Секретных данных нет, поэтому шифровать не обязательно.
Вторую тоже было бы хорошо так решить, но нужен более стабильный канал на длительном промежутке времени (p2p как я понимаю этим похвастаться не может), поэтому нужен проброс данных через сервер.
VPN в целом справлялся с этими проблемами, до того как РКН начал его блокировать и мои VPN сервисы не начали умирать один за другим...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.02.2025, 21:52
Помогаю со студенческими работами здесь

Передача данных из БД между динамическими Child окнами в MDI приложении
Есть родительская форма Form1. Из нее динамически создается дочерняя Form2. В этой форме есть запрос ADOQuery. Для редактирования данных...

Socket между двумя клиентами и сервером
Здравствуйте. Разобрал урок как делать обмен данными между сервером и клиентом, а как сделать обмен данными между двумя клиентами и...

Передача данных между двумя классами
Здравствуйте, кратко о проблеме: имеется главный класс (maindata) в нем содержится ник и логин пользователя для передачи строки логина в...

Передача данных между двумя устройствами
Добрый день. Подскажите пожалуйста решение задачи: Имеется точка доступа WiFi, к которой подключены смарты и планшеты (без доступа в...

Передача данных между двумя ViewModel
Задача типовая: есть главное окно, отображающее некий список. Пусть это будут фамилии студентов. После выбора студента и клика по кнопке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Размещения без повторений
VistaSV30 31.05.2025
Код возвращает список вариантов размещений A^{k}_{n}=\frac{n!}{(n-k)!} from itertools import permutations def pwr(k, n): # Размещение без повторений (Placement without repetition) if k. . .
Redis и Node.js с TypeScript - решения для высоконагруженных систем
Reangularity 31.05.2025
Redis (Remote Dictionary Server) — сверхбыстрое хранилище данных в памяти, способное обрабатывать операции за микросекунды. И что особенно важно для нас — с удивительно простым API. А теперь. . .
Unit-тестирование с моками в Go
golander 31.05.2025
Большинство разработчиков предпочитают тестировать код без использования моков. Например, при интеграции с Elasticsearch логичнее запустить контейнер локально и тестировать Go-код непосредственно с. . .
Как работать с PDF в C#
stackOverflow 31.05.2025
Нам приходится сталкиваться с PDF по разным причинам. Генерация счетов, создание отчетов, извлечение данных из загруженных пользователем документов, автоматизация рабочих процесов - это лишь верхушка. . .
Двухбуквенные коды стран в шифровании.
russiannick 31.05.2025
Человечество издревле манила возможность замены сочетаний букв вымышленными символами, делающие сообщение понятным только для посвещенных. Настала пора внести в это свой вклад. Двухбуквенные коды. . .
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона.
Programma_Boinc 31.05.2025
Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона. Хотел бы поделиться опытом в исправлении ошибки приложения в части заряда батареи смартфона. Сразу скажу, что. . .
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid
Programma_Boinc 31.05.2025
Добро пожаловать на конкурс PrimeGrid, посвященный 20-летию PrimeGrid: 5-дневный обобщенный поиск простых чисел Ферма n = 20 с 12 июня 20:20 UTC по 17 июня 20:20 UTC. 12 июня 2005 года. . .
Вероятность в шансы / Шансы в вероятность
VistaSV30 31.05.2025
# Шансы -> Вероятность def Chance_to_Probability(ch): def gcd(a, b): # НОД - нужен для упрощения значений шансов while b != 0: a, b = b, a % b return a. . .
FastAPI и Flask: Отличия, производительность и примеры использования
py-thonny 30.05.2025
Если вы разрабатываете веб-приложения на Python, вы наверняка слышали о Flask и FastAPI. Эти два фреймворка часто становятся предметом жарких дискуссий в сообществе разработчиков. И не без основания. . .
ML.NET и TensorFlow.NET: Умные приложения на C# с машинным обучением
stackOverflow 30.05.2025
Еще совсем недавно, когда речь заходила о машинном обучении, C# разработчики обреченно вздыхали и тянулись к Python. Мир искуственного интеллекта словно был огражден невидимым забором с табличкой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »