1、桂林电子科技大学毕业设计(论文)报告用纸 摘 要随着计算机和网络的普及,单独工作、不需要和其他用户交互的软件越来越少,作为一项新兴的网络技术,P2P以其无与伦比的可伸缩性和对资源的利用率吸引着大众的注意。传统C/S或B/S结构,服务器极易成为网络中的瓶颈,当客户端达到一定数量后,系统会无法提供服务。而基于P2P的网络中,每个节点既可以为其它节点提供服务,也可以享受其它节点提供的服务,服务器瓶颈被消除,整个系统的性能得到较大程度的改善。在这样的背景下,本文设计开发了eMule网络文件系统。系统采用P2P网络模型,在整个文件上传与下载过程中客户端不需要任何服务器的支持,并可同时从当前在线的其他多个
2、客户端中下载所需的不同文件数据块,实现了多点上传与下载并行,极大提高了速度。系统分三个模块:本地共享文件信息收集模块,远程数据库操作模块,文件上传下载模块。客户端提供的功能主要包括:文件上传与下载、共享文件模糊查询、文件指纹识别、错误数据恢复、断点续传、流量监控、自动穿透内网、IP和端口探测、单点错误处理等功能。本系统使用了文件指纹识别技术,能有效地监控下载过程中发生的数据错误,并能够检测错误数据恢复是否成功。在进行共享文件查找时,利用文件指纹可以精确的查找到所需的文件,避免文件同名而内容不同的情况。在上传下载过程中,系统使用了自动穿透内网、自动申请端口和磁盘空间、动态调整文件传输包大小、多线
3、程上传下载文件、文件分块、利用内存作下载数据缓存等多种技术。关键词:P2P;NAT;UDP打洞;文件传输AbstractWith the popularization of computer and network, work alone and need not other users interaction software are fewer and fewer, as one new developing network technology, P2P elasticity and utilization ratio in resources attract the masses at
4、tention with a unparalleled one their. Traditional C/S or B/S structure, the network server can easily become the bottleneck, when the client achieve to a certain number, the system will be unable to provide service. In the network based on P2P, each node can no only provide service for other nodes,
5、 but also can receive the service that other nodes offer, then the server bottleneck is eliminated, the performance of the whole system gets the improvement of greater intensity.Under such a background, this text has designed and developed eMule network file system. The system adopts P2P network mod
6、el, the whole file upload and download process of the client without any server support, it can download all kinds of file data blocks from a lot of online client at the same time, achieve a more upload and download missions parallel, greatly enhances the speed.The system is divided into three piece
7、s of module: the local shared information collection module, remote database operation module, the file uploads and downloads the module. The function that the client offers mainly includes: file upload and download, share documents fuzzy inquiry, fingerprint recognition of file, wrong data recovery
8、, the breakpoint transmission, flow control, automatic Intranet puncturing, IP and port detection, single-point error handling and so on.The system uses paper fingerprint recognition technology that can effectively control the process of downloading the data errors, and be able to detect errors and
9、data recovery success. While looking for share file, it can accurately find out the required file by use file fingerprint, and avoid the situation of the same name but different content of the file. In upload and download process, the system has used automatic Intranet puncturing, automatic applicat
10、ion ports and magnetic disc space, dynamic adjustment of file transfer packet size, multithreading upload download files, file block, use memory for downloading data cache and other technologies.Key words: P2P;NAT;UDP Puncture; File Transport目 录引言11 P2P概述11.1 P2P文件传输系统产生的背景21.2 P2P文件传输系统国内外的研究现状21.3
11、 P2P文件传输系统的研究意义21.4 本课题研究的内容32 P2P相关理论32.1 P2P与C/S的比较32.2 P2P的特点32.3 各种P2P模型32.3.1纯P2P模型42.3.2 带有一个简单发现服务器的P2P模型42.3.3 带有发现和查找服务器的P2P模型42.3.4 带有发现、查找和内容服务器的P2P模型42.4 对等点的发现42.4.1 显式点到点配置52.4.2 动态发现模型52.4.3 目录发现模型52.4.4 网状模型52.4.5 多播模型62.4.6 主动搜索模型63 关键技术73.1 P2P穿越73.1.1 当今Internet体系结构73.1.2 NAT83.1.
12、3 UDP打洞83.2 多线程技术103.2.1 线程的组成103.2.2 创建一个线程113.2.3 线程的终止113.2.4 线程的调度113.3 流123.4 文件的分块123.5 多线程文件传输与断点续传133.6 文件MD5校验134 系统总体设计144.1 系统采用的P2P模型144.1.1 客户端与客户端之间的发现154.1.2 客户端向服务端查询数据154.1.3 客户端搜索和下载共享文件154.2 P2P文件传输系统的工作流程164.2.1 客户端上传下载功能的工作流程164.2.2 服务器功能的工作流程164.2.3 客户端指令监视模块的工作流程184.3 系统各组件的联系
13、204.3.1 客户端上传下载模块到服务器的联系204.3.2 客户端上传下载模块到客户端指令监视模块的联系204.3.3 客户端指令监视模块到服务器的联系205 P2P文件传输系统的实现215.1 服务端数据库设计215.2 系统界面设计225.3 客户端各模块设计245.3.1 本地文件信息搜集线程模块245.3.1.1 文件搜索算法245.4 本地共享文件上传线程模块255.4.1在线程中发送数据255.5 数据库操作模块265.5.1数据封装成流265.5.2 解包275.6 上传下载模块285.6.1 文件下载285.6.2 文件上传306 系统安全与测试316.1 系统的威胁评估3
14、16.2 系统测试326.2.1 测试方法326.2.3 测试内容326.2.4 测试结果326.2.5 测试数据32结论34谢辞36参考文献37 桂林电子科技大学毕业设计(论文)报告用纸 第 37 页 共 37 页引言随着技术的不断发展,Internet上出现了各种各样的下载工具,正所谓五花八门,百家争鸣。下载软件虽然很多,但是他们的下载手段大致说来可以分成三大类,最传统的HTTP和FTP下载,刚刚出现没多久然而已经风靡全球的P2P下载。HTTP和FTP是两种网络传输协议的缩写,FTP是File Transportation Protocol(文件传输协议)的缩写,而HTTP则是Hyper
15、Text Transportation Protocol(超文本传输协议)的缩写,它们是计算机之间交换数据的方式,也是两种最经典的文件下载方式。FTP专门用来下载,而HTTP的主要工作是用来浏览网页,不过也能用来下载。这两种下载方式的原理并不复杂,就是用户按照一定的规则(协议)和提供文件的服务器取得联系并将文件搬到自己的计算机中来。FTP下载方式最古老,在没有WWW的日子里,FTP就已经广为使用了。HTTP出现的较晚,但现在也应用的相当广泛。就HTTP、FTP等下载方式而言,一般都是首先将文件放到服务器上,然后再由服务器传送到每位用户的机器上。因此如果同一时刻下载的用户数量太多,势必影响到所有
16、用户的下载速度,如果某些用户使用了多线程下载,那对带宽的影响就更严重了,因此几乎所有的下载服务器都有用户数量和最高下载速度等方面的限制。P2P文件传输是通过一种传销的方式来实现文件共享的,它并不会完全从服务器下载这个文件的所有部分,而是根据实际情况有选择地从其他用户的机器中下载已下载完成的部分,这就大大减轻了P2P文件传输服务器的负荷,也同时加快了下载速度,也就是说每台参加下载的计算机既从其他用户的计算机上下载文件,同时自身也向其他用户提供下载,因此参与下载的用户数量越多,下载速度也越高。文中首先论述了基于P2P网络的文件传输产生的背景和意义,接着介绍了P2P的相关理论知识。然后介绍了本系统的
17、关键技术,包括软件的P2P穿越技术,多线程技术,流,文件分块,MD5校验等内容。接着重点介绍了本系统的总统设计情况,各个模块具体设计情况以及它们之间的联系。最后给出测试本系统的内容和方法和总结,由于篇幅限制,本文提到的部分代码和功能使用说明书将在附件中给出。P2P概述P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。P2P也可理解为“伙伴对伙伴”的意思,或“对等联网”。简单的说,P2P让人们通过互联网直接交互。这样,P2P就是人可以直接连接到其他用户的计算机、交换文件,而不是像过去那样连接到服务器去浏览与下载;它改变互联网现在的以大
18、网站为中心的状态、重返“非中心化”,并把权力交还给用户。1.1 P2P文件传输系统产生的背景近年来互联网上对等连接P2P应用发展迅速,MP3和视频文件共享下载的P2P流已经成为宽带用户流量的主体。基于P2P的即时通信和互联网电话(如Skype)发展迅速,对等广播P2P流媒体等正在兴起。P2P协同计算和网格方兴未艾。P2P 应用支持网络通信的对象从人-人,人-机发展到机-机,其应用从家庭网络和传感器/执行器网络到军事上网络中心战/全球信息网格GIG。1.2 P2P文件传输系统国内外的研究现状近年来,随着Napster、KaZaa、BT、eMule这样的基于P2P技术的文件共享软件在 Intern
19、et上迅速传播,P2P技术在国际国内都引发了研究的新热潮。国外开展P2P研究的学术团体主要包括P2P工作组(P2PWG)、全球网格论坛(GGF)以及各高校的研究小组。P2P工作组成立的主要目的是希望加速P2P计算基础设施的建立和相应的标准化工作。P2PWG成立之后,对P2P计算中的术语进行了统一,也形成了相关的草案,但是在标准化方面工作进展缓慢。目前P2PWG已经和GGF合并,由该论坛管理P2P计算相关的工作。GGF 负责网格计算和P2P计算等相关的标准化工作。从国外公司对P2P计算的支持力度来看,Microsoft公司、Sun公司和Intel公司投入较大。 Microsoft公司成立了Pas
20、try项目组,主要负责P2P计算技术的研究工作,目前开发了基于Pastry的多种应用,包括SCRIBE、 PAST、SQUIRREL等。在新一代的Windows Vista操作系统中,也增加了最新的P2P研究成果来支持协同工作。2000年8月,Intel公司宣布成立P2P工作组,正式开展P2P的研究。工作组成立以后,积极与应用开发商合作,开发P2P应用平台。2002年Intel发布了. Net基础架构之上的Accelerator Kit (P2P加速工具包) 和P2P安全API软件包,从而使得微软. Net开发人员能够迅速地建立P2P安全Web应用程序。IBM公司也开展了基于P2P技术的研究,
21、提出了Smart Networking,另外IBM公司大力支持的网格计算(Grid Computing)与P2P计算在许多方面的研究类似。1.3 P2P文件传输系统的研究意义 P2P技术从根本上颠覆了这一传统模式。新的模式模糊了服务提供者与使用者的界限,甚至不再有传统意义上的服务器,服务提供者的作用大为减弱。尽管集中化服务器能以并行方式处理请求,但每个服务器的负载都有一个特定的数值,超过这个数值之后,服务器的处理速度会非常之慢,甚至崩溃。通常情况下,解决集中化系统瓶颈问题的指导思想是“买性能更好”的硬件。然而,这只是一种暂行的办法,不是长期的解决方案。将负载分到多台计算机是减少瓶颈和升级系统的
22、流行方法,这也是P2P文件传输系统的研究意义。1.4 本课题研究的内容本课题是一个使用P2P网络模型的文件传输系统,其思想是在不经过固定的服务器作为路由转发的情况下,能够在Internet上任意两台电脑就可以直接通讯。处于不同子网的两台计算机能建立点对点通讯的技术是使用UDP“打洞”。“打洞”技术是穿透NAT的有效方法,也是本毕业设计的关键技术之一。使用UDP“打洞”让两个处于不同子网的客户端能够使得远程数据传输成为可能。文件传输是将一个文件切割为若干小块,并且附加一些相关消息,传输给远程用户,当远程用户接收到这些被切割成小块的文件碎片后,将这些文件碎片重新按一定的顺序组合起来,生成一个新的文
23、件。2 P2P相关理论2.1 P2P与C/S的比较l 集中。计算能力,信息和数据都集中在服务器端。l 服务器及网络的带宽决定了性能。每台服务器所能提供的信息数量受到自身存储空间的限制,而任意时刻它所能支持的客户端访问数量则既受到自身处理能 力的限制也受到服务器所在网络吞吐能力的限制。l 被发布信息的分布与生存期十分稳定。服务器只发布机器所有者想公之于众的信息,这些信息将会在该服务器上稳定地保存一段时间,并且该服务器通常也不间断地运行在网络上。l 被发布信息的存贮与管理比较集中、规范。互联网上所有可以公开访问的信息基本上都保存在服务器上,服务器根据适当的算法和规则管理本地信息,应答客户端的访问请
24、求或进行计算。2.2 P2P的特点l 每一个对等点具有相同的地位,既可以请求服务也可以提供服务,还可以具有路由器和高速缓冲存储器的功能,从而弱化了甚至取消了服务器的作用。l 每一个对等点可以充分利用网络上其他对等体的信息资源、处理器周期、高速缓存和磁盘,各种资源都得到了较充分,均衡的利用。l 每一个对等点可以随意地加入或退出网络。2.3各种P2P模型l P2P模型可以分为以下几个种类:l 纯P2P模型l 带有一个简单的发现服务器的P2P模型l 带有发现服务器和查找服务器的P2P模型l 带有发现服务器、查找服务器和内容服务器的P2P模型2.3.1纯P2P模型 纯P2P模型完全依赖于计算机(C/S
25、模型中的客户)。这似乎是矛盾的,因为每个网络模型都像传统的C/S模型一样涉及到客户和服务器,但是纯P2P模型不依赖任何中心服务器而工作。一旦 P2P应用程序下载到计算机的内存中,网络中的端就动态地发现其他连接的端,相连端之间的通信完全不需要来自服务器的任何帮助。我们所说的传输数据就是通过通信来下载和上载文件、执行在线活动、发送请求和接收响应等等。2.3.2 带有一个简单的发现服务器的P2P模型 这个名称暗示了这种模型的结构,这样的P2P模型实际上不包括一个服务器,为了实现一些管理,这种模型中服务器的作用已经下降。服务器的作用限于为正在加入的端提供已经连接端的名字,正在加入的端通知服务器它已经登
26、录了。一定要注意服务器仅仅是提供相连端的清单来辅助端,建立连接和通信仍然是端之间的事情。这样的P2P模型通过提供给端一系列已经相连端的清单而超出纯P2P模型,这样增加了发现网络上大量端的机会。为了下载资源,端必须单独与每个相连端接触并发出请求,这样会消耗大量的处理时间。2.3.3 带有发现和查找服务器的P2P模型这种模型中,服务器用来提供相连端的清单和它们的可用资源。因此,这种模型为增强服务器的功能而继承了纯P2P和带有简单发现服务器的P2P两者的特性。这种模型减轻了端的负担,因为不再需要通过访问每个端来查找必要的信息。这种模型中的服务器初始化两个端间的通信,然后,这两个相连的端建立通信、保持
27、连接并执行各种活动,例如登录进人相连端的信息数据库,进入它们共享资源目录等等。2.3.4 带有发现、查找和内容服务器的P2P模型这种模型中,服务器占有支配地位,正如在传统的客户/服务器体系中一样。所有满足端请求的部分都从端的范围内移出而进人服务器的范围。同样,端之间不允许直接互相连接,因为所有的资源都存储在中心服务器的数据库中。如果一个端需要信息,它直接访问服务器而不是和另外的端通信,服务器处理这些请求并显示信息来源。这种模型主要的缺点在于如果同时有太多的请求,服务器的速度会减慢;这种模型的另一个缺点就是成本很高,因为服务器必须自己管理、存储数据并处理所有的请求。2.4 对等点的发现由于 P2
28、P网络中每一个对等点可以随意地加入或退出网络,P2P网络中一个重要的问题就是对等点的发现问题:一个对等点如何知道其他对等点的存在并获得它们的地址从而能与它们通信。就目前来说,对等点的发现主要靠如下方法:2.4.1 显式点到点配置显式点到点配置与其说是一种发现机制,还不如说是一种用来避免实现发现的机制。每个存在的对等点都知道其它对等点的地址。一般而言,分布式应用程序中节点的显式点到点配置不能很好地扩展到具有较多节点的大型网络。那就是为什么分布式计算应用程序和技术大多包含命名和定位功能。这也解释了为什么域名系统(DNS)最终取代了用于机器命名的主机文件(hosts file)机制。维护主机文件是单
29、调乏味、容易出错的,并且一般来说,很难方便地在大型网络环境下运转。但是,显式点到点配置并非一无是处。点到点寻址缺乏灵活性的特性也带来了一定程度的安全性。通过对网络中的每个对等点预先设置它所知道并且将要与之交互的对等点列表,使得网络在外部攻击面前表现得很稳固。2.4.2 动态发现模型 与显式点到点配置方法的静态特性截然相反,目录服务模型和网状模型具有动态特性。这些模型通常更适用于P2P应用程序,以下在讨论三种机制的基础上提出一新的方法。对等点通过这些机制动态地定位其它对等点和了解它自身所属的环境。2.4.3 目录发现模型 在目录服务模型中,一台或多台有特殊用途的服务器为对等点提供目录服务。对等点
30、向目录服务注册关于自身的信息(其名称、地址、资源和元数据),并通过目录服务器定位其它对等点。 基于P2P的应用中使用目录模型的最典型的代表是Napster。在Napster中,采用集中式管理目录。虽然,采用集中式管理的目录服务模型被认为“本质上非P2P” ,但它确实有一个很大的优势:集中式管理使它容易确保服务器硬件和配置能足以达到服务质量目标且易于管理。DNS可以被认为是分散式目录的一个优秀的示例。与因特网本身相似,DNS设计为甚至在部分网络受到严重破坏的情况下仍能工作。DNS目录采用层次化结构,根目录代表顶级域(譬如com) ,它将子域查询服务(如“etcee_com”这样的域)的任务委派到
31、下一层次的DNS服务器。2.4.4 网状模型 基于网状模型P2P应用系统中,有很多对等点(通常是动态的)。没有一个对等点知道整个网络的结构或者组成网络的每个对等点的身份。相反,对等点只知道直接与它们通信的对等,各点对等点必须合作完成任务。在许多环境中这种合作包括支持分布式查询、分布式消息传递,甚至包括认证和授权行为。因为涉及通信量的多少,文件传输这样需要大流量的网络操作通常在对等点间直接发生,而消息的传递则在网络中经过其它对等点传递。2.4.5 多播模型 由于多播模型和网状模型很相似。这种模型利用网络自身提供的特性来定位和确认对等点和资源。这种技术的实现使用IP多播来实现查询。 不像单播IP数
32、据报(一台主机最多只能向一台主机发送数据报),多播IP数据报可以同时发往多台主机。更重要的是,发送方不必知道有多少接收方存在或者究竟有没有接收方存在。发送主机只是封装消息并将它发布到网络上。符合某些条件(TP地址和端口号)的客户机将接收到该消息的一个副本。 使用IP多播技术的发现通过让对等点用多播定期宣布自己的存在来工作。该消息包含对等点的TCP/IP主机名和端口号。对此消息感兴趣的对等点检测这个消息后,抽取出主机名和端口号,并使用这个信息与新对等点建立正常的TCP/IP连接。 这就是多播是如何在单个子网上工作的。众多子网(组成整个网络)间的路由多播通信是完全不同的,并且是一个非常复杂的课题。
33、这也是基于IP多播的发现的局限所在。没有路由器的支持,基于IP多播的发现被局限在同一子网上的对等点之间。基于安全性考虑,因特网对多播并不友好。2.4.6 主动搜索模型 目录服务模型和网状模型均或多或少的依赖于服务器的参与,若这些服务器均出现故障,整个应用系统将无法工作。多播模型虽然可以做到完全不需要服务器的参与,但该模型依赖于IP多播。绝大部分路由器不支持IP多播,因此该模型在Internet中并没有多大实用价值。该文分析以上模型的优缺点的基础上提出了主动搜索模型。该模型基本原理如下:每个欲加入的对等点主动在网络上扫描搜索己经存在的结点,若扫描到其它对等点,则对等点之间互相交换自己所知道的其它
34、对等点的地址。该方法理论上能做到完全不需要任何服务器的存在,但要在Internet中扫描搜索其它存在的对等点就像大海捞针一样困难,因此必须设法减少搜索的范围,主要采用如下一些策略来减少扫描工作量和网络带宽占用:l 优先在自己所处的网段搜索。l 记录加入到网络中所知道的其它对等点的地址,以后每次扫描时,优先扫描这些地址。l 优先扫描以前知道的对等点的地址所处的网段。l 若某对等点发现另外某些对等点长期稳定地存在于网络中,则在网络中散布(各对等点互相转告)这些地址。这将导致这些对等点知道很多其它的对等点地址,且以后扫描时,也优先扫描这些稳定存在的对等点的地址,这样将大大减少对等点在网路中搜索其它对
35、等点时的盲目性。 该模型尤其适合只在某些区域网(如校园网,企业内部网)内部使用的P2P应用,在这些场合可以完全做到不需要任何服务器的存在就能发现其它的对等点且是实用的。3 关键技术3.1 P2P穿越3.1.1 当今Internet体系结构在Internet最初的体系结构中,每个结点都有一个全局唯一的IP地址,能够直接相互通信。但是这个结构已经不复存在了,取而代之的是结构包含了一个全局地址空间和许多私有地址空间,它们由中介设备连在一起。这个新的地址体系结构如图3-1所示,仅在“主”全局地址空间中的节点才可以容易的从网络中其他地方连接到,因为仅它们拥有唯一的、全局可路由的IP地址。私有网络中的节点
36、可以连接到在相同私有网络中的其他节点,可以连接到全局地址空间中的节点。路径上的NAT为外出的连接申请临时的公共终端,转化组成这些会话的封包中的IP地址和端口号。 图3-1公有IP地址和私用IP地址Internet新的地址结构适合典型的客户/服务器通信,但是它给两个在不同子网中的节点直接相互通信带来了困难,这种点对点的直接互联是实施P2P通信协议的基础。我们要做的是寻找一种方法,来使P2P通信协议在NAT存在的情况下也能够正常工作。3.1.2 NAT NAT英文全称是“Network Address Translation”,中文意思是“网络地址转换”,它是一个IETF(Internet Eng
37、ineering Task Force, Internet工程任务组)标准,允许一个整体机构以一个公用IP(Internet Protocol)地址出现在Internet上。顾名思义,它是一种把内部私有网络地址(IP地址)翻译成合法网络IP地址的技术。 NAT 最初的目的是为使用内网IP地址的计算机提供通过少数几台具有公网的IP地址的计算机访问外部网络的功能。NAT 负责将某些内网IP地址的计算机向外部网络发出的IP数据包的源IP地址转换为NAT自己的公网的IP地址,目的IP地址不变, 并将IP数据包转发给路由器,最终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换为
38、内网的IP地址,源IP地址不变,并最终送达到内网中的计算机。随着网络的普及,IPv4的局限性暴露出来。公网IP地址成为一种稀缺的资源,此时NAT 的功能局限也暴露出来,同一个公网的IP地址,某个时间只能由一台私有IP地址的计算机使用。于是NAT应运而生,NAT实现了多台私有IP地址的计算机可以同时通过一个公网IP地址来访问Internet的功能。这在很大程度上暂时缓解了IPv4地址资源的紧张。NAT负责将某些内网IP地址的计算机向外部网络发出的TCP/UDP数据包的源IP地址转换为NAT自己的公网的IP地址,源端口转为NAT自己的一个端口。目的IP地址和端口不变, 并将IP数据包发给路由器,最
39、终到达外部的计算机。同时负责将外部的计算机返回的IP数据包的目的IP地址转换内网的IP地址,目的端口转为内网计算机的端口,源IP地址和源端口不变,并最终送达到内网中的计算机。在我们的工作和生活中, NAT的作用随处可见,绝大部分公司的网络架构,都是通过1至N台支持NAT的路由器来实现公司的所有计算机连接外部的Internet网络的。通过NAT 上网的特点决定了只能由NAT内的计算机主动向NAT外部的主机发起连接,外部的主机想直接和NAT内的计算机直接建立连接是不被允许的。IM(即时通讯)而言,这意味着由于NAT内的计算机和NAT外的计算机只能通过服务器中转数据来进行通讯。对于P2P方式的下载程
40、序而言,意味着NAT内的计算机不能接收到NAT外部的连接,导致连接数用过少,下载速度很难上去。因此P2P软件必须要解决的一个问题就是要能够在一定的程度上解决NAT内的计算机不能被外部连接的问题。3.1.3 UDP打洞不同子网中主机间建立点对点通信的最有效的方法之一是“打洞”。这个技术广泛应用在基于UDP的应用程序中,但是,从本质上来说,相同的技术也应该支持TCP。从名称上看,“打洞”好像危及到了私有网络的安全,事实并不是这样。打洞使应用程序在大多数NAT默认的安全策略下就可以发挥作用,它有效地告诉了路径上的NAT“点对点通信会话是被恳求的(被你的网络中的主机邀请来的),应该被接受”。打洞过程假
41、设A和B两个客户都与中心服务器S有活动的UDP会话。当客户向S注册时,S纪录下客户的两个终端 :此客户认为它自己正使用的(IP地址,端口号)对和服务器认为这个客户正使用的(IP地址,端口号)对。第一个对称为客户的私有终端,第二个称为客户的公共终端。客户在向服务器注册时可以将自己的私有终端发送给服务器,让服务器纪录下来,服务器接收到注册信息之后,又可以从注册消息的IP头和UDP头的源IP地址和源UDP端口域得到客户的公共终端。本系统客户A想要与客户B直接建立UDP会话,打洞过程如下。(1)A初始情况下不知道如何到达B,因此,A请求S帮助它与B建立UDP会话。(2)S使用包含B的公共终端和私有终端
42、的消息相应B。同时,S使用自己与B的UDP会话向B发送连接请求信息,这个消息包含A的公共终端和私有终端。一旦这些消息到达,A和B就会知道对方的公共和私有终端。(3)当A从S接收到B的公共和私有终端时,A就向这两个终端发送UDP封包,随后,“锁住”首先引出B响应的终端。同样,当B接收到A的公共和私有终端时,B就在这两个终端上向A发送UDP封包,锁住首先响应的终端。ABNAT A(10.0.1.1)NAT B(10.0.1.2)Session A-S18.181.0.31:1234155.99.25.11:62000Session B-S18.181.0.31:1234155.99.25.11:6
43、2005NAT C(155.99.25.11)服务器S(18.181.0.31)向A发送B的终端155.99.25.11:6200510.1.1.3:4321向B发送A的终端155.99.25.11:6200010.0.0.1:4321客户A(10.0.0.1)服务器S(18.181.0.31)客户B(10.1.1.3)Session A-S18.181.0.31:1234155.99.25.11:62000Session B-S18.181.0.31:1234155.99.25.11:62005Session A-S18.181.0.31:123410.0.1.1:45000Session
44、B-S18.181.0.31:123410.0.1.2:55000Session A-S18.181.0.31:123410.0.0.1:4321Session B-S18.181.0.31:123410.1.1.3:4321NAT C(155.99.25.11)NAT A(10.0.1.1)NAT B(10.0.1.2) 图3-2 打洞之前 图3-3 打洞过程客户A(10.0.0.1)客户B(10.1.1.3)服务器S(18.181.0.31)Session A-S18.181.0.31:1234155.99.25.11:62000Session B-S18.181.0.31:1234155
45、.99.25.11:62005Session A-S18.181.0.31:123410.0.1.1:45000Session B-S18.181.0.31:123410.0.1.2:55000Session A-S18.181.0.31:123410.0.0.1:4321Session B-S18.181.0.31:123410.1.1.3:4321NAT C(155.99.25.11)NAT A(10.0.1.1)NAT B(10.0.1.2)图3-4 打洞之后3.2 多线程技术3.2.1 线程的组成线程有两部分组成。 1一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统
46、用来存放线程统计信息的地方。 2另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。 进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空间。这些线程能够执行相同的代码,对相同的数据进行操作。这些线程还能共享内核对象句柄,因为句柄表依赖于每个进程而不是每个线程存在。线程是一种操作系统对象,它表示在进程中代码的一条执行路径。在每一个Win32的应用程序中都至少有一个线程,它通常被称为主线程或默认线程。在应用程序中也可以自由地创建别的线程去执行其他任务。线程技术使不同的代码可以同时运行。当然,只有在多CPU的计算机上,多个线程才能够真正地同时运行。在单个CPU上,由于操作系统把CPU的时间分成很短的片段分配给每个线程,这样给人的感觉好像是多个线程真的同时运行,他们只是“看起来”同时在运行。3.2.2 创建一个线程每个线程必须拥有一个进入点函数,线程从这个进入点开始运行。线程函数可以使用任何合法的名字。可以给线程函数传递单个参数,