我已经看过并阅读了很多类似的问题,以及相应的维基百科文章(NAT遍历,STUN,TURN,TCP打孔),但是大量的信息并没有真正帮助我解决我的非常简单的问题:
我正在编写一个P2P应用程序,我希望NAT后面的两个应用程序用户能够相互连接.连接必须可靠(与TCP的可靠性相当),所以我不能只切换到UDP.该解决方案应该适用于当今的通用系统而无需重新配置.如果有帮助,解决方案可能涉及可连接的第三方,只要它不必代理整个数据(例如,获取对等方的外部(WAN)IP地址).
据我所知,我唯一的选择是使用"可靠的UDP"库+ UDP打孔.这有(C/C++)库吗?我在相关问题中找到了enet,但它只关注解决方案的前半部分.
还要别的吗?我看过的事情:
在谈到UDP时,我知道"连接"这个词并不合适,但......
服务器(具有已知IP的服务器)如何通过Internet将其UDP数据包发送到NAT后面的客户端?
例如:假设客户端使用TCP上的某些消息传递连接并验证服务器.此时,服务器已准备好通过UDP开始将数据流传输到客户端,但是服务器如何知道在哪里寻址UDP数据包,以便他们能够通过任何NAT路由器找到客户端?
如果客户端拳头通过UDP发送"我已准备好流媒体请"消息,NAT路由器是否会保持端口打开,以便服务器可以使用其UDP数据流进行响应?
或者我在这里偏离轨道?
我想使用P2P构建一个分散的,类似reddit的系统.基本上,我希望保留reddit的基本功能,但要使其分散,以使其更加强大并且不受审查.这也将允许人们开发不同的客户端以匹配他们想要浏览它的方式.
你能推荐一些优秀的p2p库作为我的工作吗?它们应该是开源的,跨平台的,强大且易于使用的.我不太关心语言,我可以适应.
language-agnostic networking p2p social-networking nat-traversal
我遇到了一个有趣的问题.基本上我有两部手机都在NAT之后.我想使用UDP直接在2台设备之间进行通信.
我知道如果我发起从电话到服务器的连接,那么我可以将数据推回到与电话的连接(即从收到消息的同一端口将其发送回收到的相同IP和端口) .所以我可以通过将两部手机连接到服务器来轻松地在两台设备之间进行通信.然后将数据发送到服务器并将其重新路由回电话.这绕过了我可能遇到的任何NAT遍历问题.
但是我宁愿只使用服务器将2个设备指向对方,然后让它们直接通信.我该怎么做呢?是否可以不使用像uPnP这样的东西?
任何帮助都会很有用!
编辑:我发现这个文件http://www.brynosaurus.com/pub/net/p2pnat/它看起来像发夹翻译是我所追求但它看起来并没有被广泛支持.我想知道移动ISP对UPnP的支持有多好?
当我读取设备的IP地址时,我总是得到本地IP地址.
我使用以下代码片段来做到这一点.
public String getIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
String ip = Formatter.formatIpAddress(inetAddress.hashCode());
Log.d("VPNConnected",ip);
return ip;
}
}
}
} catch (Exception ex) {
Log.d("exception", ex.toString());
}
return "EMPTY";
}
Run Code Online (Sandbox Code Playgroud)
但我需要在不使用任何外部主机或web apis(如http://jsonip.com)的情况下读取外部IP地址
我正在寻找.Net中点对点NAT遍历的建议或解决方案.假设我有一个聊天应用程序,两个客户端需要连接,但两者都在NAT后面:
对于家庭场景,uPNP可能没问题,因为只涉及电缆调制解调器或消费者路由器.但是,uPNP无法实现的企业环境呢?
我熟悉UDP穿孔,可以握手,但我宁愿不依赖它来传输真实的应用数据.
我也研究过IPv6和Teredo,但我不确定每个客户端都有IPv6可用性,并且对于所有Teredo要求(服务器,中继等)都有点混乱.
这是2011年和IM /聊天客户已经存在了十年,然后一些 - 所以我相信这个问题已经解决了很多次.任何人都可以推荐这方面的最佳实践吗?提前致谢!
我正在尝试在我的树莓派上设置一个能够突破 NAT 路由器后面的实现,这样我就可以远程连接到它,无论它位于哪个网络后面。
我已经尝试过 pagekite.me,它作为中继/反向隧道解决方案非常棒,但我觉得它仍然有点笨重(存在延迟问题,因为中间需要连接一台额外的服务器)。
我已经阅读了有关 STUN 和 ICE 的信息,但我不知道有什么解决方案可以在我的树莓派上实现。
目标是我可以通过 SSH 连接到我的 PI,无论其网络配置(路由器/网络)和网络防火墙如何。
有人可以指出我应该在哪里或寻找什么的正确方向吗?
所以,我一直在阅读 NAT-Punchthrough。我似乎明白了这个想法,但我很难实现它,而且我觉得我在这里错过了一步。测试此功能有点困难,因为当涉及到基于 Internet 的连接时,我几乎无法控制环境。
我有一个 SQL 服务器作为我的“协助者”运行,它保留服务器和客户端的外部地址,以及外部看到的端口。
以下是到目前为止的步骤: - 我通过存储服务器/客户端 IP/PORT 的 Web 请求(PHP 脚本)连接到我的 SQL 服务器 - 当两者都已知时,客户端和服务器都尝试连接(服务器主机在设置的端口上,客户端通过设置的端口连接) - 没有任何重大的事情发生
这里有 2 个未知数,我想和你核对一个。NAT-Punchthrough 是否真的要求我使用我计划在之后的步骤中连接的确切(内部/LAN)端口执行第一步?
如果是这样,我不知道我的服务器在水下究竟是如何工作的,所以它可能需要比我最初给定的静态端口更多的端口来连接,但这至少给了我一个提示。
如果有人对此有更多文档,请告诉我。
来源:
P2P 应用程序编程
http://www.mindcontrol.org/~hplus/nat-punch.html
一台PC如何通过互联网连接到另一台PC?
一个例子是监听PC 1上的连接的程序.PC 1位于路由器1后面.PC 2有一个客户端程序试图连接到PC 1.
在这种情况下,用作收听程序的正确技术/技术是什么?
我尝试为我的应用程序实现UDP打孔算法.当两个对等方联系服务器显示其公共IP时,3G蜂窝NAT为同一内部UDP端口分配了恒定的外部端口,但是,3G蜂窝NAT 根据目的地改变了内部 - >外部端口映射.
因此,例如,如果C是静态IP服务器,则A-> C映射到端口1234,而A-> B映射到端口5678.这样UDP打孔失败.
由于这些蜂窝NAT使用CGN,因此没有UPnP/NAT-PMP支持.我已经阅读了关于CGN的PCP,其功能与此类似,但是,我没有在PCP上找到任何协议信息.
有没有人知道是否有办法克服这个目标变量端口映射问题?
通过端口转发(如PCP)或遍历(PREFFERED).
最后一件事.有一些概念证明像skype,viber和MOST重要的洪流下载器,如那些依赖于vuze-core(frostwire),可以通过3G和其他蜂窝网络在Android上运行.所以他们显然必须找到解决方案......
提前致谢!
networking udp portforwarding cellular-network nat-traversal
nat-traversal ×10
nat ×5
p2p ×5
networking ×4
udp ×3
.net ×2
android ×1
java ×1
mobile ×1
port ×1
stun ×1
tcp ×1
traceroute ×1
wcf ×1