网络中继是一种传输协议(transport protocol),它通过第三方中继对等节点实现两个对等节点之间进行通讯。

  在很多场景中,对等节点不能以穿透它们的NAT网络(traverse their NAT )来实现它们可以在公共网络上被访问, 或者它们没有共享它们的传输协议(transport protocols ),使得它们不能被直接通讯。

  为了能够使p2p架构面临的连接障碍问题比如NAT得到处理,libp2p定义了一个叫做p2p-circuit的协议(defines a protocol called p2p-circuit)。当一个对等节点不能够在公共地址上进行监听时,它可以拨号中继对等节点,这个中继对等节点可以保持长时间的连接活跃状态。其他对等节点可以通过拨号p2p-circuit地址,间接的连接到它们的目的地址。

  这个网络中继协议是收到了 TURN的启发,TURN是交互式连接建立( Interactive Connectivity Establishment)的NAT穿透技术集合的一部分。

  注意:

  中继连接是端对端加密的,那也就意味着作为中继的对等节点不能够读取或篡改经过它的数据。

  不透明是中继协议的一个重要方面。换句话说,源端节点和目的端节点都能知道它们之间的消息是被中继传递的。这个非常有用,因为目的端节点能够知道建立连接使用的中继地址并且使用该地址构建返回路径连接,用于发送消息到源端地址。这也不是匿名的,所有参与方都是使用它们的节点ID来识别它们,包括中继节点在内。

中继节点地址

  中继是使用一个包含了对等节点ID的多地址来识别的,这个对等节点的消息会被中继传输。

  让我们举个例子,我有一个节点ID是QmAlice的对等节点,我想把我的地址给我的朋友QmBob,但是我在一个NAT网络中,别人不能直接和我建立连接。

  我能够构建的最基本的p2p-circuit地址是:

  /p2p-circuit/p2p/QmAlice

  上面的这个地址非常有趣,因为这个地址不包括任何我们想构建的连接到QmAlice的地址和任何进行传输消息的中继节点地址。没有这些地址信息,一个对等节点唯一拨号我的机会是发现一个中继节点并且这个节点是和我保持连接的。

  一个比较好的节点地址类似/p2p/QmRelay/p2p-circuit/p2p/QmAlice。这个包含了指定的中继节点ID,QmRelay。如果一个对等节点知道如何与QmRelay建立连接,它们就能够连接到我。

  一个好的节点地址也为中继节点包含传输地址。让我们举个例子,我已经与指定的节点ID是QmRelay的中继节点建立了一个连接。它们通过身份协议告诉我,它们是地址为7.7.7.7,端口为55555监听上的连接。我可以依托于这个特定中继节点传输构建一个可以联系到我的路径地址:
/ip4/7.7.7.7/tcp/55555/p2p/QmRelay/p2p-circuit/p2p/QmAlice

  这个地址中/p2p-circuit之前的所有内容都是中继节点的地址,它包括了传输地址和它们的对等节点ID QmRelay /p2p-circuit/之后的内容是我的节点IDQmAlice。

  通过把这个详细的中继地址给我的朋友QmBob,他们就能够快速的与我建立一个中继的连接,从而不用到处去询问到达QmAlice的中继路径。

  当广播你自己的地址,提供一个包含了中继节点传输地址的中继地址是最好的。如果这个中继地址包含了许多传输地址,你可以为他们每个地址包含一个p2p-circuit。

自动中继

  中继协议只有当节点能够发现愿意成为中继节点并且能够与双方节点建立连接的节点时才有效。

  虽然一个可能的简单方案是在你的应用程序中硬编码添加一个已知的中继节点列表,但是这添加了一个在你的应用架构中你可能想避免的中心集合点。如果这些引导节点变的不可用,它们这种引导节点列表也可能是潜在的失败节点。

  自动中继是一个优点(当前已经在go-libp2p中实现),它使得对等节点能够利用libp2p内容路由接口( content routing )尝试发现中继节点。

  当自动中继可用时,对等节点会尝试发现一个或更多公共中继节点并打开中继连接。如果成功,这个节点就会利用libp2p的节点路由( peer routing)系统进行广播中继地址。

  警告

  自动中继还正在积极开发中并且应该考虑到实验性质。当前没有保护措施用于避免恶意的或篡改用于广播中继服务和拒绝提供服务的中继节点。

自动中继如何工作

  自动中继服务负责:

  1. 发现周围的中继节点
  2. 在它们之间建立长连接
  3. 为我们的节点广播有中继能力的节点,通过代理路由使我们自己可路由。

  当 AutoNAT service 服务检测到我们在NAT网络中并且阻止连接我们的连入连接,自动中继进入激活状态,执行以下流程:

  1. 我们通过运行DHT模块搜索/libp2p/relay命名空间来定位候选中继节点。
  2. 我们随机的选择三个结果节点,并与它们建立长连接(/libp2p/circuit/relay/0.1.0协议)。后续将支持延迟启发式选择功能。
  3. 我们可以利用/ip4/1.2.3.4/tcp/4001/p2p/QmRelay/p2p-circuit的格式形式来增强本地地址列表与需要的新的可中继的多地址之间的联系, 1.2.3.4是中继节点的公共IP地址,4001是libp2p端口,QmRelay是中继节点的节点ID。这个多地址的元素可以根据实际传输的情况进行改变。
  4. 我们通过使用IdentifyPush协议向我们已经连接的对等节点广播我们新的可以作为中继节点的节点地址。

  这最后一步是关键,因为它能够是我们连接的对等节点知道我们已知的可作为中继节点的地址更新,反过来,当其他节点向我们查询的时候,返回这些新学到的节点。

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/superblockchain/p/14276768.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!