《c# 实现p2p文件分享与传输系统》 一、 模型

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 《c# 实现p2p文件分享与传输系统》 一、 模型

一、模型

  P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享。P2P技术已经发展了很多年了,虽然理论上已经发展了很多的模型,但在实际的网络环境中(尤其是镇里这种环境),究竟怎样的网络结构才具有较好的稳定性和较高的传输性能,还是有很大的争议,每家做P2P的网络公司都会有不同的见解。当前,P2P技术应用的主要目的还是减轻服务器工作压力,本人不才,之前曾在国内某网络软件公司里担任p2p相关的流媒体项目开发,对于P2P技术所创造的能力和带来的价值深有体会,也曾被它的复杂性所折磨的痛苦不已,不过,这也是我所珍惜的一笔宝贵的知识财富。

  似乎扯远了。。。赶紧回来,前段时间做了一个c#实现p2p文件传输系统的项目。以前都是用c/c++,这还是第一次用c#来做这种项目,由于用c++比用c#要早的多,所以写c#程序不免会带些c++的习惯,不过不影响程序整体。第一步:设计。对于“文件分享和传输”这种典型的p2p应用,可以使用成熟的模型和框架:

  上面这个图里面有几个固定的端点:Peer、Tracker Server、NAT Server和Source Server,还有两个游离的元素:数据和下载节点,它们构成了一个完整的p2p网络。在这个网络中,它们各司其职,维系着网络的运转。

  • Peer 整个系统的核心所在,主要负责资源提供和资源索取,驱动着网络的运行。也只有Peer,是唯一的一个必须存在的元素。
  • Tracker Server 如其名所述,动态、实时地监视着整个网络中peer节点的状态和资源分布,向下载节点提供p2p资源查询的重要功能,通过tracker server,下载节点可以迅速而准确的获取网络中拥有资源的节点列表,展开p2p下载。
  • NAT Server 负责NAT穿透,也形象的称为“打洞”。对于藏在受限型NAT网络后面的节点,不通过NAT Server做穿透的话,是无法和NAT后面的节点进行通信的,而目前大部分人是没有公网IP的,NAT Server对于组建p2p网络十分的重要。对于NAT穿透,我会在后面的文章中解释。
  • Source Server 负责资源提供或资源发布,一般网络公司建立的p2p网络,会有这种服务器来发布需要推广和扩散的资源。

  这个模型基本涵盖了p2p网络架构的主要几个部分,在具体实施的时候会根据不同的资源类型有不同的变化,通常会更加的复杂,当然,也有可能更简单。比如,DHT(Distributed Hash Table) 网络,这种网络,以不需要服务器的参与来完成p2p的查询与传输为主要特点,例如大家常用的eMule中的KAD网络,就是一种DHT网络。但其实,DHT中,是peer节点,负责了Tracker Server和Source Server的工作。也就是peer变得比较复杂,如果把它拆开来看,也基本就是这个模型。Peer的复杂化,可以降低服务器运行压力,但就牺牲了实时性,对于实时性和准确性要求高的应用,例如流媒体,不太适合DHT,当然,这并不妨碍DHT作为辅助手段来探知更多的资源节点。

  我要做的这个“EasyP2P”文件分享与传输系统,目前暂时不需要Source Server,由Peer负责Source Server的功能,也就是资源的发布;Tracker Server负责节点和资源的查询;NAT Server依然负责打洞。于是,变化成如下结构:



  这就是EasyP2P系统的模型,接下来,将根据这个模型,来具体设计整个网络的架构和运行流程。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
PyTorch API C#
【Python+C#】手把手搭建基于Hugging Face模型的离线翻译系统,并通过C#代码进行访问
目前翻译都是在线的,要在C#开发的程序上做一个可以实时翻译的功能,好像不是那么好做。而且大多数处于局域网内,所以访问在线的api也显得比较尴尬。于是,就有了以下这篇文章,自己搭建一套简单的离线翻译系统。以下内容采用python提供基础翻译服务+ C#访问服务的功能,欢迎围观。
1116 0
【Python+C#】手把手搭建基于Hugging Face模型的离线翻译系统,并通过C#代码进行访问
|
4月前
|
API C# 数据库
SemanticKernel/C#:实现接口,接入本地嵌入模型
SemanticKernel/C#:实现接口,接入本地嵌入模型
92 1
|
4月前
|
API C#
SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景
SemanticKernel/C#:使用Ollama中的对话模型与嵌入模型用于本地离线场景
111 0
|
算法 C# 决策智能
运筹优化学习16:【电招问题】Dial-a-Ride问题模型及C#实现的VNS程序
运筹优化学习16:【电招问题】Dial-a-Ride问题模型及C#实现的VNS程序
运筹优化学习16:【电招问题】Dial-a-Ride问题模型及C#实现的VNS程序
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
C#编程-64:ADO.NET对象模型复习笔记
161 0
C#编程-64:ADO.NET对象模型复习笔记
|
SQL 数据库
C#_使用ADO.NET实体模型与数据库进行快速连接
C#_使用ADO.NET实体模型与数据库进行快速连接,实现增、删、改、查操作
454 0
|
C#
一起谈.NET技术,浅谈C#中的延迟加载(3)——还原模型的业务规则
  上一篇文章讲到把实体类中需要实现延迟加载的属性声明为virtual,然后继承实体类做一个子类,在子类里面实现该属性,配合使用委托来实现比较完美的延迟加载(原本的模型层依旧保持在最底层用于贯穿三层结构,同时又可以实现在实体类的属性里面访问到比他高层的数据访问层)。
977 0