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的特殊性,将单独介绍。
文章版权所有,如需转载,请注明作者和出处,谢谢~