问题标签 [hole-punching]

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.

0 投票
2 回答
578 浏览

google-app-engine - 使用 Google App Engine 向防火墙后面的设备发送消息

我想使用 Google App Engine 向将位于防火墙/路由器/NAT 后面的设备发起 http 流量。这些设备将接收来自 GAE 的命令。我可以让设备轮询 GAE 以查找新消息,但这会占用大量流量。或者,我可以尝试永久保持打开连接,但这非常昂贵且糟糕。

这些设备没有静态 IP 地址。但是,它们会定期与 Google App Engine 进行通信,然后设备可以侦听它们刚刚打开的端口以进行任何传入通信。如果我理解TCP 打孔,因为设备已经将流量发送到 GAE,它们将分配一个端口,该端口转换为设备正在侦听的端口,相应地,GAE 在防火墙中有一个可用的孔。

但是,为了让 GAE 向设备发送流量,它需要知道设备在其公共 IP 上分配的端口。问题就在这里,因为 GAE 没有为传入流量提供源/远程端口。在不知道设备刚刚使用的端口的情况下,我无法向设备发送除 http 响应消息之外的任何内容。我实际上无法向该设备发起 http/tcp 消息。

那么,是否有人知道为 GAE 获取传入源/远程端口的方法,或者知道向防火墙后面的设备发起流量的另一种方法?

TL;DR:你究竟是如何获得发送到 GAE 上的应用程序的 http 消息的远程端口的?

0 投票
1 回答
1094 浏览

ios - iOS 上的 UDP 打孔

我已经建立了一个网络项目,通过打孔通过 LAN 或 WAN 进行通信。我正在为客户端使用 GCSAsyncUdpSocket。我有一个集合服务器,它的端口被转发,可以从所有传入连接访问。我的设置是这样的:

这是有点奇怪的地方。虽然客户端在同一个网络上,我们已经在我们的两个网络上尝试过,但没有任何效果。但是,如果设备连接到不同的网络(都与不同的供应商并且没有直接链接),那么其中一个设备会接收数据,而另一个不会。

这也无法完全适用于 3G。

我无法理解的是它如何在每个网络上使用 1 台设备单向工作,但在同一网络上的两台设备根本不工作?

0 投票
1 回答
113 浏览

java - Android,我如何获得我的 NAT 地址?

嗨,现在我正在学习和开发android应用程序,它是关于远程控制,使android手机控制计算机但是......我遇到了严重的问题..当客户端在NAT环境下,服务器和客户端都无法相互通信。 . 好吧我发现.. 这是打孔问题.. 它说我必须先找到 NAT 的 ip 和端口地址。但我不知道如何获得地址。或者我找不到关于它的简单代码。谁能帮我?或者没关系,只是简单的建议,我非常需要你的帮助。谢谢。

0 投票
3 回答
3755 浏览

android - 在两个移动设备之间直接通信

我最感兴趣的是移动设备的一般答案,但特定于 android 的东西是可以接受的。

给定 2 个移动设备,我如何才能在它们之间建立连接。我是移动开发的新手,我不确定背后是什么样的 NAT 移动设备。是否可以进行某种“打孔”(使用外部服务器来帮助建立连接)将它们连接在一起?

我看过这个问题,但它对我没有太大帮助,我仍然不知道如何获取 IP 和/或遍历 NAT。 Android - 两台设备之间的通信

0 投票
2 回答
3461 浏览

django - Django 和 UDP 服务器

我有一个用 Django 构建的网络服务器。我需要专门通过 UDP 连接更新 Django 使用的同一数据库中的一些信息。

实现这一点的最佳方法是什么?

0 投票
1 回答
214 浏览

java - 我一直在尝试打孔并将数据报发送到路由器后面的朋友计算机,但没有任何反应

我正在尝试创建 p2p 连接。这是一个我已经检查过的只是测试应用程序,但它似乎无法通过互联网运行。这是我在我的电脑上用来向我的朋友发送数据报的 java 代码:'

'

'

0 投票
0 回答
561 浏览

android - 使用 UDP 打孔器在 NAT 后面创建 Android 手机 Web 服务器

我是 Android 开发的新手。我正在尝试创建将在后台作为服务器运行并提供 JSON 数据或简单字符串的应用程序,并且任何客户端都可以发送命令并取回有关命令的数据,类似于 web服务器。

