Есть ли способ установить истинную связь P2P через TCP или UDP без промежуточного сервера? Я понимаю, что это вполне выполнимо, если два компьютера имеют только общедоступные IP-адреса, но если они находятся за каким-либо NAT-маршрутизатором или в частной сети, это начинает становиться все сложнее … на самом деле, чем больше я смотрю на это, тем больше это кажется ясно не возможно. Я обнаружил протоколы STUN, TURN и ICE и пробивание дырок, но, насколько я понимаю, им всем нужен какой-то сервер, чтобы хотя бы установить соединение. Я поражен, что, казалось бы, так просто, кажется, что это трудно сделать, я что-то упустил?
В идеале я ищу решения, использующие Golang, любая помощь или примеры на C ++ также будут полезны, спасибо.
Это не строго вопрос Go — это общий сетевой вопрос.
Причина, по которой это так сложно, заключается в том, что Интернет никогда не был спроектирован для поддержки NAT, NAT просто произошел и нарушил множество функций. Чистое решение вашей проблемы — перейти на IPv6, где нет NAT, но это может быть невозможно
Если ваш NAT-блок поддерживает NAT-PMP или uPNP, вы можете использовать это. Простейшим способом было бы создать привязку cgo к libminiupnpc
, или вы могли бы пойти на рыбалку для местной библиотеки Go.
Если ваш NAT не поддерживает ни один из этих протоколов, то вам, вероятно, не повезло, поскольку пробивание дырок — это хрупкая и сложная техника, которую вам, вероятно, будет сложно реализовать.
Других решений пока нет …