有没有办法在没有中间服务器的情况下通过TCP或UDP建立真正的P2P通信?我知道如果两台计算机只有公共(public) IP 地址,这是非常可行的,但如果它们位于任何类型的 NAT 路由器后面或在专用网络上,它就会开始变得棘手。.事实上,我越看越觉得平淡不可能。我发现了 STUN、TURN 和 ICE 协议(protocol)以及打洞,但据我所知,它们都需要某种服务器来至少建立连接。我很惊讶看似如此简单的事情似乎很难做到,我错过了什么吗? 理想情况下,我正在寻找使用 Golang 的解决方案,任何帮助或 C++ 中的示例也会很有用,谢谢。
最佳答案
这不是严格意义上的围棋问题——这是一个一般的网络问题。
之所以如此困难,是因为 Internet 从未被设计为支持 NAT,NAT 刚刚发生并破坏了很多功能。解决您的问题的干净解决方案是切换到没有 NAT 的 IPv6,但这可能是不可能的
如果您的 NAT 盒支持 NAT-PMP 或 uPNP,您可以使用它。最简单的方法是创建一个绑定(bind)到 libminiupnpc
的 cgo,或者你可以去寻找一个原生的 Go 库。
如果您的 NAT 不支持这两种协议(protocol)中的任何一种,那么您可能就不走运了,因为打洞是一种脆弱而困难的技术,您可能会发现难以实现。
关于c++ - 建立P2P TCP/UDP连接(NAT穿越),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40549502/