在当今数字化时代,分布式系统的重要性愈发凸显。它不仅能提升数据的存储安全性和可靠性,还能增强通信的效率和隐私性。于是我做了这个去中心化共享及通訊的程序,它构建了一个强大的分布式存储和通信网络,下面我们就来详细了解其实现原理和核心功能。

程序概述

实现了一个基于点对点(P2P)网络的分布式存储和通信系统。该系统允许节点加入网络、共享文件、存储文件块以及进行加密通信。它采用了分布式哈希表(DHT)的思想,通过节点间的协作来存储和检索文件。

核心类与功能

1. Node 类

Node 类代表网络中的一个节点,它包含了节点的基本信息和状态。以下是该类的主要功能:

  • 地址簿管理:维护一个地址簿,记录网络中其他节点的信息,包括主机名、端口号和最后活跃时间。
  • 文件管理:存储文件的元数据和文件块,支持文件的注册和广播。
  • 加密密钥管理:使用 SHA - 256 算法为每个节点生成共享加密密钥,确保通信的安全性。
class Node:def __init__(self, host, port, domain):self.host = hostself.port = portself.domain = domainself.address_book = {}  # {domain: (host, port, last_seen)}self.files = {}  # {file_hash: {'name': str, 'size': int, 'chunks': list}}self.stored_chunks = {}  # {chunk_hash: data}self.network_initialized = Falseself.is_bootstrap = Falseself.peer_lock = threading.Lock()self.file_lock = threading.Lock()self.shared_secrets = {}  # 存储加密密钥# 初始化时将自己加入地址簿self.add_peer(domain, host, port)

2. NetworkManager 类

NetworkManager 类负责节点的网络通信和管理,它处理节点的加入、消息传递、文件上传和下载等任务。以下是该类的主要功能:

  • 服务器启动:启动一个 TCP 服务器,监听其他节点的连接请求。
  • 节点加入网络:允许节点通过引导节点加入网络,并同步地址簿信息。
  • 消息传递:支持直接消息和中继消息的发送和接收,确保通信的可靠性。
  • 文件操作:实现文件的上传、下载和存储,将文件分割成块并存储在多个节点上。
class NetworkManager:def __init__(self, node, log_callback):self.node = nodeself.log_callback = log_callbackself.server_socket = Noneself.running = False# 启动节点状态检查self.status_check_timer = threading.Timer(PING_INTERVAL, self.check_peer_status)self.status_check_timer.daemon = Trueself.status_check_timer.start()def start_server(self):self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)self.server_socket.bind((self.node.host, self.node.port))self.server_socket.listen(5)self.running = Trueserver_thread = threading.Thread(target=self._accept_connections)server_thread.daemon = Trueserver_thread.start()self.log_callback(f"服务器已启动在 {self.node.host}:{self.node.port}")

核心功能实现

1. 节点加入网络

节点通过向引导节点发送 join 请求来加入网络。引导节点收到请求后,会检查域名是否已存在,如果不存在则将新节点添加到地址簿,并广播新节点信息给其他节点。

def _handle_join(self, message, client_socket):domain = message['domain']host = message['host']port = message['port']# 检查域名是否已存在if domain in self.node.address_book:response = {'type': 'join_error','message': '域名已存在'}client_socket.send(json.dumps(response).encode())self.log_callback(f"拒绝加入: 域名 {domain} 已存在")return# 添加新节点到地址簿self.node.add_peer(domain, host, port)# 发送完整的地址簿给新节点response = {'type': 'join_ack','bootstrap': self.node.is_bootstrap,'address_book': self.node.get_all_peers_with_status()}client_socket.send(json.dumps(response).encode())# 通知日志self.log_callback(f"新节点加入: {domain} ({host}:{port})")# 广播新节点信息给所有已知节点(除了新节点自己)self._broadcast_new_node(domain, host, port)

2. 文件上传与下载

文件上传时,系统会将文件分割成多个块,并将每个块存储在多个节点上。同时,文件的元数据会被广播到网络中的其他节点。文件下载时,系统会首先获取文件的元数据,然后从各个节点收集文件块,最后验证文件的完整性并保存。

