如果防火墙默认不接受传入连接,那么P2P网络如何工作?

24

如果防火墙默认阻止所有传入连接,那么P2P技术如何工作?例如种子下载,如何连接到共享文件的每个人并从他们那里获取信息?它是否通过中继服务器或其他方法实现?


https://dev59.com/UWoy5IYBdhLWcg3wfOB4#8524609 - selbie
4个回答

20

我对BitTorrent并不是很了解,但对于一般的P2P连接技术比较熟悉。通常,在P2P网络中,客户端会在一个共同的信令服务器(例如SIP、XMPP、跟踪服务器、网站)上会合,交换IP地址、其他元数据和消息以引导直接连接。然后使用以下任何一种技术来启动通信会话:

  • 双方同时尝试连接对方 - 如果一方无法接受传入连接,但允许进行出站连接。这就是防火墙场景的情况。

  • 打洞(与上述方法一起使用)。中继不是必需的,但在两个对等方都位于难以穿越的网络设备后面时,可以帮助确保连接。有UDP打洞TCP打洞技术。更多信息请参见此处

  • 当直接连接不可能时,可以将中继(包括TURN服务器)部署到P2P网络中。所有你喜欢的视频通话应用都为这些场景部署了中继,但会尽力使对等方直接连接,以避免中继成本。

请搜索以下主题:STUN、TURN、ICE(交互式连接建立)、libjingle、pjnath、libnice。


你能否阅读这个问题并帮我一下?它涉及P2P消息传输和防火墙以及NAT。 - Marci-man
2
对于BT,信令服务器被称为Tracker。 - bond
对于第一点,很难找到相关的文档资料。你对于第二点 Hole Punching 是正确的,这在 Vuze DHT Additional Fetures 中有所描述,并基于 Rendez-Vous 节点的概念说明(来自 Vuze Swarm Discoveries documentation)。至于最后一点,STUN/TURN 在 Vuze 至少还未被实现 - KrisWebDev

6
如果防火墙(相对于NAT而言)打算阻止传入连接(我认为他们通常这样做),那么你无能为力。你可以尝试所有的洞穿技巧,但只需实现对称NAT即可,即每个针孔都专门开放给一个ip、端口四元组(源、目标端口和IP)。BitTorrent不太可能因为你无法接收传入连接而停止工作,它只会表现得稍微差一点。很有可能在Swarm上至少有一些人可以接收连接,你只需连接到他们。这里是一个旧的解释,说明如何在大多数情况下被防火墙封锁只意味着性能更差一些。编辑:简短回答“为什么”的问题是,大多数对等方没有被防火墙封锁(只是被NAT封锁)。

你能详细说明一下 http://bt.degreez.net/firewalled.html 吗?他们是怎么得出“开放端口的节点比被阻塞端口的节点受到的关注要多2.4倍”这个结论的? - Geremia
如果你能接收到传入的连接尝试,那么你将拥有更多的对等连接(至少你有更多的潜在对等连接),这是因为这个数字并不适用于所有的种子群,而仅适用于它们的特定示例。 - Arvid
在这种情况下,该数字似乎会略小于2,而不是2.4(参见我的答案)。 - Geremia
在具有6个防火墙节点和6个开放端口节点的示例中,一个防火墙节点连接到6个节点。这些节点中的每一个都有11个连接(到所有其他节点),这意味着您得到的“关注”来自6个节点的1/11,即6/11。如果您没有设置防火墙,则从其他开放节点获得5/11,并且还会从6个节点获得1/6的关注。结果是1 5/11个“关注”与6/11相比= 1 5/11 ÷ 6/11 = 1.454545 / 0.545454 ~= 2.6。 - Arvid

2

为了后人记录:

简短的答案是,这是通过https://en.wikipedia.org/wiki/Hole_punching_(networking)完成的。

当您从您的计算机连接到google.com(您的计算机很可能位于路由器和NAT后面)时,您的计算机IP地址和NAT端口号被发送到谷歌服务器。 谷歌使用这些连接信息向您的计算机发送搜索结果。

您可以将谷歌的服务器视为P2P网络中的一个节点。即使您的路由器不接受传入连接,谷歌也能够从其服务器“接触”到您。这是因为他们没有启动连接(他们不知道您的ip:NATedport组合以启动连接)。但是,您的计算机可以进行出站连接并向外部世界发送/发布您的ip:NATedport组合。

因此,P2P中的两个节点都向第三方站点发送其ip:NATedport组合,并交换此信息并开始连接(先得到信息的人)。


-1


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

例如,假设一半的节点有开放的传入端口:P = ½。那么, Co / Cf ≈ 2,
这意味着开放的节点具有比防火墙节点多约2倍的连接数(这意味着它们负担过重,但也意味着它们具有更多的可见性)。
因此,对于特定的节点和整个网络来说,P = 1更好;所有节点将是同样可见和同样负担。
如果P = 0,则网络根本无法工作,因为没有人能够启动与其他节点的连接。

1
伟大的符号逻辑灵活性,但您错过了问题的全部要点。现代网络设备在所有网络级别上都采用默认路由配置,无论是在ISP基础设施内还是在最终用户的网络上,所有未经请求的传入流量都会被丢弃。如果您想运行Web服务器或任何需要接收未经请求的流量的内容,则需要与您的ISP进行沟通,并让他们配置其硬件以允许这种流量的接收。这并不总是如此,它只是一种广泛采用的遏制垃圾邮件的手段。 - endrias

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