问题标签 [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 投票
1 回答
885 浏览

android - TCP打孔,不能在android上重用地址

我有一个托管 HTTP 服务器的 android 设备并且是 NATed(在路由器后面)。我想从未经过 NAT 的公共服务器访问它。我在一个线程中的 8080 端口在 android 设备上运行一个 HTTP 服务器,一段时间后,我启动一个客户端线程,它试图从 android 上的本地端口号 8080 连接到远程公共服务器。由于某种原因,我在端口 8080 上启动服务器后,android 客户端将无法连接。它也不会产生任何异常。这是我的代码:

0 投票
3 回答
4471 浏览

windows-firewall - UDP打孔超时

我需要实现一个UDP协议。PC 必须在专用 UDP 端口上侦听传入数据包。它还发送数据包(答案)。该应用程序在 Windows XP、7、8、...上运行。

Windows 防火墙阻止传入的数据包。这可以通过 UDP 打孔来规避。所以我必须发送一些不应该伤害的东西。但我想尽量少打扰。

  • 在防火墙关闭漏洞之前,我如何确定超时?
  • 我可以检测到防火墙已关闭防火墙,以便我必须重新发送打开数据包吗?当然,当防火墙关闭时我不会收到任何东西,但这可能有其他原因。
0 投票
1 回答
4422 浏览

linux - 何时使用 TCP 打孔技术以及为什么使用它?

我正在研究TCP 打孔技术,并从这篇文章中获得了一些知识:TCP_hole_punching。但我不明白以下部分:

这里有一些问题,有人可以帮忙解释一下吗?任何帮助或建议将不胜感激!!

Q1。假设我们有一个在 NAT1 后面运行的客户端应用程序和一个在 NAT2 后面运行的服务器应用程序。他们将进行消息传递和文件传输通信。该模式将是服务器侦听并接受来自客户端的连接。他们是否需要使用 TCP 打孔来保持 tcp 连接正常工作?

Q2。只有当它是对等通信并且双方都相互连接时(例如,2x CONNECT()、没有 LISTEN()、ACCEPT() 等),才需要 TCP 打孔技术吗?

Q3。在上面的文本中,“他们需要知道远程端点的 NAT 端口才能建立连接”是什么意思?为什么他们需要知道远程端点的NAT端口?他们不只需要知道对方机器的本地端口吗?

例如,假设这对是 (ClientA, publicIPA, LocalPortA), (ClientB, publicIPB, LocalPortB)。如果 ClientA 想通过 TCP 与 ClientB 通信,它可能会这样做:

为什么它需要知道诸如 NATPortA 和 NATPortB 之类的信息?如果clientA和clientB不关心NATA和NATB有什么问题吗?

0 投票
3 回答
1082 浏览

udp - 为 UDP 打孔选择端口号

我有一个奇怪的问题。我有一个成功运行的 C++ (boost asio) P2P 应用程序,它可以在大多数 NAT 上运行。问题是当我将初始起始端口号设为 1000 时,它会检查 1000 是否空闲,否则会加一并选择一个端口并开始握手。但是当我有 10000、20000 或任何其他巨大的端口号时,打孔在端口受限的锥形 NAT 上不起作用。

这怎么可能?我很确定这与代码无关。最近它也不适用于我朋友的一个全锥 NAT,但它已在许多其他全锥 NAT 中工作。可能是什么原因?关于 NAT 的行为,我有什么遗漏吗?

0 投票
2 回答
496 浏览

networking - 找出/预测路由器正在/将用于给定连接的端口

我知道ipchicken.com会告诉你路由器的 IP 地址和它用于连接的端口。但是这些信息可以“本地”获得吗?(不依赖网站)。

我想要的是在两个随机主机之间建立连接……中间没有“专用服务器”。我的问题是通过 NAT 到达。我认为最好的选择是一种 TCP 打孔,两台主机都连接到某个地方,然后相互告知(可以通过电话或聊天或类似方式)当前的 IP 地址和路由器正在使用的端口号。它应该欺骗路由器将数据包转发到主机,尽管来自与它们最初连接的不同来源。

是否有可能以比ipchicken.com更本地的方式找到您的路由器用来修补您的端口号?对解决此问题的其他可能方法有什么想法吗?

编辑:在这种情况下,在路由器上设置端口转发不是一个选项,因为很多人(包括我)对他们的路由器没有管理员权限,我不想将这样的任务强加给我的应用程序的“用户”

0 投票
0 回答
458 浏览

client - 我可以在 Netty 服务器绑定的本地端口上打开 Netty 客户端通道以执行打孔吗?

这是问题所在:我正在尝试从 Netty Server 绑定端口发送消息以执行打孔。我已经阅读了很多关于它的东西,尤其是在 unix 上这是不可能的。不过,这确实会简化我的代码并减轻主服务器的负担,而不必来回中继尽可能多的 InetAddress。我也尝试过使用无连接的引导程序,但它不起作用。Java 在我的 Mac 上抛出 UnsupportedException。我正在使用netty 3.6.5。有没有办法在 Netty 4.0.0 中做到这一点?谢谢大家。

0 投票
1 回答
1287 浏览

php - TCP Holepunch 实现

我正在研究我的一个想法,它可以与家庭自动化系统相媲美。网络设备的布局是这样的: 在此处输入图像描述

我想要的是我的手机应用程序能够随时与家庭服务器通信,而且服务器也能够访问我的手机(推送通知)。为此,我认为使用数据中心中的服务器作为流量中心来实现 TCP-Holepunching 是一个好主意。

但问题是,由于我的 Java 技能还不够好,我不得不用 PHP 脚本语言编写服务器,但 PHP 无法保持套接字处于活动状态。

是否有可用的 TCP 打孔服务器软件(在 Debian 中可执行)能够保持套接字活动并将任何命令从我的服务器推送到正确的目的地(即:电话),反之亦然?

0 投票
2 回答
408 浏览

c# - 如何查看路由器打开了哪个端口

如果我执行以下操作:

然后我将向我的路由器发送一个数据包,然后我的路由器将该数据包发送到 IP“69.65.85.125”。

如果我在 ip 为“69.65.85.125”的计算机上捕获该数据包的位置,我将能够看到路由器打开的端口(client.RemoteEndpoint)。如果不在另一个端点捕获数据包,怎么可能看到这些信息?有没有办法查询路由器?

0 投票
0 回答
523 浏览

c - UDP 打孔在 Windows 中不起作用,但 Linux 可以

我在 Linux/Windows 机器之间的 UDP 通信有问题。我使用中继服务器在 UDP 上实现了一个简单的 P2P 通信协议。它使用UDP打孔来消除服务器在数据传输中的作用。对等点和服务器之间的数据传输通过 TCP 进行,而对等点之间通过 UDP 发送数据。

在双方都使用 Linux 机器时一切正常。但是使用 Windows,程序拒绝与服务器建立 TCP 连接。我关闭了防火墙和防病毒保护并再次尝试。然后对等点和服务器之间的连接成功建立,但对等点之间没有发送 UDP 数据包。

我正在使用 Cygwin 在 Windows 上编译程序。源代码是纯 C 语言(传统套接字。没什么特别的)

这与协议或防火墙有关吗?我该如何检查?

0 投票
1 回答
656 浏览

udp - UDP打孔不成功,但测试表明它应该可以工作(移动网络)

在过去的两周里,我一直在尝试实施 udp 打孔,但我不知道为什么。我知道打孔算法不能保证工作,但我相信它应该在我的测试用例中工作,因为我注意到一旦我在我的家庭网络上绑定我的套接字,端口与外界相同它在本地,并且对于从此套接字进行的所有连接都保持这种状态。审查我的试验后的任何帮助将不胜感激。

我有三台电脑,我的 osx 台式机、我的 iPhone 和我的 amazon ec2 ami。

在桌面上,我构建了一个 cocoa 应用程序,它使用 GCDAsyncUDPSocket 库绑定端口并联系 ec2 服务器,其中使用 apache 的 mina 库的 java 应用程序存储套接字外部 ip/port 并将其与传递的用户名相关联有效载荷.

位于 AT&T 网络上的 iphone 运行一个应用程序,该应用程序使用相同的 GCDAsyncUDPSocket 库以相同的用户名联系 ec2 服务器,然后 ec2 查找用户名,找到桌面信息并通知桌面 iphone地址和桌面的iphone地址。

现在 iphone 和桌面互相了解,他们开始互相射击数据包,希望能打个洞。

理论上这应该可行,但也许我错过了一些关于移动网络的东西,这会使这变得困难?但是再次在第四台外部计算机上运行一个简单的 udp echoer 来手动 msg 桌面也不起作用,所以也许它是我的路由器,但我不明白这是怎么回事,因为我所有的测试都表明桌面要求的端口for 与路由器分配的相同。

我已经在这工作了近两个星期,进展甚微,任何提示将不胜感激!