P2P的毕业设计报告.docx
- 文档编号:23092203
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:67
- 大小:619KB
P2P的毕业设计报告.docx
《P2P的毕业设计报告.docx》由会员分享,可在线阅读,更多相关《P2P的毕业设计报告.docx(67页珍藏版)》请在冰豆网上搜索。
P2P的毕业设计报告
1绪论
1.1论文课题概述
1.1.1课题背景
可以说文件交换的需求直接引发了P2P技术热潮。
在传统的WEB方式中,要实现文件交换需要服务器的大力参与,通过将文件上传到某个特定的网站,用户再到某个网站搜索需要的文件,然后下载,这种方式的不便之处不言而喻。
电子邮件是方便了个人间文件传递问题,却没法解决大范围的交换。
这也是WEB的重要缺陷,P2P就是在情况下横空出世。
P2P很好的解决了传统的C/S模式下瓶颈问题,让资源共享变的更方便,快捷。
用户直接和用户之间进行数据交换,改变了传统的模式。
1.1.2课题目的和意义
本课题最终成果是完成一个基于P2P的文件共享系统。
该系统可以发现网络上的共享资源,并根据自己的需求下载自己需要的资源。
在传输过程中还要保证数据传输的完整和安全。
本课题的基础是文件共享和P2P理论,涉及到知识管理、计算机网络、分布式存储和心理学等领域相关理论。
针对不同的应用需求,人们提出了许多共享方式,以不同的方式来共享不同的内容以满足人们的需求。
但是这些方法都不够全面,没有提出很好的文件共享模式,更加没有很好的解决文件共享的需求。
特别是在信息飞速增长的年代,人们对于信息的筛选即真正知识的共享的需求越来越强烈,而人类社会发展至今,亦未能找到很好的文件共享的模式和手段。
在理论上,本课题探寻文件共享的基础理论——知识管理理论、计算机网络、分布式存储和心理学——中相关研究成果的新结合点,研究在现有理论基础上如何更好的满足人们文件共享的需求,采用分布式、高效的基于P2P技术构建的文件共享网络这种文件共享模式,并明确提出了P2P文件共享网络的整个架构,同时,提出了一个P2P环境下维护数据一致性和可用性的算法;在实践上,课题要实现了一个简单的P2P知识共享网络的框架,给出了原型实现,经过小范围的实验和部署,能够证明P2P文件共享网络能够提供很高的可用性,并且文件共享的效果也应该很好。
此外,通过编写此系统,我又进一步熟悉了网络体系结构,TCP/IP协议的知识,熟练掌握了Socket编程,MFC编程,多线程编程,掌握了利用VC++进行网络开发的过程和步骤,为今后从事软件行业奠定了基础。
1.2论文内容概述
论文主要论述P2P文件共享的相关的理论知识,工作原理,编程思路,以及具体实现细节。
当实现同一种功能有多种方法时,对这些方法进行了比较,并说明选用该方法的理由。
论文分以下几个部分:
第一部分是简要介绍所选课题;第二部分是系统可行性研究;第三部分是论文所用到的一些理论知识概述;第四部分是系统概要设计;第五部分是系统详细设计;第六部分是系统测试和实现。
最后对系统的设计进行了总结。
英文翻译、参考文献和致谢词是整个论文的结束。
2系统可行性研究
2.1系统可行性分析
可行性分析[1]包括两个部分:
分析建立新系统的必要性和可能性。
分析建立系统的必要性时要注意用户提出的理由是否充分和合理。
分析建立系统的可能性主要包括经济可行性、技术可行性和运营可行性等。
2.1.1系统设计的必要性
现代社会网络已经成为我们生活中的一部分,针对不同的应用需求,人们提出了许多共享方式,以不同的方式来共享不同的内容以满足人们的需求。
但是这些方法都不够全面,没有提出很好的文件共享模式,更加没有很好的解决文件共享的需求。
特别是在信息飞速增长的年代,人们对于信息的筛选即真正知识的共享的需求越来越强烈,而人类社会发展至今,亦未能找到很好的文件共享的模式和手段。
本论文结合P2P文件共享的原理,利用VC++工具编写一个P2P系统,不仅实现了文件共享的目的,而且锻炼了自己的编程能力和动手能力,更重要的是有自己学习的满足感,及由此而带来的成就感。
此外,毕业设计也是大学生在校的一个必修环节,所以无论从主观上还是客观上,设计此系统都是必要的。
2.1.2设计系统的可行性
分析建立系统的可行性包括经济可行性、技术可行性和运营可行性,法律可行性。
经济可行性:
与请求别人帮助设计相比,省去一笔费用和沟通时间。
技术可行性:
使用VisualC++作为开发工具,利用MFC进行编程,便于高效开发GUI应用程序,ClassWizard使得消息映射简便易行,文档/视结构轻松处理和更新数据。
在此集成开发环境下,开发Windows应用程序是一件比较容易的事情。
运营可行性:
此扫描系统软件可以用于商业销售,为作者赢取部分收入。
法律可行性:
此系统是应毕业设计的要求而开发的,以后也只是用于个人或正当的商业活动,不会触犯法律。
经分析,本系统是可以进行开发和研究的。
3相关理论和技术
3.1网络协议
3.1.1TCP协议
TCP[2]协议(TransferControlProtocol)即传输控制协议,它为网络应用程序提供面向连接的可靠的传输服务,工作在网络体系结构中的传输层。
TCP在数据传输之前首先要利用三步握手协议建立连接,并且提供了分组编号,数据校验和重传机制,确保数据传输的正确无误。
3.1.2UDP协议
UDP[2]协议(UserDatagramProtocol)即用户数据报协议,它为网络应用程序提供无连接的数据传输服务,和TCP协议一样,也工作在网络体系结构的传输层。
UDP在数据传输之前不需要建立连接,数据准备好就直接发送出去,不能保证分组准确到达目的地。
然而由于没有三步握手和数据重传操作,传输比较方便。
3.1.3IP协议
IP协议(InternetProtocol)即互联网协议,它被用于异构网络的互联,是各种各样种类繁多的网络的粘合剂,工作在网络体系结构的网络层,为传输层提供独立于网路的分组路由服务。
每一台连在网络上的主机都会分配到一个IP地址,用以在网络上标识这台主机。
3.1.4ICMP协议
ICMP[2]协议(InternetControlManagementProtocol)即互联网控制报文协议。
是IP协议的附属协议,主要负责在主机之间,主机与路由器之间传递差错信息或者其它需要需要注意的信息。
3.1.5说明
对于从源主机将数据传输到目的主机来说,IP地址和物理地址是必需的。
但是数据到达目的主机并不是在互联网上通信的目的。
互联网上数据通信的最终目的是提供端到端的数据传输,即使一台主机上的某个进程能够和另一台主机上的某个进程进行通信。
然而主机上通常有很多网络应用进程,怎样去区别呢?
传输层提供了一种方法:
凡是利用传输层进行通信的进程都被唯一地分配了一个16位的标识,称为端口号(Port)。
这样,借助于IP地址和端口号,就可以在网络上唯一地表示一个进程了,进而完成进程之间的通信。
所以,一个端口就是一个潜在的通信通道,也是一个潜在的入侵通道,对目标计算机进行端口扫描可以得到许多有用的信息。
3.2Socket套接字
3.2.1套接字概述
网络层为我们提供分组路由服务,传输层为我们提供数据传输服务,那么我们怎样在应用程序中利用这些服务呢?
答案是使用套接字[4]。
套接字是一种网络编程界面,它方便了我们使用网络传输服务,为我们进行基于网络的应用开发提供了一整套编程接口。
套接字是网络的基本构件,是可以被命名和寻址的通信端点,使用中的每一个套接字都有其类型和一个与之相连的监听进程。
套接字存在于通信区域(通信区域又称地址簇)中。
套接字只与同一区域中的套接字交换数据(跨区域时,需要执行某和转换进程才能实现)。
Socket包含两个方面的含义:
其一它是由操作系统或外部过程提供的一组网络编程接口函数,是被广泛接受的网络编程方法;
其二它表示一种网络参数,通常将IP地址和网络应用端口的结合称作Socket(插口)。
3.2.2WindowsSockets基础
WindowsSockets(套接字)是在Windows下的一套开放的、支持多种网络协议的、二进制兼容的网络编程接口规范。
WinSock(WindowsSockets简写为WinSock。
)的目的是抽象隐藏网络底层细节,它独立于底层的协议,编程人员无需精通网络和协议的细节,即可实现网络编程。
使用WinSock的应用程序可以在遵从WindowsSocketsAPI的任何网络上进行通信。
每个socket都有一个类型,它是根据用户可见的通信特征进行描述的。
一般应用程序只在同一类套接字间通信。
不过只要它依据的协议支持,也完全可以在不同类型的套接字间通信。
在WinSock1.1只支持两种socket类型:
#defineSOCK_STREAM1/*streamsocket*/
#defineSOCK_DGRAM2/*datagramsocket*/
使用最多的是SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
(1)流式套接字(Streamsockets)
它适用于没有记录边界的字节数据流,保证分组投递(delivered)、顺序正确并且没有重复分组。
一般用于TCP协议。
(2)数据报套接字(Datagramsockets)
它支持面向记录的数据流,但不保证分组投递、不保证顺序、可能有重复分组。
一般用于UDP传输协议中。
在Winsock2.1以后添加了对原始套接字的支持:
#defineSOCK_RAW3/*raw-protocolinterface*/
通过使用原始套接字我们可以从网络接口捕获到原始的数据包,从而可以对感兴趣的数据做出自己的处理,或者自己构造原始数据包发送到网络上。
在本系统程序中就利用WinSock库创建原始套接字,以实现对局域网的监听。
关于进程是如何利用套接字进行通信的,见图3.1。
图3.1套接字的使用
3.3数据库编程
常见的DBMS(数据库管理系统)有SQL2000,Oracle,Sybase,Access等。
其中的前三个都是属于大型数据库管理系统,用于大量数据的管理,Access数据库比较适用于小型数据的管理。
所以在本扫描系统的实现中选用了与Access数据库建立连接。
然而,要是应用程序中直接与DBMS打交道,将会面临数据库类型的多样性所导致的编程的繁琐。
面对不同类型的数据库,微软提供了ODBC数据库接口,用来以一种统一的方式处理与所有的数据库的连接。
这里我们就要用ODBC与Access数据库建立连接
使用ODBC连接数据库如图3.2所示:
图3.2ODBC访问数据库
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。
这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。
在ODBC中,ODBCAPI不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。
驱动程序管理器负责将应用程序对ODBCAPI的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
由于是采用MFC编程,而在MFC的ODBC类对较复杂的ODBCAPI进行了封装,提供了简化的调用接口,从而大大方便了数据库应用程序的开发。
程序员不必了解ODBCAPI和SQL的具体实现细节,利用ODBC有关的类即可完成对数据库的大部分操作。
3.4多线程编程
3.4.1一些概念
进程。
进程是操作系统分配资源的基本单位,是程序运行的一个实例,它是动态的。
每个进程都在各自的私有地址空间中运行,进程之间是不能直接进行通信的。
线程。
线程是操作系统分配CPU资源的基本单位,即是系统中最小的执行单元。
线程运行于进程空间之中,一个进程中可以有多个线程,且共享进程地址空间,所以线程之间的通信是比较方便的。
然而也正是这种便捷,再加上线程的并发运行,使得线程之间的互斥成为必要。
进程只是线程的容器,是线程执行的环境。
它本身是不活泼的,它必须有一个在它的环境中运行的线程,此线程执行进程地址空间中的代码。
3.4.2线程互斥
线程由于共享进程地址空间,从而共享进程资源,对于一些资源,一次只能有一个线程进行访问,称为临界资源。
多线程编程带来的一个问题是线程调度的随机性,执行顺序的不确定性。
所以为了保证线程之间协调工作,必须采用线程互斥[11]技术。
常用的线程互斥手段有以下几种:
(1)关键代码段
用户方式下的一种互斥手段。
关键代码段是指这样一段代码,它可以在代码执行前,独占对某种资源的访问权,即使用资源之前对资源上锁,使用完毕后再对资源解锁,释放资源的使用权。
这是能让多个线程能够“以原子方式”来使用资源的一种方法。
(2)互斥对象
互斥对象属于内核对象的一种。
它能够确保线程拥有对单个资源的互斥访问权。
它包含一个使用计数器,一个线程ID。
ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于说明该线程拥有互斥对象的次数。
首先创建一个互斥对象,然后去申请互斥对象,申请到之后,线程就可以继续运行下去,否则线程就会被阻塞,最后拥有者线程释放互斥对象。
(3)事件对象
事件对象也是一种内核对象。
它包含引用计数,一个用于指定该事件是自动重置还是人工重置事件的布尔值,另一个用于指明该事件是处于未通知还是已通知状态。
事件能够通知一个操作已完成。
有两种类型事件,一种是人工重置事件,一种是自动重置事件。
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。
当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
一般情况下,当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,事件对象使用得最多。
借助于操作系统提供的API,可以很易地改变事件对象的状态。
它的使用方法和互斥对象类似。
3.5MFC编程
本论文设计的P2P文件共享系统采用的编程工具是VC++6.0,基于MFC(微软基础类库)实现。
MFC对象是C++中类的对象,它内部封装了Windows对象,封装了种类繁多的资源句柄。
使用MFC对象进行编程,就像使用C++对象进行编程一样自然,利用面向对象的编程方法,无须为各种句柄所困扰。
AppWizard为我们生成应用程序框架,资源编辑器为我们提供GUI(图形用户界面)设计,这些使得定制一个应用程序外观更为容易。
ClassWizard辅助我们进行消息映射,使得我们的主要精力集中于事务逻辑控制上,消息响应函数的编写上。
文档/视结构把数据和数据操作分离,使得我们处理数据更加方便。
整个MFC框架为我们生成了一个应用程序的轮廓,我们只需要按照需要进行添加或者修改代码即可。
消息是windows编程中一个重要的概念。
程序运行起来之后,就处于消息循环之中,不断地接收消息,响应消息。
消息一般可分为标准消息、命令消息、控件通知消息,而且在MFC中用户还可以自定义消息,自行添加消息映射,这就极大地提高了编程的灵活性。
在做这个扫描和监听程序时,就自定义了许多消息,以协调程序的运行。
正是由于MFC的以上特性,为我们快速开发应用程序提供了可能,所以选择了VC++6.0作为软件开发平台。
4概要设计
4.1程序框架
设计的主要内容是P2P文件共享下载系统,网络中的用户知道其他用户的存在;在现有网络架构的基础上,构建了一个虚拟网络,对互联的各个节点的复杂性进行了抽象,不用考虑现有防火墙、NAT和特定网络服务的缺乏;每个计算机用户既是服务器,也是客户端;各个计算机用户可能形成组,成为一定数据和应用程序运行的共同体。
由于以前只是了解相关内容,现在那些知识是不够用的了。
还有就是功能扩展上,为了不落窠臼,在界面设计,功能上应具有一定的独创性。
文件共享系统是一个在点组中的多个点之间共享内容的系统。
该服务使得Peer可以共享自己的内容以及定位和获取其他Peer上的内容。
不仅为本地Peer管理被共享的内容,并能浏览和下载远程Peer的内容。
共享的内容由一个独一无二的内容ID以及一个内容广告表示,内容广告提供了有关被共享内容的元信息,例如名字、长度、MIME类型以及内容描述。
目前的搜索机制和内容的分发机制不是很强大。
4.2系统软件结构
4.2.1系统一级层次图
有人认为,对等网络是一种分布式动态网络体系结构,网络中的参与者应当动态地共享它们的部分资源(处理器、存储资源、网络带宽、外设、软件资源、服务等等),并且这些资源不需通过中介就能被其他参与者直接访问;从而,网络的参与者既是资源(服务和内容)的提供者,又是资源的消费者。
对等网络又可以细分为两种类型:
“纯粹”的对等网络和“混合”的对等网络。
所谓“纯粹”的对等网络是指在对等网络中,任意一个参与者的加入和退出都不会导致网络整体服务的损失。
所谓“混合”的对等网络是指对等网络中需要一个中心实体来保证网络服务的提供,我们所做的就是一个混合的P2P共享软件,简单描述如下:
图4.1
4.2.2系统二级层次图
图4.2系统层次图
性能:
包括最大下载速率和每个节点可以同时为多少个节点服务,因为下载速率受网络传输速率的影响,所以对每个节点来说必须限制其下载的速率,由于每个节点都是一个服务器,节点的处理能力不能和大型服务器比,处理能力有限,为了保证节点的负载不止过大,必须限制最大的服务对象。
下载速度快、安全性好。
安全与保密要求:
要高,不能轻易被破坏,防止用户的隐私信息被窃听和泄露,对断电、死机、系统崩溃等问题有有力措施以保障数据不受损失。
4.3系统分流程图
系统分流程图中,分别绘制了文件上传,文件下载和网络监听的概要流程图。
但没有包含其下的各子功能的具体实现流程,这些细节将会在详细设计中予以描述,并绘出进一步的流程。
系统分流程图基于各子模块要实现的功能,并且将这些模块再进一步细化,即采用了“自顶向下,逐步求精”的软件设计思路。
当然,由于本系统所要实现的功能比较多,而且各功能之下又细化为许多,所以若是全然绘出,势必会比较臃肿,因此这里只是绘出关键性的环节,
简略地阐述了系统实现的过程。
4.3.1上传模块
如图4.5所示:
图4.5上传模块
4.3.2下载模块
如图4.6所示:
图4.4下载模块
4.3.3P2P文件下载概要流程
调用WINSOCKET编程接口(API),通过利用它下层提供的服务,达到与远程进程交换信息的目的。
架在TCP/IP协议族上的软件要想利用它们提供的服务就必须要有适当的接口,接口一方面向用户程序提供了调用界面(这与操作系统有关),另一方面还要和TCP/IP协议族打交道,利用它提供的服务完成程序的请求。
INTERNET在通讯层次上主要表现在连接的建立上:
一方(服务器端)配置好SOCKET并绑定(BIND)到约定的端口,然后侦听等待连接,另一方(客户端)与建立SOCKET,连接到服务器主机上约定的端口,主动向对方发出连接请求。
服务器端用新建的SOCKET或ACCEPT函数把它与远方的连接起来。
连接建立后双方通过两个SOCKET交换信息,直到最后结束对话。
图4.5
图4.6
本模块的实现输入是:
对方IP和要传输的文件路径;
输出是远方主机的文件下载到本地;
图4.7
图4.8聊天功能概要流程
4.4数据库的设计
之所以选择Access作为系统的后台数据库,一方面由于它良好的性能、稳定性、便于管理和易于开发等优势,另一方面是由此系统所用数据量不大,数据表结构简单。
本系统中,数据库仅用于服务器存储用户相关说明信息,数据表只有两个属性:
用户名和用户地址信息,用户为主属性。
当A用户搜索到的资源在B用户共享中时。
A向服务器中的数据库查找B用户的地址,此时将进行数据库连接和查询,检索操作。
然后A直接和B相连进行文件共享传输。
数据库还应该提供资源的检索,保存索引功能。
5系统详细设计
在详细设计中,将会细致地讨论系统的实现细节、编程中遇到的问题及解决方法,以及多种解决方案中选择某种方案的理由。
此外,本部分中还将进一步论述第三部分,第四部分所涉及到的理论和技术。
首先,在VC++6.0中新建一个工程,命名为IPScan(IP扫描)。
选择单文档结构,视类从CFormView类得到继承。
下面分述:
5.1系统实现中用到的类
CIPScanApp:
AppWizard生成。
应用程序类
CIPScanDoc:
AppWizard生成。
文档类,用于数据的存储和加载。
CIPScanView:
AppWizard生成。
视类,用于对数据进行操作。
这里选择了从CFormView类继承,是为了利用其可以作为容器的功能。
提供了主机扫描的界面。
CMainFrame:
AppWizard生成。
应用程序框架类,表示应用程序框架窗口。
CPortScan:
自定义的类。
继承于CDialog类,用来管理端口扫描界面的对话框资源。
CsnifferNetDlg:
自定义的类。
继承于Cdialog类,用来管理网络监听界面的对话框资源。
CUDP:
自定义的类。
派生于CSocket类,借助于此类中的SendTo()函数来发送消息,且在该类中还重载了OnReceive()函数,用来接收返回的消息,并可以添加自己的处理代码。
CPortRecord:
自定义的类。
继承于CRecordset类,作为一个记录集,用来保存从数据库中返回的结果,以供查询和检索使用。
在建立记录集时,可用利用CRecordset类中的成员函数,结合一些参数构造一个SELECT语句来查询数据源,并用查询的结果创建记录集。
CHyperLink:
添加的类。
该类的主要功能是提供文字超链接,在本程序的关于对话框中,我使用了此类。
可以链接到我的邮箱和个人主页。
NetInfo:
自定义的结构。
该结构主要用于端口扫描中保存一些输入信息,如IP,端口号等。
定义如下:
structNetInfo
{
CStringip;//扫描主机IP地址
intnStartPort;//扫描起始端口
intnEndPort;//扫描终止端口
BOOLisStop;//为false时终止端口扫描线程
};
Iphdr:
自定义的结构。
用于描述IP包头的信息。
定义如下:
typedefstructIphdr
{
unsignedcharh_lenver;//4位版本号+4位首部长度
unsignedchartos;//8位服务类型
unsignedshorttotal_len;//16位总长度字节
unsignedshortident;//16位标识
unsignedshortfrag_and_flags;//3位标志位+13位的分段偏移
unsignedcharttl;//8位生存时间TTL
unsignedcharproto;//8位协议
unsignedshortchecksum;//16位的IP首部校验和
unsignedintsourceIP;//32源地址
unsignedintdestIP;//32位目的地址
}IP_HEADER;
Tcphdr:
自定义的结构。
用于描述TCP包头的信息。
定义如下:
typedefstructTcphdr
{
unsignedshortth_sport;//源端口
unsignedshortth_dport;//目标端口
unsignedintth_seq;//序列号
unsignedintth_ack;//确认号
unsignedcharth_lenres;//4位首部长度+4位保留字
unsignedcharth_flags;//2位保留字+6位标志位
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- P2P 毕业设计 报告