如何在没有端口转发或集中式服务器的情况下创建点对点连接?

39

我记得曾经读到一篇关于实现该目的的文章。如果我没记错的话,研究人员通过相互发送HTTP数据包成功地在另一个网络上的客户端之间创建了连接(Alice假装Bob是HTTP Web服务器,而Bob假装Alice是Web服务器)。

我不确定这是否有意义,但是有人知道我在哪里可以找到这篇文章吗?或者有其他想法如何在没有中央服务器或端口转发的情况下将两个客户端连接起来吗?

这可能可行吗?

编辑:我会知道两台计算机的IP地址和程序监听的端口。


P2P可以通过http://en.wikipedia.org/wiki/UDP_hole_punching实现,但是没有集中式服务器,您无法找到其他成员的IP。 - Deepsy
@Deepsy 即使你知道双方的IP和端口,也无法吗? - Crayboff
2个回答

44

这是可能的。我认为你的问题至少有2个方面。(它不会是HTTP数据包,比那更复杂。)

首先,我认为你可能在谈论去中心化的P2P网络概念。去中心化对等网络的主要思想是,在这样的网络中共同的节点不需要中央服务器或一组服务器。

你可能已经知道,大多数常见的中心化对等网络需要这样的集中式系统来交换和维护节点之间的互连性。其基本概念是这样的:新节点将连接到其中一个主服务器,以检索有关网络上其他节点的信息,以维护其连接性和可用性。中央系统通过服务器不断同步网络状态、相关信息和彼此的中央协调来进行维护。

另一方面,去中心化网络没有任何结构或预定的核心。这种点对点模型也被称为非结构化P2P网络。任何新节点都将从“父”节点复制或继承原始链接,并随时间形成自己的列表。这些非结构化网络有几种去中心化类别。

有趣的是,缺乏中央指令和控制系统使其成为现代恶意软件僵尸网络的首选解决方案。一个很好的例子是Storm僵尸网络,它利用所谓的被动P2P监视器(PPM)。PPM能够定位受感染的主机并建立对等列表,无论受感染的主机是否在防火墙或NAT后面。维基百科的文章Storm botnet是一篇有趣的阅读。还有一篇名为《在点对点僵尸网络中实现完整节点枚举》的优秀合作研究,介绍了Storm僵尸网络所采用的出色概念分析和技术。

其次,你可能在谈论UDP洞穴穿透。这是一种技术或算法,用于通过第三方约会服务器,利用第三方公共主机来维护两个NAT路由器/网关后面的主机之间的连接。

有一篇很好的论文,作者是Bryan Ford、Pyda Srisuresh和Dan Kegel,名为Peer-to-Peer Communication Across Network Address Translators


1
感谢您提供的信息,写得非常好并且有来源。在更深入地研究UDP打洞后,我意识到这正是我一直在寻找的(出于某种原因,我最初认为需要一个集中式服务器,但现在我意识到如果我已经拥有IP和端口信息,我可以跳过那部分)。 - Crayboff

18
如前所述,对等连接需要在两台(很可能是)住宅电脑之间建立连接,这将需要穿过它们的防火墙。有关穿越防火墙的具体示例,请参见pwnat:“无需第三方即可穿透防火墙/NAT的唯一工具”。简而言之,该过程如下所示:
  1. “服务器”(不知道客户端的IP地址,但客户端知道服务器的IP地址)每30秒向1.2.3.4发送一个非常特定的ICMP Echo Request数据包进行ping操作。网络地址转换(NAT)在转换期间记下此数据包以防止得到响应。
  2. 客户端向服务器发送一个ICMP Time Exceeded数据包,这是一种通常包含未能传递的数据包的数据包类型。客户端事先知道服务器一直向1.2.3.4发送的确切数据包,因此将整个数据包嵌入Data字段中。
  3. NAT识别Echo请求数据包并愉快地中继整个Time Exceeded数据包,源IP和所有其他信息至正确的用户,即服务器。现在服务器已经知道客户端的IP地址和端口号。
  4. 现在服务器知道了地址,它开始不断向客户端发送UDP数据包,尽管客户端的NAT未预料到这些数据包,因此会忽略所有这些数据包。
  5. 客户端开始向服务器发送UDP数据包,这些数据包将被服务器的NAT识别为对服务器数据包的响应,并相应地路由。
  6. 现在客户端正在向服务器发送UDP数据包,服务器的UDP数据包流开始得到正确路由。

通过6个简单的步骤,您已经在突破两个住宅防火墙之间建立了客户端和服务器之间的UDP连接。告诉你一个秘密:不用担心ISP!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接