代码之家  ›  专栏  ›  技术社区  ›  Matthew Haugen

打开Internet P2P套接字连接

  •  6
  • Matthew Haugen  · 技术社区  · 10 年前

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

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

    如果需要的话,我愿意(尽管有些不情愿)加入一个中间服务器以方便连接,但除了简单地从一个流复制到另一个流之外(数字相当于将两个电话粘在一起,其中一个的扬声器面对另一个的麦克风,反之亦然),但正如这个类比所希望的那样,这样做似乎不是最好的方法。也许有一种方法可以将两个独立连接的、不同的套接字相互连接?

    我见过 lots lots 许多问题或多或少地说明了我想要什么,我意识到将其标记为其中一些问题的复制品的诱惑,但我主要想知道应用程序如何 TeamViewer 或者Skype(如果我没记错的话,我认为Skype可能已经改为通过服务器进行所有通信,但至少MSN Messenger以前是P2P)。

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

    我在路上做了一些笔记:

    • 至少,TeamViewer确实为自己创建了一些防火墙例外。我对此没有异议。但如果它采取将两部手机放在一起的方式,为什么会需要这些呢?默认情况下(通常)批准出站请求。
    • 我听说过HTML5和WebSocket允许浏览器间聊天,但这是如何实现的?我看过一些关于这方面的帖子 WebRTC ,但类似的技术是否可以在浏览器之外使用?我认为是这样,因为一般来说,网络对此类行为的限制性更强。

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

    让我知道,我知道这也比我们在这里看到的要广泛一些,它可能更适合程序员,但我尽量保持它的具体性。

    1 回复  |  直到 7 年前
        1
  •  3
  •   dvasanth    10 年前

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