建立P2P TCP/UDP连接(穿越NAT)

问题描述:

有没有办法通过TCP或UDP建立真正的P2P通信而不需要中间服务器?我知道如果两台计算机只有公共IP地址,但是如果它们在任何类型的NAT路由器后面或者在私人网络中,它开始变得棘手,这是非常可行的。实际上,我越是仔细观察,看起来越多显然不可能。我发现了STUN,TURN和ICE协议以及打孔技术,但据我所知,它们都需要某种服务器才能建立连接。我很惊讶看似很简单的事似乎很难做,我错过了什么? 理想情况下,我正在寻找使用Golang的解决方案,任何帮助或C++中的示例也会很有用,谢谢。建立P2P TCP/UDP连接(穿越NAT)

+0

'如果它们在任何类型的路由器后面'主要的问题是NAT,而这又是因为IPv4中缺少地址。没有NAT,这很简单,是的。没有,没有第三个主机,这是不可行的(在IPv4中)。一端必须开始连接,而另一端则无法知道它背后的主机是否是目标。 – deviantfan

+0

你看过[libp2p](https://github.com/libp2p/go-libp2p)吗? –

+0

@ChristopherWaldon看起来很有趣,但仍然是在制品,并且似乎没有提供任何ICE没有的东西,即如果其他连接类型不可能,它仍然退回到服务器中继。不过谢谢。 – ChrysmPsy

这不是严格的Go问题 - 这是一个普遍的网络问题。

的原因,这是非常困难的是,互联网从未被设计为支持NAT,NAT刚刚发生,并打破了很多功能。干净的解决问题的方法是切换到IPv6,在没有NAT,但如果你的NAT盒支持NAT-PMP或UPnP,请您可以使用,这也许是不可能的

。最简单的方法是创建一个绑定到libminiupnpc的cgo,或者你可以去钓鱼一个本地的Go库。

如果您的NAT不支持其中任一协议,那么你很可能出于运气,因为冲孔是一个脆弱和困难的技术,你可能会发现难以实施。