def upload_file(self, file_path, num_chunks=4, num_replicas=2):try:file_name = os.path.basename(file_path)file_size = os.path.getsize(file_path)# 读取文件内容with open(file_path, 'rb') as f:file_data = f.read()# 创建文件哈希file_hash = hashlib.sha256(file_data).hexdigest()# 分割文件为多个块chunks = []chunk_size = max(FILE_CHUNK_SIZE, (len(file_data) + num_chunks - 1) // num_chunks)for i in range(0, len(file_data), chunk_size):chunk = file_data[i:i+chunk_size]chunk_hash = hashlib.sha256(chunk).hexdigest()chunks.append(chunk_hash)# 存储块到多个节点self._store_chunk(chunk, chunk_hash, num_replicas)# 注册文件元数据metadata = {'name': file_name,'size': file_size,'chunks': chunks}self.node.register_file(file_hash, file_name, file_size, chunks)# 广播文件元数据self.node.broadcast_file_metadata(file_hash, metadata)# 通知日志self.log_callback(f"文件上传成功: {file_name} (哈希: {file_hash})")return file_hashexcept Exception as e:self.log_callback(f"文件上传失败: {str(e)}")return None

3. 加密通信

系统使用 AES 算法对消息进行加密,确保通信内容的隐私性。每个节点会根据双方的域名生成一个共享密钥,用于加密和解密消息。

def _generate_shared_key(self, target_domain):"""生成共享密钥 - 基于双方域名生成确定性密钥"""# 按字母顺序排序域名以确保双方生成相同密钥domains = sorted([self.node.domain, target_domain])key_str = f"{domains[0]}-{domains[1]}"# 使用SHA-256生成256位哈希,取前16字节作为AES-128密钥key = hashlib.sha256(key_str.encode()).digest()[:16]self.node.shared_secrets[target_domain] = keyreturn keydef _encrypt_message(self, message, key):iv = get_random_bytes(16)cipher = AES.new(key, AES.MODE_CFB, iv)encrypted = cipher.encrypt(message.encode())encrypted_base64 = base64.b64encode(encrypted).decode()while len(encrypted_base64) % 4 != 0:encrypted_base64 += '='iv_base64 = base64.b64encode(iv).decode()while len(iv_base64) % 4 != 0:iv_base64 += '='return encrypted_base64, iv_base64

总结

DSAC是一个功能强大的分布式存储和通信系统,它通过节点间的协作实现了文件的安全存储和高效通信。其采用的分布式架构和加密技术确保了系统的可靠性和隐私性。通过深入了解这个程序,我们可以学习到分布式系统的设计和实现思路,为构建更复杂的分布式应用打下基础。

希望这篇文章能帮助你更好地理解 DSAC程序,如果你有任何问题或建议,欢迎在评论区留言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/85747.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/85747.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/85747.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ass字幕嵌入mp4带偏移

# 格式转化文件,包含多种文件的互相转化,主要与视频相关 from pathlib import Path import subprocess import random import os import reclass Utils(object):staticmethoddef get_decimal_part(x: float) -> float:s format(x, .15f) # 格式化为…

05 APP 自动化- Appium 单点触控 多点触控

文章目录 一、单点触控查看指针的指针位置实现手势密码: 二、多点触控 一、单点触控 查看指针的指针位置 方便查看手势密码-九宫格每个点的坐标 实现手势密码: 执行手势操作: 按压起点 -> 移动到下一点 -> 依次移动 -> 释放&am…

【软件】在 macOS 上安装 MySQL

在 macOS 上安装 MySQL 有多种方法,以下是两种常见的安装方式:通过 Homebrew 安装和通过安装包安装。以下是详细的步骤: 一、通过 Homebrew 安装 MySQL Homebrew 是 macOS 的包管理器,使用它安装 MySQL 非常方便。 1.安装 Home…

第11节 Node.js 模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的…

力扣热题100之二叉树的直径

题目 给你一棵二叉树的根节点,返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路径的 长度 由它们之间边数表示。 代码 方法:递归 计算二叉树的直径可以理解…

OpenCV CUDA模块图像处理------创建CUDA加速的Canny边缘检测器对象createCannyEdgeDetector()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于创建一个 CUDA 加速的 Canny 边缘检测器对象(CannyEdgeDetector),可以在 GPU 上高效执行 Canny 边…

unix/linux,sudo,其内部结构机制

我们现在深入sudo的“引擎室”,探究其内部的结构和运作机制。这就像我们从观察行星运动,到深入研究万有引力定律的数学表达和物理内涵一样,是理解事物本质的关键一步。 sudo 的内部结构与机制详解 sudo 的执行流程可以看作是一系列精心设计的步骤,确保了授权的准确性和安…

