P2P最重要的基础知识

时间:2012-08-30 10:28:49

标签: c++ networking p2p router peer

我一直在浏览www,但却无法获得最重要的P2P基础知识。

图表是这样的:

[peer1]<-->[dsl-router1]<-->[central server]<-->[dsl-router2]<-->[peer2]

我正在中央服务器上开发一个聊天软件。聊天消息现在通过'中央服务器很好地传输,但是,我需要制作p2p文件共享功能,因为服务器的带宽(有线带宽,而不是传输限制)仅用于传输聊天消息。

问题在于,我的中央服务器上的软件知道router1和router2的IP和端口,但不知道peer1和peer2,因为这些对等体在路由器后面并且没有IP地址。

如何实际将一些数据从peer1传输到peer2,反之亦然,而不将这些数据传递到中央服务器?

(最糟糕的情况是在peer和dsl-router之间有无线路由器)

2 个答案:

答案 0 :(得分:2)

有两种基本方法可以做到这一点。新方法是使用IGDP(通过uPnP打开端口)。这里描述得很好:

http://www.codeproject.com/Articles/13285/Using-UPnP-for-Programmatic-Port-Forwardings-and-N

如果两个节点都没有支持uPnP的路由器,那么另一种选择是TCP打孔,这不是完美的,但在实践中效果很好。这在这里描述:

http://www.brynosaurus.com/pub/net/p2pnat/

答案 1 :(得分:1)

在某些情况下,ISP提供的“路由器”可以在桥接模式下运行,这直接暴露互联网上的对等计算机(计算机获取公共互联网地址)。如果至少有一方具有此配置(或者在对等客户端不在另一个设备之后的类似情况下),那么事情应该是相当直接的:只需将中央服务器的工作分配给拥有此权限的任何人。

在另一种情况下,两个对等体只有一个本地地址(例如192.168.0.2)分配给他们的计算机,那么通过路由器将是相当困难的;路由器后面的客户端大部分都无法从外部访问,除非它们发出请求。然后,问题的一个解决方案是端口转发。通过明确写入的规则或UPnP进行端口转发,对等计算机上的某些端口暴露给公共互联网,就像在第一种情况下,而不是只有一些端口暴露整个计算机。

如果您没有这些,那么没有简单的方法可以避免通过中央服务器发送。虽然你可以找到其他有能力为其他人转移的同伴。