首页 > 其他分享 >使用 Async Rust 构建简单的 P2P 节点

使用 Async Rust 构建简单的 P2P 节点

时间:2023-05-21 16:33:58浏览次数:40  
标签:tcp Peer P2P ip4 peer Async 节点 Rust

使用 Async Rust 构建简单的 P2P 节点

P2P 简介

  • P2P:peer-to-peer
  • P2P 是一种网络技术,可以在不同的计算机之间共享各种计算资源,如 CPU、网络带宽和存储。
  • P2P 是当今用户在线共享文件(如音乐、图像和其他数字媒体)的一种非常常用的方法。
    • Bittorrent 和 Gnutella 是流行的文件共享 p2p 应用程序的例子。以及比特币和以太坊等区块链网络。
    • 它们不依赖中央服务器或中介来连接多个客户端。
    • 最重要的是,它们利用用户的计算机作为客户端和服务器,从而将计算从中央服务器上卸载下来。
  • 传统的分布式系统使用 Client-Server 范式来部署
  • P2P 是另一种分布式系统
    • 在 P2P 中,一组节点(或对等点,Peer)彼此直接交互以共同提供公共服务,而无需中央协调器或管理员
    • P2P 系统中的每个节点(或 Peer)都可以充当客户端(从其他节点请求信息)和服务器(存储/检索数据并响应客户端请求执行必要的计算)。
    • P2P 网络中的所有节点不必完全相同,一个关键特征将 Client-Server 网络与 P2P 网络区分开来:缺乏具有唯一权限的专用服务器。在开放、无许可的 P2P 网络中,任何节点都可以决定提供与 P2P 节点相关的全部或部分服务集。

P2P 的特点

  • 与 Client-Server 网络相比,P2P 网络能够在其上构建不同类别的应用程序,这些应用程序是无许可、容错和抗审查的。
    • 无许可:因为数据和状态是跨多个节点复制的,所以没有服务器可以切断客户机对信息的访问。
    • 容错性:因为没有单点故障,例如中央服务器。
    • 抗审查:如区块链等网络。
    • P2P 计算还可以更好地利用资源。

P2P 的复杂性

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

P2P 的要求 - 传输

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

P2P 的要求 - Peer 身份

  • 与 web 开发领域不同,在 web 开发领域中,服务器由唯一的域名标识(例如 www.rust-lang.org,然后使用域名服务将其解析为服务器的IP地址)
  • P2P 网络中的节点需要唯一身份,以便其他节点可以访问它们。
  • P2P 网络中的节点使用公钥和私钥对(非对称公钥加密)与其他节点建立通信。
    • P2P 网络中的节点的身份称为 PeerId,是节点公钥的加密散列。

P2P 的要求 - 安全

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

P2P 的要求 - Peer 路由

  • P2P 网络中的节点首先需要找到其他 peer 才能进行通信。这是通过维护 peer 路由表来实现的,该表包含对网络中其他 peer 的引用。
  • 但是,在具有数千个或更多动态变化的节点(即节点加入和离开网络)的 P2P 网络中,任何单个节点都难以为网络中的所有节点维护完整而准确的路由表。Peer 路由使节点能够将不是给自己准备的消息路由到目标节点。

P2P 的要求 - 消息

  • P2P 网络中的节点可以向特定节点发送消息,但也可以参与广播消息协议。
    • 例如,发布/订阅,其中节点注册对特定主题的兴趣(订阅),发送该主题消息的任何节点(发布)都由订阅该主题的所有节点接收。这种技术通常用于将消息的内容传输到整个网络。

P2P 的要求 - 流多路复用

  • 流多路复用(Stream multiplexing)是通过公共通信链路发送多个信息流的一种方法。
  • 在 P2P 的情况下,它允许多个独立的“逻辑”流共享一个公共 P2P 传输层。
    • 当考虑到一个节点与不同 peers 具有多个通信流的可能性,或者两个远程节点之间也可能存在多个并发连接的可能性时,这一点变得很重要。
    • 流多路复用有助于优化 peer 之间建立连接的开销。

注意:多路复用在后端服务开发中很常见,其中客户端可以与服务器建立底层网络连接,然后通过底层网络连接多路复用不同的流(每个流具有唯一的端口号)。

Libp2p

  • libp2p 是一个由协议、规范和库组成的模块化系统,它支持 P2P 应用程序的开发。
  • 它目前支持三种语言:JS、Go、Rust
    • 未来将支持 Haskell、Java、Python等
  • 它被许多流行的项目使用,例如:IPFS、Filecoin 和 Polkadot 等。