什么是 TOML?

🛠 Rust 配置文件实战:TOML 语法详解与结构体映射( 在 Rust 中,Cargo.toml 是每个项目的心脏。它不仅定义了项目的名称、版本和依赖项,还使用了一种轻巧易读的配置语言:TOML。 本文将深入解析 TOML 的语法…

react native webview加载本地HTML,解决iOS无法加载成功问题

在react native中使用 “react-native-webview”: “^13.13.5”,加载HTML文件 Android: 将HTML文件放置到android/src/main/assets目录,访问 {uri: file:///android_asset/markmap/index.html}ios: 在IOS中可以直接可以直接放在react native项目下,访问…

数据结构(JAVA版)练习题

(题目难易程度与题号顺序无关哦) 目录 1、多关键字排序 2、集合类的综合应用问题 3、数组排序 4、球的相关计算问题 5、利用类对象计算日期 6、日期计算问题 7、星期日期的计算 8、计算坐标平面上两点距离 9、异常处理设计问题 10、Java源文件…

04-redis-分布式锁-redisson

1 基本概念 百度百科:控制分布式系统之间同步访问共享资源方式。 在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止…

性能优化 - 案例篇:缓存_Guava#LoadingCache设计

文章目录 Pre引言1. 缓存基本概念2. Guava 的 LoadingCache2.1 引入依赖与初始化2.2 手动 put 与自动加载(CacheLoader)2.2.1 示例代码 2.3 缓存移除与监听(invalidate removalListener) 3. 缓存回收策略3.1 基于容量的回收&…

使用jstack排查CPU飙升的问题记录

最近,看到短视频传播了一个使用jstack来协助排查CPU飙升的案例。我也是比较感兴趣,参考了视频博主的流程,自己做了下对应案例的实战演练,在此,想做一下,针对相关问题模拟与排查演练的实战过程记录。 案例中…

Sql Server 中常用语句

1.创建用户数据库 --创建数据库 use master --切换到master数据库 go-- 终止所有与SaleManagerDB数据库的连接 alter database SaleManagerDB set single_user with rollback immediate goif exists (select * from sysdatabases where nameSaleManagerDB) drop database Sal…

联通专线赋能,亿林网络裸金属服务器:中小企业 IT 架构升级优选方案

在当今数字化飞速发展的时代,中小企业面临着日益增长的业务需求与复杂多变的市场竞争环境。如何构建高效、稳定且具性价比的 IT 架构,成为众多企业突破发展瓶颈的关键所在。而亿林网络推出的 24 核 32G 裸金属服务器,搭配联通专线的千兆共享带…

LangChain核心之Runnable接口底层实现

导读:作为LangChain框架的核心抽象层,Runnable接口正在重新定义AI应用开发的标准模式。这一统一接口设计将模型调用、数据处理和API集成等功能封装为可复用的逻辑单元,通过简洁的管道符语法实现复杂任务的声明式编排。 对于面临AI应用架构选择…

CSP严格模式返回不存在的爬虫相关文件

文章目录 说明示例(返回404)示例(创建CSP例外) 说明 日期:2025年6月4日。 CSP严格模式是default-src none,但有些web应用中,在爬虫相关文件不存在的情况下,依旧返回了对应文件&…

DeviceNET从站转EtherNET/IP主站在盐化工行业的创新应用

在工业自动化飞速发展的今天,盐化工行业也在积极探索智能化升级的路径。其中,设备之间的高效通信与协同工作成为了提升生产效率和质量的关键。而JH-DVN-EIP疆鸿智能DeviceNET从站转EtherNET/IP主站的技术应用,为盐化工行业带来了全新的解决方…

安装 Nginx

个人博客地址:安装 Nginx | 一张假钞的真实世界 对于 Linux 平台,Nginx 安装包 可以从 nginx.org 下载。 Ubuntu: 版本Codename支持平台12.04precisex86_64, i38614.04trustyx86_64, i386, aarch64/arm6415.10wilyx86_64, i386 在 Debian/Ubuntu 系统…

默认网关 -- 负责转发数据包到其他网络的设备(通常是路由器)

✅ 默认网关概括说明: 默认网关(Default Gateway)是网络中一台负责转发数据包到其他网络的设备(通常是路由器)。当一台主机要访问不在本地子网内的设备时,会将数据包发给默认网关,由它继续转发…