gpt4 book ai didi

networking - 用于可靠网络连接的实用 NAT 穿越

转载 作者:可可西里 更新时间:2023-11-01 02:30:03 27 4
gpt4 key购买 nike

我已经看到并阅读了很多类似的问题,以及相应的维基百科文章( NAT traversalSTUNTURNTCP hole punching ),但是大量的信息并不能真正帮助我我的问题很简单:

我正在编写一个 P2P 应用程序,我希望 NAT 后面的我的应用程序的两个用户能够相互连接。连接必须可靠(与 TCP 的可靠性相当),所以我不能只切换到 UDP。该解决方案无需重新配置即可在当今的通用系统上运行。如果有帮助,该解决方案可能涉及可连接的第 3 方,只要它不必代理整个数据(例如,获取对等方的外部 (WAN) IP 地址)。

据我所知,我唯一的选择是使用“可靠的 UDP”库 + UDP hole punching .是否有用于此的 (C/C++) 库?我找到了 enetrelated question , 但它只处理解决方案的前半部分。

还有吗?我看过的东西:

  1. Teredo tunnelling - 需要操作系统和/或用户配置的支持
  2. UPnP端口转发 - UPnP 并非在任何地方都存在/启用
  3. TCP hole punching似乎是实验性的,只在某些情况下有效
  4. SCTP比 IPv6 更受支持。 UDP 上的 SCTP 只是奇特的可靠 UDP(见上文)
  5. RUDP - 几乎没有主流支持
  6. 根据我对 STUN、STUNT、TURN 和 ICE 的理解,它们都不会帮助我。

最佳答案

ICE 收集要连接的候选 IP/端口目标列表。每个对等点收集这些,然后按顺序对每个候选者运行连接检查,直到检查通过或检查失败。

当 Alice 尝试连接到 Bob 时,她以某种方式获得了一个可能的方式列表 - 由 Bob 确定 - 她可以连接到 Bob。 ICE 称呼这些候选人。 Bob 可能会说,例如:“我的本地套接字是 192.168.1.1:1024/udp,我的外部 NAT 绑定(bind)(通过 STUN 找到)是 196.25.1.1:4454/udp,您可以在 1.2 调用媒体中继(中间盒) .3.4:6675/udp”。 Bob 将其放入 SDP 数据包(对这些不同候选人的描述),并以某种方式将其发送给 Alice。 (在 SIP 中,ICE 的原始用例,SDP 在 SIP INVITE/200/ACK 交换中进行,建立 SIP session 。)

ICE 是可插拔的,您可以配置候选人的准确性质/数量。您可以尝试直接链接,然后向 STUN 服务器请求绑定(bind)(这会在您的 NAT 中打一个洞,并告诉您该洞的外部 IP/端口,您将其放入 session 描述中),然后返回要求 TURN 服务器中继您的数据。

ICE 的一个缺点是您的同行交换 SDP 描述,您可能喜欢也可能不喜欢。另一个是 TCP 支持仍在 draft form 中,这对您来说可能是也可能不是问题。 [更新:ICE 现在正式成为 RFC 6544。]

游戏经常使用 UDP,因为旧数据没有用。 (这就是 RTP 通常在 UDP 上运行的原因。)一些 P2P 应用程序经常使用中间盒或中间盒网络。

IRC 使用中间盒网络:IRC 服务器形成网络,客户端连接到附近的服务器。从一个客户端到另一个客户端的消息可能会通过服务器网络传输。

如果这一切都失败了,您可以看看 BitTorrent 的架构,看看它们是如何处理 NAT 问题的。正如 CodeShadow 在下面的评论中指出的那样,BitTorrent 依赖于网络中可达的对等点:在某种意义上,一些对等点形成了一个中间盒网络。如果这些中间件可以充当中继,您将拥有一个类似 IRC 的架构,但它是动态设置的。

关于networking - 用于可靠网络连接的实用 NAT 穿越,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3614319/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com