我创建了简单的客户端服务器应用程序,我尝试使用 NAT Traversal 技术在路由器上打一个洞,并将端口和 IP 发送到管理所有连接的外部服务器,并且它有效,但它非常不可靠,至少对于从未有过服务器客户端通信开发经验的人。

我的问题是:

使用 UDP 打孔技术是正确的解决方案吗?有没有可行的例子?是否有任何替代方法可以通过路由器后面的请求从移动设备获取数据,而无需处理路由器端口转发?是否有任何现有的运行或可以运行的 android 原生服务?

谢谢你。

0 投票
0 回答
509 浏览

c# - 在 TCP 打孔中没有来自客户端的 ack

我已经在 C# 中实现了 TCP 打孔。我得到的是,客户端正在相互发送 SYN 消息,但它们被丢弃在对面的路由器上。场景是这样的:Client:A--------Router:A--------Server--------Router:B--------Client :B

如果客户端:A 向客户端:B 发送 SYN 数据包,它会在路由器:B 被丢弃,这是明显的 NAT 行为。但是,根据打孔场景,现在如果客户端:B 向客户端:A 发送 SYN,它应该通过路由器:A 的 NAT。在我的例子中, router:A 也丢弃了这个数据包。在 netstat 中,它将与 B 的连接显示为 SYN_SENT,几秒钟后,我收到一条消息,例如“客户端没有响应。连接失败”

根据我在这方面的研究,放弃的原因可能是无声放弃或主动拒绝。如果是静默丢弃,则应打洞,B 的 SYN 应通过 A 的 NAT。如果是主动拒绝,路由器:A 将收到路由器:B 关于丢弃的通知消息,A 将关闭洞。

问题是我在 A 没有收到任何通知消息。(通过路由器日志检查)。我还尝试了一个从 https://github.com/jasonpang/tcp-holepunching获取的已经实现的 TCP 孔 pucnhing 示例

但我得到了类似的结果。帮助我找出解决方案。我也怀疑路由器打孔的超时。

命名空间 HolePunching { 公共类 HolePunchingClient { 私有 Socket _clientSocket;

}

这是我从上面的链接中获取的客户端代码。我在连接到客户端 B/A 时收到异常消息“其他客户端没有响应。连接失败”。

客户端 A 和 B 都运行该程序的相同副本。他们中的任何一个都会向服务器发送请求以与另一个客户端连接。服务器将向两者发送 IP-Port 组合。并且客户端代码将通过相互发送连接请求来继续。(最终超时)

0 投票
1 回答
108 浏览

sockets - UDP打孔是否发生在同一网络内的主机之间?

假设我有一个 IP 为 42.98.1.70 的路由器,连接了 2 个 NiC,IP 为 192.168.1.200 和 192.168.1.300。路由器在端口 10433 上进行端口转发,以将数据包重定向到 192.168.1.200。路由器内网IP为192.168.1.100。

当网卡 192.168.1.300 向套接字 42.98.1.70:10433 发送数据包时。主机 192.168.1.200 从套接字 192.168.1.100:48900 获取数据包,据我所知,这看起来像是路由器设置的打孔套接字。

所以理论上,如果主机 192.168.1.200 向套接字 192.168.1.100:48900 回复一个数据包,该数据包最终应该返回到主机 192.168.1.300,因为路由器应该通过其内部表映射桥接两者,也就是“UDP 打孔” '。

但是,从 192.168.1.200 发回 192.168.1.100:48900 的数据包永远不会到达 192.168.1.300。

我怀疑可能发生的情况是 UDP 打孔在同一网络上的 NIC 之间不起作用。它仅适用于网络外部的来源和网络内部的来源。是这样吗?

0 投票
1 回答
431 浏览

sockets - UDP打孔过期

更新

事实证明,该问题与 NAT 和 UDP 打孔无关。所以我创造了一个新的Q。

我使用以下方法实现了 UDP 打孔:

位于已知端口的已知服务器(无 NAT)正在处理传入的 UDP。

NAT 后面的客户端向服务器发送数据报,之后服务器通过向该客户端发送对等点的地址来响应。

客户端现在开始通过同一个套接字使用 UDP 与对等方通信(但当然是不同的地址。)

如果一段时间后,客户端停止与对等方的通信,并再次向服务器发送另一个数据报,则该数据报不会到达(除非我通过从服务器向客户端发送 keepalive 数据报来保持通道打开。)

我的问题:为什么可以从服务器<->客户端之间的数据报切换到对等<->客户端之间的数据报,但是一旦我切换回来并且客户端再次发送到服务器,它们就没有到达?