Как организовать связь клиент-сервер, если у сервера нет выделенного ip и не проброшены порты?
================================================================================================

 Вопрос, скорее, теоретический, нежели практический. То есть я не прошу показать мне куски рабочего кода. Я просто не понимаю принцип того, как это работает.  

  

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

  

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

  

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

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

 Начните с этой статьи [https://en.wikipedia.org/wiki/Hole\_punching\_%28net...](https://en.wikipedia.org/wiki/Hole_punching_%28networking%29) 

 Как вариант можно вот это попробовать. Под капотом все равно есть сервер где то в сети который первоначальный коннект делает дальше уже общаются сами с собой  

<https://professorweb.ru/my/csharp/web/level8/8_3.php> 

<https://github.com/fatedier/frp>  

Нужно поднять сервер где угодно, где можно выставить наружу порт, к нему подключить клиентов. Дальше между клиентам можно поднять p-to-p подключения и пробрасывать порты. 

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

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

Для того же юнити можете посмотреть фотон - он как раз и предоставляет вот эту проксю. 

 VPN 

 Для первого коннекта используется промежуточный и доступный всем прокси в инете.   

Далее он нстраивает связь между двумя игроками, и далее игроки общаются на прямую.  

Одна из технологий p-2-p  

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