【问题标题】:Establishing P2P TCP/UDP connections (NAT traversal)建立 P2P TCP/UDP 连接(NAT 穿越)
【发布时间】:2017-03-25 18:34:28
【问题描述】:

有没有什么方法可以在没有中间服务器的情况下通过 TCP 或 UDP 建立真正的 P2P 通信?我知道,如果两台计算机只有公共 IP 地址,这是非常可行的,但如果它们位于任何类型的 NAT 路由器或专用网络后面,它就会开始变得棘手.. 事实上,我越研究它似乎越多根本不可能。我发现了 STUN、TURN 和 ICE 协议以及打孔,但据我了解,它们都需要某种服务器来至少建立连接。我很惊讶看似如此简单的事情似乎很难做到,我错过了什么吗? 理想情况下,我正在寻找使用 Golang 的解决方案,任何 C++ 中的帮助或示例也会很有用,谢谢。

【问题讨论】:

  • if they are behind any sort of router 主要问题是 NAT,而这又是因为 IPv4 中缺少地址。如果没有 NAT,它会很简单,是的。不,如果没有第三台主机,这是不可行的(在 IPv4 中)。一端必须开始连接,而另一台路由器无法知道它后面的哪个主机是目标。
  • 你看过libp2p吗?
  • @ChristopherWaldon 看起来很有趣,但仍然是 WIP 并且似乎没有提供任何 ICE 不提供的功能,即,如果其他连接类型不可行,仍然依赖服务器中继。不过还是谢谢。
  • 要建立 P2P 连接需要交换 IP 地址和端口。因此,至少需要一些服务来获取这些 IP 地址和端口。否则你会怎么做?我之前回答过这个问题here,并简要介绍了如何进行 ICE。

标签: c++ go tcp udp p2p


【解决方案1】:

这不是一个严格的围棋问题——它是一个一般的网络问题。

之所以如此困难,是因为互联网从未设计为支持 NAT,NAT 刚刚发生并破坏了许多功能。您的问题的干净解决方案是切换到没有 NAT 的 IPv6,但这可能是不可能的

如果您的 NAT 设备支持 NAT-PMP 或 uPNP,您可以使用它。最简单的方法是创建一个到 libminiupnpc 的 cgo 绑定,或者您可以去寻找一个本地 Go 库。

如果您的 NAT 不支持这两种协议中的任何一种,那么您可能不走运,因为打孔是一种脆弱且困难的技术,您可能会发现难以实施。

【讨论】:

    猜你喜欢
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2020-04-05
    • 1970-01-01
    相关资源
    最近更新 更多