【发布时间】:2011-04-06 13:43:55
【问题描述】:
我已经看过并阅读了很多类似的问题,以及相应的维基百科文章(NAT traversal、STUN、TURN、TCP hole punching),但是大量的信息并没有真正帮助我我的问题很简单:
我正在编写一个 P2P 应用程序,我希望我的应用程序在 NAT 后面的两个用户能够相互连接。连接必须可靠(与 TCP 的可靠性相当),所以我不能只切换到 UDP。该解决方案无需重新配置即可在当今的通用系统上运行。如果有帮助,该解决方案可能涉及可连接的第 3 方,只要它不必代理整个数据(例如,获取对等方的外部 (WAN) IP 地址)。
据我所知,我唯一的选择是使用“可靠的 UDP”库 + UDP hole punching。是否有(C/C++)库为此?我在related question 中找到了enet,但它只负责解决方案的前半部分。
还有什么?我看过的东西:
- Teredo tunnelling - 需要操作系统和/或用户配置的支持
- UPnP 端口转发 - UPnP 并不存在/无处不在
- TCP hole punching 似乎是实验性的,仅在某些情况下有效
- SCTP 的支持程度甚至低于 IPv6。 UDP 上的 SCTP 只是花哨的可靠 UDP(见上文)
- RUDP - 几乎没有主流支持
- 根据我对 STUN、STUNT、TURN 和 ICE 的理解,它们在这方面对我没有帮助。
【问题讨论】:
-
您发现的简单问题一点也不简单。 NAT 穿越是hard。是什么让 ICE 不适合?它使用SDP?还有什么?
-
也许我无法从大量晦涩的术语中理解任何内容,但 ICE 将如何帮助我呢?据我了解,简单来说,ICE 只是确定它是否可以直接连接,如果不能,它使用中间服务器来传输数据。
-
另外,我有点不相信还没有人解决这个问题。我的意思是,它必须非常普遍!主要在电子游戏中(有些可以处理不可靠的连接,但不是全部)。每个人都只是编写自己的“可靠 UDP”协议吗?
标签: networking tcp nat-traversal