打开 Internet P2P 套接字连接

Posted

技术标签:

【中文标题】打开 Internet P2P 套接字连接【英文标题】:Open Internet P2P Socket Connection 【发布时间】:2014-08-11 23:25:17 【问题描述】:

我知道,这是一个被广泛讨论的话题,但我希望有一些创新的方法,或者一些我还没有遇到过的方法。本质上,我需要一种在两台客户端机器上运行的套接字之间建立对等连接的方法。当然,主要问题是防火墙 (which should be doable) 和端口转发的需要。

现在,我熟悉 UPNP 和诸如此类的东西,我知道你 can(有时,无论如何)设置路由器进行端口转发,但这对我来说似乎是一个如此混乱的实现,更不用说不可靠了,因为用户可以切换路由器,甚至拥有一个没有 UPNP 或禁用它的路由器。

如果需要,我愿意添加一个中间服务器以促进连接,但除了简单地从一个流复制到另一个流(数字相当于将两部电话录音在一起,与扬声器一个人面对另一个人的麦克风,反之亦然),但是,正如这个类比所暗示的那样,这样做似乎并不是最好的方法。也许有办法让两个独立连接的不同套接字相互连接?

我已经看到 lots 和 lots 的问题或多或少确切地说明了我想要什么,并且我认识到将其标记为其中一些重复的诱惑,但主要是我想知道应用程序如何TeamViewer 或 Skype(如果我没记错的话,我认为 Skype 可能已经切换到通过服务器进行所有通信,但至少 MSN Messenger 曾经是 P2P)这样做。

所以,问题是:我如何设置一个套接字,无论是否通过使用中间服务器,它可以从一台客户端机器连接到另一台机器,而无需使用 UPNP 或类似的不可靠端口转发技术?

还有我在路上做的一些笔记:

至少,TeamViewer 确实为自己创建了一些防火墙例外。我这样做没有问题。但是,如果它采用将两部手机放在一起的方法,它为什么需要这些?默认情况下(通常)批准出站请求。 我听说 html5 与 WebSockets 允许浏览器到浏览器聊天,但它是如何工作的?我看过一些关于这方面的帖子,并被介绍给WebRTC,但是可以在浏览器之外使用类似的技术吗?我认为是这样,因为一般而言,网络对此类行为的限制更大。

为了记录,我确实可以完全控制客户端和任何必要的服务器,所以我可以做任何事情。 但是我非常感谢不必在启动客户端上做任何事情,因为我很想看到 Internet Explorer 在那个地方发挥作用。基本上我想写一个 P2P 代理,所以我当然可以做一些更高级的东西,通过编写我自己的套接字在它们之间进行通信并显示它(它不必工作得非常好,就够了,好吧,工作),但如果 IE 可以直接连接,那就太棒了。

请告诉我,我知道这也比我们希望看到的更广泛,它可能更适合程序员,但我尽量保持具体。

【问题讨论】:

我也对此感兴趣,因为我正在做类似的事情。您有任何安全问题吗?是否需要任何类型的 TLS? FWIW,我一直在吠叫 ZeroMQ 树。 @BillSambrone 我宁愿让它在没有的情况下工作,然后担心那些东西。但是不,我不认为我会打扰。这是我正在处理的一个非常低容量的问题,因此从维护的角度来看,添加这样的安全性的额外复杂性似乎不值得。 我认为您的中间服务器计划是唯一的方法。这是我对 TeamViewer 和 Skype 工作方式的假设。甚至还有其他的东西,比如 Hamachi。我也认为你的电话类比可能是首选的方式(可能我会怎么做),但我没有足够的经验来肯定地说。 我希望这个问题有 holepunching 两个字。 【参考方案1】:

Teamviewer、Skype 和类似的 P2P 应用程序使用 UDP 打孔机制进行 IPv4 NAT 穿越。这使得 P2P 应用成为可能。但是如果 UDP 被禁用或 NAT 路由器是对称的,这种打孔方法就不起作用。如果网络不支持打孔,所有 P2P 机制都会退回到中间服务器代理方法。如果您为家庭用户构建应用程序,那么您可以有 90% 的成功建立 P2P 连接。但在企业界,只有极少数允许 P2P 连接,因为出于安全原因,大多数使用 HTTP 代理服务器代替 NAT。 P2P 连接的另一种机制是使用 IPv6 套接字。使用 ipv6,不需要 NAT,并且可以使用全局 ipv6 地址直接访问机器。这种机制至少在 windows vista 和以上 PC 中有效,因为默认情况下它们使用 IPv6 转换技术(如 teredo ,6to4)具有 IPv6 地址。你可以在windows机器上看到这个前缀为2001的ipv6地址:这是一个全局的ipv6地址,你可以使用它直接建立与PC的连接,而不需要任何中间服务器。甚至 ipv6 也有点不可靠,因为很少有 PC 没有启用它。总之,您可以使用以上两种机制来构建您的应用程序以建立 P2P 连接,但很少需要回退到中间服务器。

【讨论】:

以上是关于打开 Internet P2P 套接字连接的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 Websockets 可以直接连接 2 个客户端(浏览器)而不使用服务器吗? (P2P)[重复]

套接字—Socket

没有任何框架的java p2p

Internet 上的 Java 套接字:ConnectException(操作超时)

详解使用nodejs+Socket打造P2P实时聊天室

简单服务器开发Socket 编程