P2P

介绍
-

1.P2P介绍

*peer-to-peer

P2P是一种网络技术,可以在不同的计算机之间共享各种计算资源,如CPU、网络带宽和存储。

P2P是当今用户在线共享文件的一种非常常见的方法

  • Bittorrent和Gnutella是流行的文件共享P2P应用程序的例子,以及比特币和以太坊等区块链网络
  • 他们不依赖中央服务器或中介来连接多个客户端
  • 最重要的是,他们利用用户的计算机作为客户端和服务器,从而将计算从中央服务器上卸载下来。

2.P2P简介

传统的分布式系统使用Client-Server范式来部署
P2P是另一种分布式系统

  • 在P2P中,一组节点(或对等点,peer)彼此直接交互以共同提供公共服务,而无需中央协调器或管理员
  • P2P系统中的每个节点(或Peer)都可以充当客户端(从其他节点请求信息)和服务端(存储/检索数据并响应客户端请求执行必要的计算)
  • P2P网络中的所有节点不必完全相同,一个关键特征将Client-Server网络与P2P网络区分开来:缺乏具有唯一权限的专用服务器。在开放、无许可的P2P网络中,任何节点都可以决定提供与P2P节点相关的全部或部分服务集合。

3.P2P的特点

与Client-Server网络比较,P2P网络能够在其上构建不同类别的应用程序,这些应用程序是无许可、容错和抗审查的

  • 无许可:因为数据和状态是跨多个节点复制的,所以没有服务器可以切断客户机对信息的访问
  • 容错性:因为没有单点故障,例如中央服务器
  • 抗审查:如区块链等网络
  • P2P计算还可以更好的利用资源

4.P2P的复杂性

构建P2P系统要比传统Client-Server的系统复制

  • 传输:P2P网络中的每个Peer都可以使用不同的协议,Http(s)、TCP、UDP等
  • 身份:每个Peer都需要知道其想要连接并发送消息的Peer的身份
  • 安全性:每个peer都应该能够以安全的方式与其他peer通信,而不存在第三方拦截或修改消息的风险对等
  • 路由:每个peer可以通过各种路由(如数据包在ip协议中的分布方式)从其他peer接受消息,这意味着如果消息不是针对自身的,则每个peer都应该能够将消息路由到其他peer
  • 消息传递:P2P网络应该能够发送点对点消息或或消息(以发布/订阅模式)

4.1 P2P的要求-传输

TCP/IP和UDP协议无处不在,在编写网络应用程序时非常流行。单还有其他更高级别的协议如http和quic。
P2P网络中的每个peer都应该能够启动到另一个节点的连接,并且由于网络中peer的多样性,能够通过多个协议监听传入的连接。

4.2 P2P的要求-peer身份

与web开发领域不同,在web开发领域中,服务器由唯一的域名标识
P2P网络中的节点需要唯一身份,以便其他节点可以访问他们。
P2P网络中的节点使用公钥和私钥对(非对称公钥加密)与其他节点建立安全通信

  • P2P网络中节点的身份称为PeerId,是节点公钥的加密散列。

4.3 P2P的要求-安全

加密密钥对和PeerId是节点能够与他的Peers建立安全,经过身份验证的通信通道。但这只是安全的一个方面。
节点还需要实现授权框架,该框架为哪个节点可以执行何种操作建立规则。
还有需要解决的网络级安全威胁,如sybil攻击(其中一个节点运营商利用不同身份启动大量节点,以获取网络中的优势地位)或eclipse攻击(其中一组恶意节点共谋以特定节点为目标,使后者无法到达任何合法节点)

4.4 P2P的要求-Peer路由

P2P网络中的节点首先需要找到其他Peer才能进行通信。这是通过维护Peer路由表来实现的,该表包含对网络中其他peer的引用。

但是,在具有数千个或者更多动态变化的节点(即节点加入和离开网络)的P2P网络中,任何但个节点都难以为网络中的所有节点维护完整而准确的路由表。peer路由使节点能够将不是给自己准备的消息路由到目标节点。

4.5 P2P的要求-消息传递

P2P网络中的节点可以向特定节点发送消息,但也可以参与广播消息协议。

  • 例如,发布/订阅,其中节点注册对特定主题的兴趣(订阅),发送该主题消息的任何节点(发布)都由订阅该主题的所有节点接受。这种技术通常用于将消息的内容传输到整个网络。

4.6 P2P的要求-流多路复用

流多路复用(Stream multiplexing)是通过公共通信连路发送多个信息流的一方式种。

在P2P的情况下,它允许多个独立的逻辑流共享一个公共P2P传输层。

  • 当考虑到一个节点与不同peers具有多个通信流的可能性,或者两个远程节点之间也可能存在多个并发连接的可能性时,这一点变得很重要。
  • 流多路复用有助于优化peer之间建立连接的开销。(注意:多路复用在后端开发种很常见,其中客户端可以与服务端建立底层网络连接,然后通过底层网络连接多路复用不同的流,每个流具有唯一的端口号)。

5.公钥与私钥

  • 加密身份使用公钥基础设施(PKI),广泛用于为用户、设备和应用程序提供唯一身份,并保护端到端通信的安全。
  • 他的工作原理是创建两个不同的加密密钥,也称为由私钥和公钥组成的密钥对,他们之间具有数学关系。
  • 密钥对有着广泛的应用,但在P2P网络中,
    • 节点使用密钥对彼此进行身份识别和身份验证
    • 公钥可以在网络中与他人共享,但绝不能泄漏节点的私钥。

5.1 公钥和私钥的例子 - 访问传统的服务器

如果你想连接到数据中心的远程服务器(使用ssh),用户可以生成密钥对并在远程服务器上配置公钥,从而授予用户访问权限。

但远程服务器如何知道哪个用户是该公钥的所有者?

  • 为了实现这一点,当连接(通过ssh)到远程服务器时,用户必须指定私钥(与存储在服务器上的公钥关联的)。
  • 私钥从不发送到远程服务器,但ssh客户端(在本地服务器上运行)使用用户的私钥向远程ssh服务器进行身份验证。

6.多地址

当p2p网络中的节点共享其联系信息时,他们会发送一个包含网络地址和peer id的多地址(multiaddress)。

节点多地址的peer id表示如下:

/p2p/l2D3KooWBu3fmjZgSMLkQ2plDG35UmEayYBrhsk6WEelxcolJFbV
多地址的网络地址表示如下:
/ip4/192.158.1.23/tcp/1234
节点的完整多地址就是peer id和网络地址的组合:
/ip4/192.158.1.23/tcp/1234/p2p/l2D3KooWBu3fmjZgSMLkQ2plDG35UmEayYBrhsk6WEelxcolJFbV