问题标签 [nat-traversal]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
p2p - 实时点对点群
如果我有一个客户端应用程序在连接到服务器的多个 Internet 连接(在路由器等之后)上运行。假设有 5 个,其中 3 个被服务器告知彼此的存在,这 3 个是否可以相互连接,以便当其中一个发送消息时,另外两个接收它,这一切都将是在没有第一台服务器或其他两个客户端发送或接收任何信息的情况下完成,只有 3 个客户端相互连接?他们怎么能越过路由器和防火墙?希望这是有道理的。
编辑
从某种意义上说,在 3 个直接相互通信的客户端之间创建一个小型专用网络,而不是通过服务器(除非绝对必要)。也许通过另一个具有足够带宽的客户端并且如果它对连接开放
nat - 以编程方式确定路由器 NAT 类型
我需要在我的程序中以编程方式确定路由器 NAT 类型。我确实查看了一些与 STUN 相关的答案和关于 SO 的 UPnP 相关信息。但没有得到任何确定的答案。
我查看了 STUN RFC (rfc 5389),它没有指定如何确定 NAT 类型。它确实提到它的先前版本(RFC 3489)确实提供了确定 NAT 类型的机制。但也提到
此外。经典的 STUN 用于分类 NAT 类型的算法被发现是错误的,因为许多 NAT 并没有完全适合那里定义的类型。
鉴于上述情况,您能否就我应该如何在我的软件中确定路由器 NAT 类型提出建议。此外,既然 RFC 3489 已经过时,还有其他方法吗?
提前致谢。
networking - PHP、Java Servlet 或 C# WebService 作为 NAT 中间服务器
与其在亚马逊和其他托管公司租用服务器(这将花费很多美元/月),是否可以设置 Java Servlet、C# WebService 或简单的 PHP 网站(带有套接字或 PHP 具有的任何网络功能)并使用作为中间服务器,客户端和服务器可以交换IP吗?
这个问题是关于 NAT 穿越、UDP 打孔等。
从技术上讲,只要中间服务器能够接收和发起连接,就足够了,对吧?中间服务器只需从客户端和服务器读取公共端点,交换它们,并启动与相反(或接近此)端点的相同连接。因此,它看起来像是一个免费的 ASP.NET 托管服务,因为 C# WebService 将使这成为可能,而不是租用 Amazon EC2 服务器来设置更全面的服务器。
c# - C# UDP 服务器/客户端 - NAT
我正在尝试从我的客户端向我的服务器发送一条消息(通过 UDP)。服务器应该回答这个消息,如果客户端收到这个回答,他应该打印出一个消息。
如果我在本地网络上运行客户端和服务器,一切正常。如果我尝试从网络外的另一台 PC 通过 Internet 连接,服务器会收到客户端的请求,发送回答案,但客户端永远不会收到此答案。客户端和服务器都在 NAT 后面,但我在服务器的 NAT 上转发了端口,服务器得到了自己的 DNS。我已经尝试过 NAT 遍历,但是在收到客户端的请求后,它给了我与服务器的 IPEndPoint 相同的 IP 和端口地址。
我不知道如何解决这个问题,所以任何指导将不胜感激。
客户
服务器的代码几乎相同:
c# - c# 使用 stunserver 完成远程计算机发送和接收数据
我无法使用这两个远程计算机发送数据 stunserver。数据来自本地计算机,但远程计算机上的数据不会到来。
我正在使用我的程序 stunserver
networking - TURN 服务器在防火墙后面 - 如何处理 XOR-RELAYED-ADDRESS
我在防火墙后面的服务器上运行 TURN 服务器 (http://tools.ietf.org/html/rfc5766)。机器有一个公共 IP 地址,传入和传出的网络数据包从服务器的专用 IP 地址发送到/从该地址发送。基本上,服务器不能将套接字绑定到公共 IP 地址,只能绑定私有 IP 地址。运行ifconfig
显示具有私有 IP 地址的网络设备。
当我运行 TURN 服务器时,我必须绑定到私有 IP 地址(因为服务器认为它没有连接到公共 Internet)。对分配创建的所有响应都会发回带有私有 IP 地址的 XOR-RELAYED-ADDRESS。客户端收到 XOR-RELAYED-ADDRESS 并将数据发送到服务器的私有 IP 地址,这显然失败了。
我正在考虑两种选择来克服这个问题:
- 让我的客户端代码忽略 XOR-RELAYED-ADDRESS 的 IP 地址,只使用 XOR-RELAYED-ADDRESS 的端口。客户端会将所有中继消息发送到 TURN 服务器的公共 IP(因为客户端已经事先知道该值)和 XOR-RELAYED-ADDRESS 端口。
- 更改我的服务器以了解其公共 IP(即使它无法将套接字绑定到它),并始终在 XOR-RELAYED-ADDRESS 响应中发回公共 IP。
我觉得第一种方法破坏了 TURN RFC ......即使我无法想象 TURN 服务器会将 XOR-RELAYED-ADDRESS 的 IP 作为 TURN 服务器的公共 IP 以外的东西发回的情况,RFC 说XOR-RELAYED-ADDRESS 是客户端应该发送数据的地方。
我觉得第二种方法对 RFC 的破坏更少……如果这有意义的话。此外,这种方法不会强制客户端做任何特殊的事情,而第一种方法需要所有客户端都遵守上述规定。
你怎么看待这件事?有没有人经历过这种情况,和/或对哪种方法对 RFC 的破坏更少,或者任何一种方法是否违反了 RFC 有任何意见?
networking - TURN server XOR-RELAYED-ADDRESS IP 不同于自己的公网IP
假设我正在运行一个绑定到公共 IP(比如 100.0.0.1)的 TURN 服务器。当服务器为创建分配请求创建中继端口时,服务器是否会在 XOR-RELAYED-地址属性?我对网络不够熟悉,无法了解所有可能的情况,并且RFC 5766并没有真正说明任何具体内容(据我所知)。
换句话说,XOR-RELAYED-ADDRESS 中的 IP 地址是多余的吗?在我考虑的所有情况下,客户端只需要知道分配的端口,并且可以完全忽略 XOR-RELAYED-ADDRESS 的 IP。只要客户端知道中继端口,它就可以始终在中继端口将中继数据发送到 TURN 服务器公共 IP(它已经知道 IP,因为它必须最初连接......)。
任何意见?
networking - 客户端服务器架构
我正在为我的应用程序的服务器客户端方面选择什么技术而苦苦挣扎。
定义设计
- .net 2 上的 Windows、C#
- 在许多机器上都有 .net 2 服务。我称之为客户。
- 机器可以位于连接到 Internet 的 NAT(或不连接)后面的不同网络中。
- 服务器服务是公开的。
要求
- 按需与客户沟通。
- 客户端必须侦听传入连接。
- 服务器可以在线也可以不在线。
- 端口转发是不可能的。
我有什么选择去做这样的事情?现在我正在研究 UDP 打孔技术。UDP 打孔技术设置和我的设置之间的区别在于,我没有在 NAT 和中介服务器后面有 2 个客户端,而是在 NAT 后面只有一个必须与服务器通信的客户端。那一定更容易,但我很难理解和实施。我在这种 NAT 遍历方面走在正确的道路上,或者可能是其他一些更容易实现的方法?
我考虑过的其他方法:
当服务看到服务器在线时,使用 TCP 创建到服务器的连接。问题是我有大约 200 个客户,而且这个数字还在上升,我担心这是一个资源杀手。
当服务看到服务器在线时,检查数据库表中的命令,然后每 30 秒再次检查一次。这也是我的服务器的资源杀手。
底线是,如果 UDP Hole Punching 技术是这种情况下的正确方法,请为将在 NAT 后面的服务上运行的 de UDPServer 提供一些代码想法。
谢谢你。
udp - UDP NAT Traversal (punch through) 快捷方式
关于 UDP NAT Traversal 的大部分信息都涉及一个中间服务器,用于将公共端点与两个客户端进行通信。如果为客户端预先配置了公共端点,是否可以快捷方式?
NAT 后面的两个客户端可以开始向对方的公共 IP:Port 发送 UDP 流量以打孔吗?除了通信公共端点之外,是否需要中间体?
.net - TCP NAT-Traversal /- 使用 .NET 打孔
我编写了一个应用程序,其中必须将客户端直接相互连接并保持连接。在使用高级技术(谷歌)进行一些研究后,我发现我需要的可以通过 NAT-Punching 或 NAT-Traversal 来实现。
大多数人似乎通过 UDP 使用 NAT-Punching,但在我的情况下,我需要使用 TCP 来执行此操作(这是事实,在有人问“为什么不使用 UDP?”之前)并且我找不到任何示例代码这个或至少是一个适当的教程。我所能找到的只是理论上的附件,但没有 Sockets 或 TCPClients(我更喜欢套接字。)。
有人可以链接我一些示例代码,我可以使用这些示例代码连接 NAT 后面的两个客户端,或者将我链接到带有示例代码的完整教程吗?我知道这个目标在 .NET 中很难实现(我使用的是 VB.NET,但我也能够阅读和理解 C#),但它应该是可能的。
UPnP 不是一个选项,因为一些 NAT 出于安全原因将其停用。