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

java - 通过 http 连接两台没有公共 IP 的计算机

我希望计算机/客户端在其中一个或两个没有公共 IP 的情况下直接相互连接。我想这可以通过服务器作为中间人来完成。最终建立的连接必须是客户端之间的直接流量。这怎么可能,技术叫什么?

我真的很想在 Java 中看到一些代码 fx。

谢谢

0 投票
2 回答
552 浏览

unix - 如何在 2 个 nat 后面执行 p2p?

我正在尝试发送 'hello' 顺便说一句 2 个客户端,每个客户端都位于防火墙 NAT 后面,但没有成功。就目前而言,UDP 或 TCP 打孔同样适用。

客户端 A 期望收到“hello p”:

客户端 B 发送 hello p:

不幸的是,什么也没收到。

受http://www.brynosaurus.com/pub/net/p2pnat/启发的实施

0 投票
1 回答
3276 浏览

c++ - c++ 打孔UDP(RTP)

我正在做一个客户端-服务器语音聊天程序(非托管 C++,win32),其中客户端使用 TCP 连接到服务器,文本聊天/聊天室功能在 TCP 中完成,而所有音频传输都通过单独的 UDP/RTP 套接字发送(使用 API来自 JRTPLIB)。

所以从TCP连接中知道IP,建立连接后就可以发送RTP套接字的端口号了。

问题是,在 TCP 中,自从您建立连接以来,只有服务器需要进行端口转发才能双向进行通信,而在 UDP 中,您必须使用 recvfrom() - afaik 需要在客户端的第一名,我不想要(如果您查看任何多人游戏或 VoIP 客户端,则不需要)

阅读有关 UDP Hole Punching 的资源(例如http://en.wikipedia.org/wiki/UDP_hole_punching),例如他们不断提到开始与服务器进行 udp 对话。就是这样 - 你如何在客户端不必打开任何端口的情况下实际与服务器启动 udp 对话(双向)?正如我所提到的,在 TCP 中,您只需要 connect() 到服务器,并且两种方式都可以进行通信。

另外——我知道 RTP 是基于 UDP 构建的,但是关于 RTP 打孔(再次使用 JRTPLIB),我还应该知道什么使其与 UDP 不同吗?

提前致谢!

0 投票
3 回答
360 浏览

flash - 是否可以在 NetConnection 上强制使用源端口?

我是 ActionScript 的新手,但我正在尝试破译一个预先存在的项目并进行一些修改。

我有一段代码从创建新的NetConnection开始,然后从外部源流式传输媒体文件。我在文档中看到您可以提供目标端口(通过 URL),但是是否可以强制 Flash 使用特定的源端口?我在文档中找不到明确的方法来做到这一点,但我很好奇其他人是否有替代方法或想法。

这样做的最终目标是我希望能够以可预测的方式使用源端口来进行NAT 打孔。感谢您的任何建议或答案!

0 投票
3 回答
1261 浏览

p2p - 使用服务器绕过路由器发起连接

我想用 Java 创建一个简单的聊天程序,它可以在 p2p 基础上工作。使用公共服务器仅启动连接。但我什至不确定这是否可能。

如果至少有一台 PC 转发了正确的端口,我成功地用 Java 实现了聊天解决方案。我还设法使用外部服务器,而不是必须在客户端转发端口。

所以我什至有可能以某种方式使用公共服务器来启动连接,而不是在客户端之间发送数据,从而减轻服务器的负载?

我不太熟悉路由器的工作原理,但我希望当您从内部 IP 调用公共服务器时,路由器会记住来自该公共 IP 的呼叫和传入响应,而不是发送到您的 PC。所以我想,也许如果第一个客户端连接到服务器,服务器比将信息传递给第二个客户端,也许他们可以以某种方式直接通信?如果路由器中的规则是由服务器建立的?

我希望我解释清楚。如果没有,请原谅我。我什至不知道这到底是怎么做到的,我只是想知道我的概念是否正确,我必须更加努力地学习,以便有机会实现它。谢谢。

0 投票
1 回答
544 浏览

network-programming - P2P技术比较

我经历了各种基于 udp 的 P2P 技术,比如 Stun 。我最近为实现 p2p 实现了 UDP/TCP 打孔。

我发现还有其他技术,如 ICE、UPnP 和 teredo

  1. 任何人都可以告诉我这些技术之间有什么区别。
  2. 哪一个是近年来用于 P2P 的最新技术/协议。

如果能提供各种基于UDP的P2P协议的对比分析就好了。任何链接或建议将不胜感激。

0 投票
3 回答
5182 浏览

network-programming - udp丢包和恢复

我正在开发基于 udp/tcp 的 P2P 文件和实时视频流应用程序。该应用程序将使用 c++ 为 Linux 和 Windows 平台开发。

我们正在使用 ICE(TCP/UDP 打孔)来实现 P2P。虽然 TCP 确保数据包丢失,但对于 UDP,我需要一种体面的方法来确保必须将数据包传递给其他对等方。

  1. 我想知道执行此操作的算法或技术。
  2. 是否有任何免费的第三方工具/库可以做。

任何链接和建议将不胜感激?

0 投票
1 回答
1902 浏览

networking - 是否适合 p2p 应用程序的 TCP 打孔流程:

  1. 使用 stun 我将获得我的外部 ip/端口和 NAT 类型。
  2. 在我的中间服务器(公共 ip)上,我将注册对等点的外部 ip/端口(现在服务器知道对等点 1 和 2 的外部 ip/端口)。
  3. 交换 ip/port(peer 1 会知道 peer 2 的 ip/port)。
  4. 同时connect()拨打双方的电话。

这是正确的流程吗?

0 投票
2 回答
988 浏览

udp - Skype 协议和超级节点

我有一个关于 Skype 协议的问题。据说,根据wiki,Skype中的超级节点用于UDP打孔。超级节点是没有防火墙/NAT 的节点。

我的问题是,这如何可靠?绝大多数互联网用户不是在NAT后面吗?

而且,如果我要使用这种技术创建一个 P2P 应用程序,如果没有没有防火墙的对等点会发生什么?我不明白您如何启动依赖于最终将有一些对等点没有 NAT 的应用程序

谢谢

0 投票
2 回答
3070 浏览

c# - UDP打孔帮助

我正在尝试使用 Peer to Peer 将 Internet 上的网络添加到我的游戏中。我已经实现了一个仅限 LAN 的版本,它使用 .NET 的点对点类在本地网络中进行连接。

我意识到我需要使用 UDP 打孔来建立与防火墙后面的其他客户端的连接。

这就是我开始实现它的方式:服务器是一个 HTTP 服务器,使用非常简单的 PHP 脚本来完成工作。

    • 在服务器上注册名称,将私有 IP 地址和端口作为 GET 变量发送
    • 当服务器收到注册请求时,它将保存公共端点和私有端点
    • 请求连接到另一个客户端。
    • 服务器将返回客户端的私有和公共端点
    • 每两秒,第二个客户端将与服务器签入,如果有另一个客户端尝试与它连接,它也会得到它的端点
    • 两个客户端都开始向对方的公共端点发送垃圾邮件,直到他们得到有效的响应

现在我有一堆问题

  1. 服务器可以是 HTTP 服务器吗?
  2. 当我向 HTTP 服务器发出请求时,每次发出请求时客户端端口都会更改。私有端点是否总是与同一个公共端点匹配?
  3. 对服务器的请求是否必须与发送给客户端的 UDP 消息具有相同的源端点?
  4. 有没有办法使用指定的源端点连接到 C# 中的 HTTP 服务器?
  5. 我的实施有什么问题吗?

谢谢!