问题标签 [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.
p2p - 是否有 MaidSafe-Routing 替代方案(p2p 路由,C 或 C++ 中的 NAT 遍历库)
MaidSafe-Routing 能够维护 p2p 路由并在没有 STUN 的情况下进行 NAT 遍历。有许多库仅用于 NAT 遍历或 DHT(例如 Chord 和 Chimera)。是否有任何其他 C/C++ 库,例如带有 DHT 和 NAT 遍历的 MaidSafe-Routing?谢谢你。
java - 如何在不同网络的 NAT 后面的两个客户端之间建立 TCP 连接?
我有一个设置,其中 2 台电脑(假设 A 和 B)位于每个公共 IP 的 NAT 后面。所以他们每个人都有自己不同的私有IP。我在两者之间使用了一个服务器,它将交换 IP 地址和端口号。A和B的。他们还交换了他们的内部端口号..!
所以基本上这就是设置。
客户端 A 和 B 运行以下代码:
服务器 S 上的代码是:-
输出是他们很好地交换了内部和外部端口以及公共 IP。
所以问题是如何使用这些信息来打开 A 和 B 之间的 TCP 连接?如何使用 Java 实现 TCP 打孔?
PS:最有必要成为一个 TCP 连接,我使用 Java 来做到这一点。
networking - 移动网络的最佳点对点技术
我处理移动单元和用户电话之间的点对点通信的设计。移动单元以汽车为目标,因此它可以连接到许多不同的 ISP。还可以预期客户端将经常断开连接。我需要在 NAT 穿越技术中找到最佳解决方案,它适用于移动网络的条件,这与通常的网络如 WiFi 没有什么不同。我搜索了常用的技术,发现了许多不同的做法,例如TCP或UDP 打孔、NUTSS、NATBLASTER、NatTrav或 STUN 或 ICE 等官方协议。
谁能告诉我在类似条件下经过验证的技术?
非常感谢
udp - Hole punching using STUN
I'm currently trying to send UDP messages over the internet and have to set up the firewalls for both endpoints A and B (which are both behind a NAT). To do this, I want to use hole punching using a STUN server.
When A creates a request to the STUN server (say, private: 85.1.1.12:6000 and public: 173.194.78.127:19302) I get 85.1.1.12:6000 as a response. If I were to send a packet from the same origin configuration (same origin ip and port that were used for the STUN-request) to any other destination address (the destination port stays the same) then my NAT would change the public port again (from 6000 to anything else). I found out by using the same address-port configuration for two different STUN server requests (using port 19302 for both requests).
Like this, I have no possibility of knowing what port my NAT does the translation when sending a packet to B (B can't receive anything because its firewall is not set up).
Is this because my NAT type is not compatible for hole punching or did I get the concept wrong?
Thanks!
c - 如何使用相同的本地端口打开两个 udp 客户端套接字
如何打开两个具有相同本地端口的客户端套接字,如java。在 Java 中,我们可以在创建 DatagramPacket 时提及源端口。我正在尝试进行 UDP 打孔。如果我做错了什么,请纠正我。
我在这里添加了我的代码。
}
以同样的方法,我试图用相同的端口打开新的套接字。
检查我试图在 C/C++ 中这样做的这个 Java 代码。这不可能 ??
networking - 使用 STUN 在 NAT 下进行服务器/客户端通信的 UDP 打孔
问题
我正在尝试开发一个通信系统,其中:
A , B是 NAT 下的机器,A是服务器B是客户端 S是 STUN 服务器
S正在 Internet 上可访问的机器上运行
流程如下:
麻烦
这就是麻烦开始的地方,STUN 服务器完成了它的工作,因为两端都收到了关于另一端的正确信息。
但是我从来没有收到另一端的消息,所以两端都在没有收到握手操作码或其他任何东西的情况下继续收听。
NAT 的行为
我确实检查了这个 NAT 的行为,看起来确实像这样
A 位于 192.168.XX,在端口 4444 上连接到暴露 NNNN:4444 的外部,因此只要端口号空闲,就会保留该端口号,如果不可用,则获取一个新的(随机?)一个。
测试
我运行的测试已经看到两端(A,B)托管在同一台机器上,都绑定到机器的内部 IP,尝试绑定到 127.0.0.1、0.0.0.0,没有任何变化。
如果在他们收听echo
与nc
to握手时localhost
,它会毫无问题地被接收并显示(作为无法识别的消息)。通过 NAT 路由的连接并不困难,每个数据包都被丢弃。
还尝试在机器上托管 A,在移动数据下的 Android 手机上托管 B,并使用临时编写的简单应用程序。仍然锁定等待某些东西,例如 nodejs 测试。
更新:
我试图做的另一件事是打开一个洞nc
在同一 NAT 下的两台不同机器上,我运行:
echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4567 -p 4568
echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4568 -p 4567
每台机器的时间不同。据我了解,这应该在 NAT 中打一个洞,丢弃第一个数据包并随后转发。但什么也没发生,没有尽头得到消息。
我也试过:
从本地机器
echo "GREET UNKOWN PEER" | nc -u <PUBLIC IP> 4567 -p 4568
从公共机器
echo "GREET UNKOWN PEER" | nc -u <NAT IP> 4568 -p 4567
这个工作,NAT下的本地机器与公共机器联系,并且在第一个丢弃的数据包能够在分配的端口上接收和发送之后。我想知道为什么这在同一 NAT 下的两台机器上不起作用(???)
代码
我没有显示任何代码,因为我认为这存在某种逻辑缺陷,但是这里是github项目。
index.js
包含 STUN 服务器,tests 文件夹包含测试用例:test.js
启动 stun 服务器,PeerClientTest.js
并且PeerServerTest.js
是客户端和服务器的模型。
运行node tests/test.js
以在公共机器上启动服务器(在config.js
和中更改 IP tests/config.js
)
然后node tests/PeerServerTest.js
启动服务器(“A”)并node tests/PeerClientTest.js
启动客户端(“B”)。双方将通过 STUN 相互识别,然后在发送自己的握手操作码时监听对方的握手操作码。这永远不会发生,所以他们只是永远发送/收听。
Node 不是必需的,所以如果有其他语言的更好的解决方案,请告诉我们,将不胜感激。
networking - P2P NAT穿越
我在 C/POSIX 中做一个 P2P 应用程序,我被 NAT 遍历困住了。
我阅读了多种方法(MiniUPnP、手动端口转发、TCP/UDP 打孔)和很多关于它的问题,但我发现了一些问题:
- MiniUPnP : 看到transmission-cli用它来做端口转发,所以下载了MiniUPnP的源码,试着看懂了,但是太乱了,放弃了。我搜索了类似文档的东西来实现它(比如“这个函数需要那个结构来做一些事情并且会返回这个”)但没有找到任何有用的东西。(我认为这是最干净的方法,因为它只需要使用为此目的制作的库。如果有人知道如何使用该代码,请帮助我)
- 手动端口转发:我希望用户不要弄乱他的路由器设置,所有工作都应该通过代码完成。
- TCP 打孔:我读了这篇关于打孔的文章,我认为这是最简单的方法(我也有一个带有公共 IP 的 VPS,所以我可以像使用集合服务器一样使用它)但我无法连接不同 NAT 后面的两个不同用户。
设想
我有一个主服务器(在 VPS 上),它记录每个加入 p2p 网络的对等方,这就是发生的情况:
- PeerA 加入网络并向服务器发送这对夫妇(A_LOCAL_IP:A_LOCAL_PORT);
- 服务器保存了A的公网IP(XXXX)和公网端口(AAA)和A发来的这对夫妇。
- PeerB 加入网络并将服务器发送给服务器(B_LOCAL_IP:B_LOCAL_PORT)
- 服务器保存了 B 的公网 IP(YYYY)和他的公网端口(BBB)以及 B 发送的这对夫妇。
- PeerA 和 PeerB 都进入 for 循环等待 accept(),然后它们产生一个线程来处理传入的请求
- PeerA 想与 PeerB 连接
- PeerA 询问服务器,PeerB 的 IP:port
- 服务器向 PeerA 发送一对 (YYYY:BBB) 和 (B_LOCAL_IP:B_LOCAL_PORT) [这是最后一个,以防它们属于同一个 NAT]
- PeerA 生成一个线程,该线程进入 for 循环,尝试通过端口“BBB”连接或与“YYYY”连接,或通过端口“B_LOCAL_PORT”与“B_LOCAL_IP”连接,而“主线程”进入 for 循环尝试接受连接
- 服务器向 PeerB 发送两对 (XXXX:AAA 和 (A_LOCAL_IP:A_LOCAL_PORT)
- PeerB 产生一个线程,该线程进入 for 循环,尝试通过端口“AAA”连接或与“XXXX”连接,或通过端口“A_LOCAL_PORT”与“A_LOCAL_IP”连接,而“主线程”进入 for 循环尝试接受连接
这是交易:当我使用 (B_LOCAL_IP:B_LOCAL_PORT) 对时,它工作正常;当我使用 (YYYY:BBB) 对时,它不起作用。
在“ECONNREFUSED”的情况下,我使用指数回退,当我尝试使用 (YYYY:BBB) 对时,它会打印
拒绝连接。休眠 1 秒
连接被拒绝。睡眠 2 秒
连接被拒绝。睡眠 4 秒
连接被拒绝。睡眠 8 秒
连接被拒绝。休眠 16 秒
连接被拒绝。休眠 32 秒
最大超时已过期。中止...
当然,当另一个 NAT 下的某人试图加入我的 NAT 下的对等方时,也会发生这种情况。
所以就是这样,这些是我的问题:
- 为什么它使用 (B_LOCAL_IP:B_LOCAL_PORT) 对而不使用 (YYYY:BBB) 一对?
- 是否有可能我的 NAT 有一些配置/架构使得无法实现打孔?
sockets - 需要帮助设置用于 p2p 数据传输的 udp 打孔。无法让 STUN 工作
我正在尝试将 UDP 数据包从一个客户端发送到另一个客户端。让C1成为我用来接收数据的客户端,让C2成为将发送数据的客户端。我在做什么:
向 STUN 服务器询问两个客户端的公共 IP 地址和端口。
我通知每个客户端其他 IP 地址和公共端口。
C1在其公共地址和端口上向C2发送一个数据包,并开始侦听数据包。与此同时,C2开始发送包含我想要传输的数据的数据包。
C1只是挂起接收一个永远不会到达的数据包。我做的UDP打洞错了吗?
我正在使用同一网络上同一台计算机上的两个客户端对此进行测试,但服务器位于另一个具有公共 IP 的网络上的服务器上。我想说的是,在我测试时,两个客户端的公共地址是相同的,这是一个问题吗?
更新:
我现在知道我的路由器允许发夹。我在路由器上转发了 UDP 端口,并使用公共 IP 地址将数据包从一个客户端发送到另一个客户端。
这是我用来测试是否可以在 C# 中打孔的代码:
更新 2:
在@Tahlil 的帮助下,我发现我用来检查 NAT 类型的算法存在缺陷,我试图在对称 NAT 后面打孔。所以问题是没有注意到我的代码有错误......我建议对所有面临同样问题的人确定地断言 NAT 类型。
谢谢大家的帮助。
java - Android上的UDP打孔;UDP 服务器
我目前正在尝试在 Android 上为我的 udp 服务器实现 udp 打孔。事情应该是这样的:
- 客户端(在 nat 后面;可能是 3G,..)向服务器发送一个 DatagramPacket(服务器有一个公共 ip;端口也称为 45555)。客户端重复发送具有给定延迟的数据报
- 一旦服务器收到数据报,它就会每 500 毫秒发回数据报(“信号”)。
- 如果打孔有效,客户应该收到这些信号
这是我当前的客户端实现(Android):
这是服务器端实现(Java):
当客户端和服务器在同一个专用网络中时,一切正常。为了模仿公共服务器,我在我的计算机上运行服务器端代码并在我的路由器上设置一个端口(它有一个公共 ip)*。客户端会将其数据包发送到路由器的公共 IP。但在这两种情况下(我的智能手机通过我的 wlan 网络/3G 或 E 连接到互联网)都没有收到信号(服务器接收客户端的数据报)
那么为什么打孔工艺不起作用呢?
问候
*:路由器会将发送到其端口 45555 的任何 udp 数据包转发到我的计算机
udp - 已存在应用程序的 UDP 打孔
我正在尝试在我的大学网络上使用 YAWCam。我将它用作另一个网络后面的另一个应用程序需要访问的 mjpg 流媒体。不幸的是,没有办法在我的大学网络上进行端口转发。进入udp 打孔。当我得知它时,我认为这太棒了,但很快意识到,除非我能弄清楚如何实际修改这个程序(它不是开源的),否则我将无法按照常规方式进行 UDP 打孔工作。
我的问题是,有没有办法在不改变原始程序的情况下打孔?可能通过从 yawcam 用来打洞的同一端口发送数据包,然后让常规请求刷新它?我对网络代码有点陌生,所以我不完全确定“正确”的方法是什么。