Libp2p 的主要模块

  • 传输(Transport):负责从一个 peer 到另一个 peer 的数据的实际传输和接收
  • 身份(Identity):libp2p 使用公钥密钥(PKI)作为 peer 节点身份的基础。使用加密算法为每个节点生成唯一的 peer id。
  • 安全(Security):节点使用其私钥对消息进行签名。节点之间的传输连接可以升级为安全的加密通道,以便远程 peer 可以相互信任,并且没有第三方可以拦截它们之间的通信。
  • Peer 发现(Peer Discovery):允许 peer 在 libp2p 网络中查找并相互通信。
  • Peer 路由(Peer Routing):使用其他 peer 的知识信息来实现与 peer 节点的通信。
  • 内容发现(Content Discovery):在不知道哪个 peer 节点拥有该内容的情况下,允许 peer 节点从其他 peer 节点获取部分内容。
  • 消息(Messaging):其中发布/订阅:允许向对某个主题感兴趣的一组 peer 发送消息。

P2P 节点的身份

P2P Node

PeerId: 12d3k.....

~/rust via 

标签:tcp,Peer,P2P,ip4,peer,Async,节点,Rust
From: https://www.cnblogs.com/QiaoPengjun/p/17418735.html

相关文章

  • python-asyncio
    python-asyncio目录python-asyncioyieldasyncio中几个重要概念异步代码定义和运行asyncio.run()await()asyncio.create_task()创建Task获取协程返回取消任务多任务控制多任务返回其他知识点run_until_complete实现的原理wait与gather中的区别参考文献协程是在用户态实现的......
  • Python潮流周刊#2:Rust 让 Python 再次伟大
    这里记录每周值得分享的Python及通用技术内容,部分为英文,已在小标题注明。(本期标题取自其中一则分享,不代表全部内容都是该主题,特此声明。)文章&教程1、Python修饰器的函数式编程介绍了装饰器的实现原理、带参装饰器、多装饰器、类装饰器和几个典型的示例。文章发布于2014年,代......
  • NET 高级编程知识--多线程async/await
    NET高级编程知识一.多线程async/awaitasync:的价值1.降低了线程的数量;2.降低了cpu的负载;3.asnync/await提高了吞吐,只负责发命令,然后就忙别的事去了,不需要等待,事完成前不浪费资源,完成后在来线程处理,还能复用线程,不开新线程。asnyn:并发不高,线程较多,cpu开销不大,使用了DAM异......
  • 碧圈异步交易平台AsyncAlgoTrading学习笔记一:下载与编译
    下载无exe或Linux二进制,需源码编译安装GitHub地址:https://github.com/AsyncAlgoTrading/aat.git编译运行环境ubuntu20.04python3.8.10编译1.将Makefile中的PYTHON=python改为PYTHON=python32.安装必要的依赖:(1)sudoapt-getinstallpython3-dev(2)sudoapt-getinstallbui......
  • 开源之夏 2023 | 欢迎报名Rust相关项目
    ......
  • @EnableAsync @Async
    一.基本介绍@Async是spring为了方便开发人员进行异步调用的出现的,在方法上加入这个注解,spring会从线程池中获取一个新的线程来执行方法,实现异步调用@EnableAsync表示开启对异步任务的支持,可以放在springboot的启动类上,也可以放在自定义线程池的配置类上,具体看下文二.最简单的......
  • 【数论】Rust使用Miller-Rabin primality test判别素数
    题目地址https://ac.nowcoder.com/acm/contest/57677/A代码usestd::io::{self,BufRead,Write};fnis_prime_triival(n:i128)->bool{ifn<=1{returnfalse;}ifn==2{returntrue;}ifn%2==0{retur......
  • C#异步编程之async/await
    https://blog.csdn.net/wulex/article/details/127380403  异步、多线程的区别 异步:属于通信的范畴,在发出消息当下不等待对方回应,便开始继续自己的任务。所以c#的很多_异步_操作都在io、socket这些类库下面,都是通信性质的类库, io可以理解向系统内核发送文件......
  • Rust 必知必会
    资料Rust程序设计语言Book:https://doc.rust-lang.org/book/RustBook本地:rustupdocs--bookRust程序设计语言简体中文版:https://kaisery.github.io/trpl-zh-cn/RustBook实验(互动版教材):https://rust-book.cs.brown.edu/生命周期常见的生命周期错误概念:https://github.......
  • C# Async异步
    原文链接:https://blog.csdn.net/zuheyawen/article/details/99863588转载连接:https://www.cnblogs.com/wcrBlog/p/11690460.html前言C#异步编程有几种实现方式,异步方法就是其中的一种。异步方法是C#5.0才有的新特性,主要采用async、await关键字声明为异步方法,完成对方法的异......