《c# 实现p2p文件分享与传输系统》 二、 设计
c#实现P2P文件分享与传输系统
二、设计
在上一篇文章中,介绍了P2P网络的常用模型,并确定了EasyP2P系统的框架,本文将就此设计完成它的主要结构和运作流程。
1. 首先是Tracker Server和Peer这两个最重要的模块:
- Tracker Server负责Peer的信息的收集和跟踪,并向下载节点提供其他节点的信息,实际上就是维护“Peer<-->Resource”之间的这种映射关系,一般来说,在数据结构上,可以把它设计成一个十字链表,当然,也可以用其他结构。当Peer启动时,向Tracker Server进行汇报,Tracker将信息存入映射表,当Peer退出时,从映射表中清除。
- Peer主要是驱动下载,当需要下载资源时,向Tracker Server提交要下载的资源信息,Tracker查询之后,返回拥有该资源所的节点列表,Peer便可向其他的节点请求并下载数据,完成p2p下载。
上图:

2. 文件描述
P2P系统另一个非常关键的部分就是资源(文件)描述符,它提供某个资源(文件)的简短而详细的描述信息。
- 首先,一个资源需要进行标识,以区别于其他资源,每个不同的资源都有不同的标识,这里,我们以资源的MD5值来作为该资源的标识(ID)。计算方式是:ID = MD5Hash(资源的所有数据)。
- 其次,为了支持断点续传以及利于p2p传输,需要对资源进行分块描述。一个完整的资源(文件)可以从逻辑上分为多个“块”,通过对“块”的标志,可以从更细的粒度来描述资源健康程度(也就是下载进度);通过对每个“块”进行校验,还能从更细的粒度防止脏数据对p2p网络的污染。
之所以说文件描述非常重要,是因为它几乎贯穿了整个p2p传输的过程。一个设计良好的文件描述符,不仅可以详细的标识资源健康度,还能够通过适当的压缩算法节省存储空间。

在上图中,我设计了一个双层的文件描述符,Segment层描述整个资源/文件,用于数据校验;Piece层描述一个Segment,用于细化描述。这样做的好处有两个:一是简化了校验信息的粒度,在peer之间只需要传递segment的描述即可;二是由于我们只需要对正在下载的Segment进行描述,因此文件描述符不会占用多少存储空间。
考虑到NAT Server的特殊性,将单独介绍。
文章版权所有,如需转载,请注明作者和出处,谢谢~
《c# 实现p2p文件分享与传输系统》 二、 设计的更多相关文章
- 《c# 实现p2p文件分享与传输系统》 二、 设计 - 续(NAT穿透)
c#实现P2P文件分享与传输系统 二.设计 - 续(NAT穿透) 首先要抱歉,因为这些日子较忙,没有写文章,这个系列拖了很久,现在开始继续. 上一篇文章介绍了p2p系统Tracker Server和 ...
- 《c# 实现p2p文件分享与传输系统》 一、 模型
c#实现P2P文件分享与传输系统 一.模型 P2P的概念大家都不陌生,也就是所谓的“点对点传输”,即不直接通过服务器,在两台或多台客户端之间传输数据,实现信息交流和资源共享.P2P技术已经发展了很多年 ...
- llinux 目录结构 及Linux文件分享
llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...
- AngularJs的UI组件ui-Bootstrap分享(十二)——Rating
Rating是一个用于打分或排名的控件.看一个最简单的例子: <!DOCTYPE html> <html ng-app="ui.bootstrap.demo" x ...
- NAT穿透进行P2P文件传输
实现一个简单的p2p文件传输,主要解决NAT穿透问题,使用tcp协议传输. NAT背景介绍 简介 NAT(Network Address Translation ,网络地址转换) 是一种广泛应用的解决 ...
- 树莓派实践部分——P2P文件下载机torrent之Raspberry Pi管理
树莓派实践--P2P文件下载机torrent之Raspberry Pi管理 一.树莓派配置文件共享软件deluge 在进行实践之前,先通过命令sudo apt-get update 和sudo apt ...
- [转]文件IO详解(二)---文件描述符(fd)和inode号的关系
原文:https://www.cnblogs.com/frank-yxs/p/5925563.html 文件IO详解(二)---文件描述符(fd)和inode号的关系 ---------------- ...
- android文件分享在android7.0以上版本报错的解决方案
最近在使用蓝牙进行文件分享时,出现了一个奇怪的问题.同样的代码在android5.1上可以顺利运行,但是在android7.0上就运行失败.出现如下的错误: Caused by: android.os ...
- 海量无损高音质音乐文件分享180TB(持续更新)
海量无损高音质音乐文件分享180TBWAV,flac,ape格式(持续更新),由于本人是音乐发烧爱好者,收集海量的无损音乐,已经分类好了,比较方便查找,但是本地没法存储,所有放在网盘中,并且我这边还会 ...
随机推荐
- 黑帽SEO手法
黑帽SEO手法 0x00:概念 SEO全称搜索引擎优化,通过站内优化和站内优化方式来提升搜索引擎排名,有白帽SEO和黑帽SEO. 因为正规的SEO优化需要很长时间,黑帽SEO手法让站内快速提升排名的有 ...
- jQuery 标签切换----之选项卡的实现
这一次,我自己写了代码,先看html部分: <div class="tab"> <div class="tab_menu"> <u ...
- win7查看端口占用
1.查看谁占用了我们的80端口,在windows命令行窗口下执行: netstat -aon|findstr 80 发现80端口被进程号为2596的进程占用.2.查看占用80端口进程的应用程序是什 ...
- C#中图片.BYTE[]和base64string的转换
在C#中 图片到byte[]再到base64string的转换: Bitmap bmp = new Bitmap(filepath); MemoryStream ms = ...
- SRM 626 D1L1: FixedDiceGameDiv1,贝叶斯公式,dp
题目:http://community.topcoder.com/stat?c=problem_statement&pm=13239&rd=15859 用到了概率论中的贝叶斯公式,而贝 ...
- LoadRunner hits per second 深入理解
Hits per Second Graph The Hits per Second graph shows the number of HTTP requests made by Vusers to ...
- EasyDSS RTMP流媒体服务器web前端:vue组件之间的传值,父组件向子组件传值
之前接触最多的都是EasyNVR,主要针对的都是前端的一些问题.也有接触到一些easydss流媒体服务器. 前端方面的,EasyDSS流媒体服务器与EasyNVR有着根本的不同.EasyNVR使用的是 ...
- 九度OJ 1149:子串计算 (计数、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1026 解决:571 题目描述: 给出一个01字符串(长度不超过100),求其每一个子串出现的次数. 输入: 输入包含多行,每行一个字符串. ...
- 九度OJ 1059:abc (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3642 解决:2869 题目描述: 设a.b.c均是0到9之间的数字,abc.bcc是两个三位数,且有:abc+bcc=532.求满足条件的 ...
- cocos2d-js添加百度appx的插屏广告(通过jsb反射机制)
本来一直用的anysdk接入广告,结果从前几天开始,百度商店的审核总是通不过,结果一问才知道:要上传到百度商店就必须要用百度的appx(真的是各种坑,我们这些个人开发者迟早要被你们大公司玩死),没办法 ...