如果防火墙默认阻止所有传入连接,那么P2P技术如何工作?例如种子下载,如何连接到共享文件的每个人并从他们那里获取信息?它是否通过中继服务器或其他方法实现?
如果防火墙默认阻止所有传入连接,那么P2P技术如何工作?例如种子下载,如何连接到共享文件的每个人并从他们那里获取信息?它是否通过中继服务器或其他方法实现?
我对BitTorrent并不是很了解,但对于一般的P2P连接技术比较熟悉。通常,在P2P网络中,客户端会在一个共同的信令服务器(例如SIP、XMPP、跟踪服务器、网站)上会合,交换IP地址、其他元数据和消息以引导直接连接。然后使用以下任何一种技术来启动通信会话:
双方同时尝试连接对方 - 如果一方无法接受传入连接,但允许进行出站连接。这就是防火墙场景的情况。
打洞(与上述方法一起使用)。中继不是必需的,但在两个对等方都位于难以穿越的网络设备后面时,可以帮助确保连接。有UDP打洞和TCP打洞技术。更多信息请参见此处。
当直接连接不可能时,可以将中继(包括TURN服务器)部署到P2P网络中。所有你喜欢的视频通话应用都为这些场景部署了中继,但会尽力使对等方直接连接,以避免中继成本。
请搜索以下主题:STUN、TURN、ICE(交互式连接建立)、libjingle、pjnath、libnice。
为了后人记录:
简短的答案是,这是通过https://en.wikipedia.org/wiki/Hole_punching_(networking)完成的。
当您从您的计算机连接到google.com(您的计算机很可能位于路由器和NAT后面)时,您的计算机IP地址和NAT端口号被发送到谷歌服务器。 谷歌使用这些连接信息向您的计算机发送搜索结果。
您可以将谷歌的服务器视为P2P网络中的一个节点。即使您的路由器不接受传入连接,谷歌也能够从其服务器“接触”到您。这是因为他们没有启动连接(他们不知道您的ip:NATedport组合以启动连接)。但是,您的计算机可以进行出站连接并向外部世界发送/发布您的ip:NATedport组合。
因此,P2P中的两个节点都向第三方站点发送其ip:NATedport组合,并交换此信息并开始连接(先得到信息的人)。
让
F = 防火墙节点数,
O = 具有开放入站端口的节点数,
T = F + O = 总节点数,
P = O / T = 具有开放端口的节点总数比例,
Cf = 每个防火墙节点可以拥有的最大连接数, 以及
Co = 每个开放节点可以拥有的最大连接数。
那么,
Cf = O,∵ 防火墙节点只能连接到开放节点
Co = T - 1,∵ 开放节点可以连接到所有其他节点(一旦所有防火墙节点首先连接到它们)
所以
Co / Cf = (T - 1) / O = 1 / P - 1 / O。
如果T很大,
Co / Cf ≈ 1 / P。