具体实施方式
本发明实施例是一种实现文件加速下载的***及方法,具体的说是一种高速、安全、稳定的文件下载装置***。为了能够更清晰的描述该发明的实现方案,现结合各个附图具体描述如下:
一、***构成:
本发明实施例由互相连接的客户端(Clients)、集中索引服务器(Centralized Index Server)和缓存服务器(Cache Server)三个部分组成,本发明的***架构图请参见图1-1,下面分别进行介绍:
(一)、集中索引服务器(Centralized Index Server)是为用户点对点(P2P,Peer to Peer的简称,即用户和用户之间直接传递信息,而不是通过第三方中转)文件下载提供索引服务的服务器。它的主要功能是将文件信息、文件块的信息、用户信息集中管理起来,并为客户端提供优化的下载源,这样避免了现有技术中由于“种子”缺失,造成可能的下载空档的问题,保证了文件源的稳定性。
集中索引服务器(Centralized Index Server)主要通过数据库对文件信息、文件块信息(本发明对文件的下载操作是先将文件分块,再进行多线程下载各个分块的操作过程)、用户信息进行集中管理。集中索引服务器(Centralized Index Server)由各个功能模块组成,其对数据源,如包含有文件信息、文件块信息、用户信息等库表的数据库进行操作,完成文件下载过程中的任务。各个功能模块的具体情况请参见下面的描述。
以下介绍数据库中的基本存储信息,值得注意的是,以下所述信息及数据库中具体的表及字段均是结合本实施例装置主要功能模块的下载操作给出,并非用于限定本发明装置的信息组成。
1、文件信息的主要内容包括:
a)统一资源***(url),其为用户下载源站点地址信息的表征;
b)文件大小(filesize);
c)文件最后修改日期(lastmodtime);
d)文件特征信息:由url,filesize和lastmodtime按顺序拼成的字符串的MD5特征值。
说明:MD5是公开的算法,该算法把任意长度的信息作为输入,输出一个128位的信息“指纹”。请参见RFC1321(RFC的英文全称是Request For Comments,即请求注解,大部分已经发展成为Internet的标准),网址是http://www.faqs.org/rfcs/rfc1321.html。
举例说明,某个URL是http://61.139.60.86:80/tmp/oicq/2004/03/11/QQmm.exe,它的文件长度是303786个字节,最后修改日期是2004-03-11 17:50:40,可以把它按顺序拼接成字符串http://61.139.60.86:80/tmp/oicq/2004/03/11/QQmm.exe 2004-03-11 7:50:40_303786计算的文件特征信息是:a97bb0e6af4e5a8a8bdf7e9b7b179561。
以上信息对应于数据库中具体的表和主要字段如下所述:
表名称urlmd5_to_urlid
表字段:
序号 |
字段名称 |
类型 |
说明 |
功能 |
① |
Urlid |
无符号整数 |
url的ID |
用于在urlseq_to_blockmd5中查找(详见下述内容) |
② |
urlmd5 |
32字节字符串 |
文件特征信息 |
|
③ |
url |
可变长度字符串 |
文件的URL |
|
④ |
Filesize |
无符号整数 |
文件大小 |
|
⑤ |
lastmodtime |
DATETIME |
文件的最后修改时间 |
|
表说明:此表中urlmd5是索引的键值,是唯一的。
表功能:通过文件特征信息urlmd5查询urlid。
2、文件块信息主要内容包括:
a)文件块的特征信息:按照上述对MD5算法的说明,以文件块的数据和文件块的大小作为输入,计算出它的128位信息“指纹”。
b)拥有文件块的用户的索引信息:用户ID。
c)文件块号,块ID。
以上块信息对应于数据库中具体的表和主要字段如以下所述:
表名称blockmd5_to_blockid
表字段
序号 |
字段名称 |
类型 |
说明 |
① |
Blockid |
无符号整数 |
block的ID号 |
② |
blockmd5 |
32字节字符串 |
block的特征值 |
表说明:此表中的blockmd5是索引的键值,是唯一的。
表功能:从blockmd5查询出blockid。
表名称blockid_to_uuid
表字段
序号 |
字段名称 |
类型 |
说明 |
① |
blockid |
无符号整数 |
block的ID号 |
② |
uuid |
无符号整数 |
拥有该块的用户ID号 |
表说明:此表中blockid可以是重复的,即可以从一个blockid索引出多个uuid。
表功能:从blockid查询出用户的ID号,此表是一对多的。
3、用户信息主要内容:
a)用户信息的索引:用户ID。
b)在线标志。
c)IP地址:包括内网地址和外网地址。
d)基本用户信息:如:用户的姓名,性别等常用信息。
以上信息对应于数据库中具体的表和主要字段如下所述:
表名称:uuid
表字段:
序号 |
字段名称 |
类型 |
说明 |
功能 |
① |
Uuid |
无符号整数 |
用户注册的ID号 |
|
② |
online_flag |
整数 |
用户的在线标志 |
|
③ |
external_ip |
无符号整数 |
用户连接的外部IP地址 |
如果是公网主机,则和主机的 |
|
|
|
|
IP地址相同 |
④ |
internal_ip |
无符号整数 |
用户主机的IP地址 |
|
⑤ |
username |
32字节字符串 |
用户提供的nickname |
|
⑥ |
cookie |
16字节字符串 |
用户登录和操作认证用 |
|
表说明:此表中uuid是唯一的。
表功能:由用户的uuid查询用户的可用信息。
其中,cookie是服务器用来认证的字符串。用户每次使用该系在***,客户端必须登录到服务器,服务器动态产生一个cookie字符串发送给客户端。客户端以后对集中索引服务器的请求都会附带该字符串,服务器接收到请求后,会把客户端的cookie和保存到uuid数据库中的cookie进行比较,如果一致则通过认证,否则返回错误。直到用户退出客户端,此cookie才失效。使用cookie的目的是为了防止来自客户端的恶意攻击。
此外,结合本发明***中具体下载操作的叙述,还需要将文件信息及文件块信息联合进行管理,以便下载查询操作。具体使用的表内容如下:
表名称urlseq_to_blockmd5
表字段:
序号 |
字段名称 |
类型 |
说明 |
① |
urlid |
无符号整数 |
url的ID |
② |
blockseq, |
无符号整数 |
文件块的序号(分块获得的序号) |
③ |
blockmd5 |
32字节字符串 |
文件块的特征信息 |
④ |
saved_count |
无符号整数 |
该文件块保存过的数目 |
表功能:从给定的urlid和blockseq查询出blockmd5
表说明:此表中的索引urlid可以是重复的。
集中索引服务器由相互独立的文件管理模块、块管理模块、用户管理模块三大部分构成。
集中索引服务器的功能模块组成参见图2-1。
其中,文件管理模块的主要功能是管理文件信息,响应客户端文件信息至块信息查询子模块的请求(详细内容请见客户端对该模块的描述)完成由文件信息、块序号查询相应文件块的特征信息的操作,响应客户端文件汇报子模块汇报的文件信息,完成文件信息的存储工作。该模块主要由文件信息至块信息子模块、文件存储汇报子模块构成。
该文件管理模块中文件信息至块信息子模块的功能是读取客户端传递来的文件特征信息urlmd5和分块子模块(分块子模块详细功能请见下述具体说明)中的块序号blockseq完成对文件块的特征信息blockmd5的查询。
该文件信息至块信息子模块具体实现的操作是:当文件特征信息urlmd5和块序号blockseq信息传递到该文件信息至块信息子模块时,该文件信息至块信息子模块通过查询语句对数据库中块的特征信息(对应库表名称为urlmd5_to_urlid和urlseq_to_blockmd5)进行检索,具体地讲:客户端发送uuid,cookie,urlmd5,blockseq信息到该模块,服务器端用户管理模块中用户认证子模块首先根据uuid、cookie信息进行用户操作认证(本***在执行任何操作时必须进行操作认证,详见用户管理模块中用户认证子模块的论证),认证通过后,该模块首先以urlmd5为条件从数据库表urlmd5_to_urlid中查询出urlid,接着,以查询出的urlid以及块序号blockseq为条件,从数据库表urlseq_to_blockmd5中查询出文件块的特征信息blockmd5,并将该文件块的特征信息blockmd5传递回客户端。上述操作认证如果被拒绝,或者查询操作没有获得相应的结果,均返回错误信息。该模块具体操作流程请参见图3-4。
该文件管理模块中文件存储汇报子模块的功能是:当完成整个文件的下载操作后,客户端要将文件信息进行汇报,客户端文件汇报子模块将文件信息传递到服务器端文件存储汇报子模块,该模块对数据库进行更新操作。具体实现的操作是:当客户端将uuid,cookie,url,urlmd5,filesize,lastmodtime信息汇报给服务器端时,服务器端用户管理模块中用户认证子模块首先根据uuid、cookie信息进行用户操作认证,认证通过后,服务器端文件存储汇报子模块以urlmd5为条件查询urlmd5_to_urlid表,判断是否存在对应的urlid,若存在,则不进行存储,退出该模块操作。若不存在,则在urlmd5_to_urlid表中创建一条新的纪录,将文件特征信息(urlmd5)及文件信息进行存储。如果操作认证被拒绝,或者查询操作没有获得相应的结果,则执行退出操作。详细流程图请参见3-5。
集中索引服务器中块管理模块的功能主要是执行有关文件块的操作,如分块、通过块信息查询用户信息、块存储、校验、删除、汇报等操作。具体地讲,主要由块信息至用户信息子模块、块存储汇报子模块、块删除子模块、块删除汇报子模块、分块模块、块校验模块构成。
下面逐一介绍各子模块的功能:
分块模块的功能是根据文件大小对文件进行分块,具体地讲,该分块模块在获得了文件的大小信息后,按一定的分块策略分块,最终获得块的大小信息和块的序号。
该分块按照文件越大,每一块的大小越大的策略进行分块,具体讲:按照文件的大小范围确定基准块的大小,然后对文件进行分块,剩余不足该基准块大小的文件块单独作为一文件块,此分块方法目的是尽量减小大文件的分块数目。
下表给出了不同文件大小范围,判断基准块大小的依据:
块的大小 |
文件大小范围 |
256K |
文件大小<=8.192M |
512K |
8.192M<文件大小<=16.384M |
1M |
16.384M<文件大小<=32.768M |
2M |
文件大小>32.768M |
按照上述分块策略现举例如下:
例如,对大小为1222368个字节的某文件分块的结果是:
块的序号 |
块的大小(字节) |
块的特征码 |
0 |
262144 |
d0bb7027e11e2315c38b5b0e094b3c77 |
1 |
262144 |
adf614225776a4aacff28a4bc75e394d |
2 |
262144 |
34d734ee9b4b014a3ebe3e77ed9b0edc |
3 |
262144 |
9a3d0648b2d763155f8f8c2203f2e96c |
4 |
173792 |
9c316baac04e195991d058238ae6cc41 |
其中,最后一块的大小是冗余部分。它的大小可以根据文件总长度和分块规则算出。
块信息至用户信息子模块的功能是根据文件块的特征信息检索出拥有该文件块的最佳用户信息列表,当客户端发出查询用户信息请求,将文件块的特征信息blockmd5传递到服务器端,该块信息至用户信息子模块依次通过对数据库表blockmd5_to_blockid、blockid_to_uuid和uuid的查询,获得一含有若干用户信息的用户信息列表。该用户信息列表在经由普通下载优化子模块和IP MAP(IP地理位置地图)下载优化子模块(详细内容见下面有关叙述)的优化选择,确定最佳用户信息列表(列表中的用户是按传输速度从大到小的顺序排列,该列表主要包含的信息是:uuid,、external ip、internal ip)返回客户端。
块信息至用户信息子模块具体实现的操作是:当客户端块信息至用户信息查询子模块将文件块的特征信息blockmd5传递到集中索引服务器时,由服务器端块信息至用户信息子模块通过对数据库中文件块信息内容进行检索,获得若干个(一个或一个以上)用户的索引信息,再由该索引信息查询用户信息表将用户的IP地址信息检索出来。具体地讲:服务器端用户管理模块中用户认证子模块首先根据用户uuid和cookie进行操作认证,认证通过后,服务器端块信息至用户信息子模块根据客户端传递来的文件块的特征信息blockmd5为条件查询数据库表blockmd5_to_blockid,获得对应的blockid,再以获得的blockid为条件查询数据库表blockid_to_uuid,获得多个用户的uuid,最后块信息至用户信息子模块调用用户信息查询子模块根据每一个uuid从数据库表uuid中查询是否存在预存有该文件块的缓存服务器(缓存服务器是在查询过程中具有较高优先级的客户端,具体内容请见下面有关缓存服务器的叙述)中,如果有,则将该缓存服务器信息传回客户端直接从缓存服务器端进行下载操作,如果没有,则继续查找其他拥有该块的用户信息,若干个(一个或多个)用户信息构成用户信息列表(该列表信息包括uuid、external_ip、internal_ip)。详细描述请参见图3-6。
在获得用户信息列表后,要经过优化才能够为客户端的下载实现子模块提供高效的下载源,该块信息至用户信息子模块中的普通下载优化子模块和IP MAP下载优化子模块的功能就是完成用户信息列表的优化操作。
普通下载优化子模块的功能是判断下载请求客户端用户和用户信息列表中的用户是否在本局域网内或同一组内(多个用户的判断是并列、同时进行,受线程控制的),若符合该条件,则将该用户信息列表(该列对表的顺序是随机的)传递到客户端进行下载操作。若不符合该条件,则利用IP MAP下载优化子模块进一步对用户信息列表进行优化。详细操作的过程请参见图3-7。
IP MAP是国家权威部门对外公布的IP地理位置列表和部分网段的接入带宽。根据该列表可以计算出两个用户主机之间通讯的最佳路径,从而折算成两用户之间传输的最佳带宽。但是直接使用IP MAP数据库计算时比较耗费时间,本发明采用了IP MAP下载优化子模块来提高计算速度。
为了说明IP MAP下载优化子模块功能,现结合具体的过程来举例说明:
IP MAP使用了下列数据库表:
表名称:ip_group
表字段:
序号 |
字段名称 |
类型 |
说明 |
① |
ipstart |
无符号整数 |
网段的起始IP,以无符号整数表示 |
② |
ipend |
无符号整数 |
网段的结束IP,以无符号整数表示 |
③ |
groupno |
无符号整数 |
组号,人工输入,不重复 |
表功能:由给定的IP地址(转换成无符号整数)索引用户的组号
表名称:group_group
表字段:
序号 |
字段名称 |
类型 |
说明 |
① |
group1 |
无符号整数 |
网段分组号 |
② |
group2 |
无符号整数 |
网段分组号 |
③ |
bandwidth |
无符号整数 |
group1和group2之间的传输带宽 |
表功能:由给定的任意两个分组号查询出两个分组之间的带宽。
本发明中对每个网段和其它网段的传输带宽进行计算,把处理后的结果放入数据库。对有较大带宽连接的作为邻近节点,从而形成了一个逻辑上的网段拓扑结构图。请参见图3-9。然后对每一个网段和其它网段通过拓扑图进行传输带宽运算,把结果放入数据库group_group中。从而可以高效地计算出任意两个IP之间的带宽。
IP MAP下载优化子模块的主要功能是根据IP MAP计算端到端的最佳路径,并将优化后的用户列表返回到客户端。主要由第一组判断模块、第二组判断模块、和查询比较组间带宽模块组成。
在上述普通下载优化子模块判断拥有块的用户不在本局域网内或同组的情况下,IP MAP下载优化子模块继续对用户列表信息进行优化,确定最佳的下载用户列表。为了更好的说明该模块实现优化的过程,现假设请求下载文件块的用户user0,而在自己的缓存中保存了请求文件块的多个用户分别是user1,user2,user3,user4。具体的实现方式是:该IP MAP下载优化子模块中第一组判断模块首先根据用户user0的ip地址从数据库表ip_group中查询user0是否属于某一分组,如果不属于某一分组则直接返回原用户列表user1,user2,user3,user4,如果属于某一分组(这里再假设用户user0的分组号是0),该模块中第二组判断模块接着从数据库表ip_group中查询user1,user2,user3,user4是否分别属于某一分组(查询每一个用户的过程使用多线程同时进行,这里假设user1,user3是分组1和3,user2,user4不属于任何分组),在获得了分组信息之后由本模块中查询比较组间带宽模块从数据库表group_group中分别查询分组0和分组1,分组0和分组3之间的传输带宽(对应于表中的bandwidth),并对传输速度从大到小排序,假设结果是分组0到分组3的带宽大于分组0到分组1的带宽。最后把不是IP MAP中的用户user2,user4追加到用户列表的末尾,在本例中的最终用户列表是:user3,user1,user2,user4(用户user2,user4的排列顺序是随机的),最后将优化后的用户列表传回客户端。本模块的详细流程图请参见3-8。
块管理模块中块校验模块的主要功能是:当客户端向集中索引服务器端汇报的文件块的特征信息和用户ID信息时,校验文件块的特征信息,以确定是否对该文件块的特征信息以及用户ID进行存储。
该块校验子模块具体实现的操作是:当客户端某一文件块下载完毕后,客户端块存储汇报子模块向集中索引服务器汇报文件块的特征信息和用户ID,块校验子模块判断该块的特征值是否和集中索引服务器中其他客户端用户汇报的文件块特征值相一致。若一致则进行存储,若不一致则继续进行判断,判断目前该信息存储过的数目(在数据库表urlseq_to_blockmd5中的saved_count)是否小于某特定值(该特定值是一个经验值),如果小于该值,则删除以前所有的纪录,并保存现汇报信息,返回成功信息。如果不是,则发出警告(比如记录到日志文件中,并通过其它方式如电子邮件方式通知管理员)。由于该校验子模块与块存储汇报子模块关系紧密,具体的实现操作,参见下述对块存储整个过程的描述。
服务器端块管理模块中的块存储汇报子模块的主要功能是在客户端完成某一块的下载操作后,将客户端汇报的文件块的特征信息和用户ID进行存储。
客户端每下载完一文件块,必须向集中索引服务器汇报文件块的特征信息,客户端块存储汇报子模块将块的特征信息和用户ID上传到集中索引服务器,服务器端块存储汇报子模块对其做出响应。该模块具体实现的操作是:当客户端块存储汇报子模块将uuid,cookie,blockmd5值传递到服务器时,服务器端用户管理模块中用户认证子模块首先根据uuid,cookie进行操作认证,认证许可后,服务器端块存储汇报子模块以blockmd5为条件,查询blockmd5_to_blockid表,查询是否存在对应的blockid,若已经存在该块的信息存储的纪录,则通过块校验模块校验该文件块的特征信息和其他用户汇报的文件块的特征信息是否一致,主要的操作是将客户端汇报的blockmd5值与具有相同blockid号的blockmd5值进行比较。如果一致,则在blockid_to_uuid表中***一条以该blockid和上报的uuid为内容的新记录。如果不一致,则需查询urlseq_to_blockmd5中的saved_count的数值,是否小于某特定值(该值为一经验值);若小于则将以前所有的记录删除(以防止对本下载***的恶意攻击),并将块blockid和上报的uuid信息存入blockid_to_uuid,否则向管理员发出报错请求,进行手工异常处理。上述操作认证没有通过或查询操作出现问题则返回错误信息。详细内容请参见图3-10,3-12。
集中索引服务器端块管理模块中块删除汇报子模块的功能是在客户端汇报删除某文件块后,对数据库表进行更新数据操作,将该块的相关库表记录删除。
具体实现的操作是:当客户端块删除汇报子模块将删除块的blockmd5,uuid,cookie汇报服务器时,服务器端用户管理模块中用户认证子模块首先根据uuid,cookie进行操作认证,认证许可后,服务器端块删除汇报子模块以blockmd5为条件查询blockmd5_to_blockid表,查询是否存在相应的blockid,若存在,则调用服务器端块删除子模块将blockid_to_uuid中相应的记录删除。若不存在相应blockid,则向客户端返回错误信息。如果认证没有通过或操作出现异常,返回错误信息。详细内容请参见图3-11。
集中索引服务器端块管理模块中块删除子模块的主要功能是执行集中索引服务器端的删除记录操作。由于只是简单的delete操作,在此不作累述。
集中索引服务器端(Centralized Index Server)用户管理模块主要是用户的基本信息进行管理,实现用户注册、登录、退出、认证等操作,保证和实现查询用户信息(对应于数据库中的用户管理信息“uuid”表),主要包含用户注册管理子模块、用户登录管理子模块、用户信息查询子模块、用户退出子模块、用户认证子模块。此服务器端用户管理模块各子模块所使用技术均为现有技术。
其中,用户注册管理子模块提供用户注册功能,为使用本***的用户分配用户ID。主要实现的具体操作是:服务器接收到客户端的注册请求,用户注册管理子模块则查询数据库中uuid表,找到一个没有被注册的用户ID,然后更新uuid数据库表,加入该用户,把注册的用户ID返回给用户,具体流程请参见附图3-1。
用户登录管理子模块的功能是实现用户登录的功能,使用户获得从cookie,用作客户端和索引服务器交互的安全认证。并且修改用户的在线信息标志。具体的实现操作是:服务器接收到客户端的登录请求,登录模块首先查询数据库表uuid,判断该用户是否是注册用户,如果不是,则返回错误,否则,更新数据库表uuid中的用户在线信息(online_flag),并动态产生一cookie信息存储到uuid表中,同时将该cookie信息返回给客户端,以便为其他模块提供操作认证。该模块的流程图见附图3-2。
用户信息查询子模块主要是根据用户ID查询用户的在线信息、IP地址信息和用户基本信息等操作。该模块为公有模块可以同时被其他模块调用,具体实现操作是:服务器端用户管理模块中用户认证子模块首先根据uuid和cookie进行操作认证,认证通过后,根据不同的查询指令(不同条件下的select语句)对uuid表进行查询,获得相关信息,并将查询结果返回。
用户实现下载操作后,用户管理模块中的用户退出子模块负责退出操作,主要实现的操作是更改用户信息表uuid的online_flag信息。具体的实现操作是:当客户端向服务器发出退出请求后,服务器端用户管理模块中用户认证子模块首先进行操作认证,认证通过后,查询uuid数据库,查询是否存在该用户的纪录,若存在,则将该uuid表中的online_flag更改为下线状态,并退出本***。具体的实现流程请参见图3-3。
用户管理模块中用户认证子模块为公有模块,是处理用户请求时,以客户端传递来的uuid和cookie信息为条件,首先查询出服务器数据库表uuid中的cookie,而后进行比较是否一致。如果一致,则认证通过。如果不一致,则认证失败。客户端用户登录后的每个操作请求需要经过该认证。
至此,服务器端的基本组成及各模块的功能介绍完毕。
(二)、客户端(Clients)
客户端主要由用户管理模块、IE辅助模块、文件下载模块、P2P(Peer to Peer,点对点)上传模块和本地缓存管理模块。客户端各模块组成请参见图2-2。
在下载操作中,由客户端各功能模块发出请求,集中索引服务器对各种请求进行处理,相互配合完成下载操作。客户端和索引服务器端的通讯协议全部使用HTTP协议。
用户第一次使用本***,必须进行注册,注册成功时从集中索引服务器得到一个用户ID,以后客户端需要使用该用户ID到集中索引服务器进行登录。用户的注册和登录,由集中索引服务器中相应的模块对其进行处理。客户端的用户管理模块对应于集中索引服务器的用户管理模块,由相互并列、独立的用户注册子模块、用户登录子模块、用户退出子模块组成。此对应关系图请参见图2-3,2-4。
客户端用户管理模块的用户注册子模块主要功能是向服务器发送注册请求。具体的操作是,首先,在客户端的Windows注册表中查询是否已经注册(查询用户ID),若已经注册则在本地可以查询到存在用户ID号。若本地计算机没有用户ID则向集中索引服务器发送注册请求,由集中索引服务器分配对应于uuid表中uuid的用户ID号,并将该用户ID返回客户端,客户端用户注册子模块将该用户ID保存在客户端。详细信息请参见图4-1。
用户登录子模块的主要功能是向集中索引服务器发送登录请求,并接收集中索引服务器的返回信息。具体的实现操作是:客户端用户登录子模块向集中索引服务器发送登录请求,将uuid发送到服务器端,集中索引服务器接收该请求,由服务器端用户登录管理子模块处理该请求,查询数据库表uuid,判断该用户的uuid是否存在于uuid表中。如果不是,将返回错误信息,如果为注册用户,则更新数据库表uuid中的用户在线信息(online_flag),改为在线。产生cookie存储到uuid表中(提供其他模块的操作认证),该用户登录管理子模块将登录成功信息和cookie返回客户端。由客户端用户登录子模块接收成功信息并将返回的cookie信息存储到客户端。详细信息请参见图4-2。
用户退出子模块的主要功能是向集中索引服务器发送退出请求,具体的实现操作是:客户端将uuid,cookie信息传送到服务器端,由服务器端用户管理模块中用户认证子模块进行认证,认证通过后,服务器端该用户退出子模块更改用户信息表uuid中的online_flag信息,将该信息改为下线,并执行退出本***的操作。
IE辅助模块是触发下载事件的响应模块,该文件下载***向IE控件注册了点击事件的回调响应和右键菜单中的下载条目(注册机制是IE公开的接口Browser Helper Objects(浏览器辅助物件))。它的主要功能是在用户点击下载操作事件时,触发本***下载功能,并获得下载的文件信息生成文件的特征信息。
该IE辅助模块的具体实现的操作是:当用户通过左键点击或右键菜单触发下载事件时,该IE辅助模块获得文件的url(统一资源***),根据文件的url从源站点获得filesize(文件大小),lastmodtime(文件最后修改日期),根据url、filesize、lastmodtime作为输入参数,按照MD5算法计算出urlmd5。该模块实现的详细的内容请参见图4-3。
客户端(Clients)文件下载模块的主要功能是在IE辅助模块触发下载事件后,向服务器端发送查询请求,最终获得可以提供该文件块下载的用户信息列表(该列表中的用户信息主要包含uuid、external_ip、internal_ip),实现下载、存储、汇报文件块等操作。
该文件下载模块主要由用户信息查询模块、下载实现子模块、块管理子模块、文件管理子模块等四部分组成。
概括来讲:下载操作过程中,客户端的各功能模块向集中索引服务器(Centralized Index Server)发出请求并接收集中索引服务器返回的处理信息实现下载、存储、汇报等一系列操作。客户端和集中索引服务器模块大体存在一一对应的关系。详细客户端下载过程中各模块的关系图请参见图2-5。有关本***客户端各模块在下载过程中的作用,请详见下面具体描述。
下面基本上依据图2-5中模块的顺序逐一介绍文件下载模块各子模块的功能及构成。
块管理子模块中分块子模块的主要功能是根据获得的文件大小信息按照一定的分块策略将文件进行分块,并获得块的分块信息,该分块信息包含块序号和每一块的大小。客户端在下述下载操作过程中向集中索引服务器端分配多线程实现每一块的信息查询和下载操作。
该分块子模块的分块机制与集中索引服务器端分块模块的机制相同,二者产生的文件分块是一致的,这保证了文件下载过程中的一致性。有关具体的分块策略请参见上述集中索引服务器端叙述,在此不作累述。
文件下载模块中用户信息查询模块的主要功能是向集中索引服务器发出查询请求并接收集中索引服务器的返回信息。该模块主要由文件信息至块信息查询子模块和块信息至用户信息查询子模块构成。两个子模块对应于集中索引服务器端文件管理模块的文件信息至块信息子模块和块管理模块的块信息至用户信息模块。相互联系,共同作用完成获得最佳下载用户信息列表的操作。
其中,文件信息至块信息查询子模块的主要功能是向集中索引服务器发出查询块信息的请求并接收返回信息。具体的实现操作是:将IE辅助模块生成的urlmd5,由分块子模块获得的blockseq,以及用于操作认证的uuid,cookie传递到服务器端,由集中索引服务器端的文件信息至块信息子模块以这些信息为条件,实现查询操作(具体操作见上述服务器端文件信息至块信息子模块的叙述),客户端文件信息至块信息查询子模块接收服务器端返回的文件块的特征信息(blockmd5)或不存在该块特征信息进而判断下一步的操作,具体而言:若返回了blockmd5值,则将该信息传递到客户端块信息至用户信息查询子模块进行下一步的查询操作,若不存在该特征值,即返回一错误信息,则调用客户端源站点下载实现子模块从源站点实现文件的下载。详细流程请参见图4-4。
客户端块信息至用户信息查询子模块的主要功能是:上述的文件信息至块信息查询子模块获得文件块的特征信息(blockmd5)后,客户端块信息至用户信息查询子模块向集中索引服务器发出查询用户信息的请求并接收返回的信息。具体的实现操作是:该模块将文件块的特征信息(blockmd5)以及用于操作认证的uuid,cookie信息发送到集中索引服务器,集中索引服务器端的块信息至用户信息子模块处理具体的查询操作(具体操作见上述服务器端块信息至用户信息子模块的叙述),客户端块信息至用户信息查询子模块接收服务器返回的用户信息列表或不存在该用户信息列表的信息,进而判断下一步的操作,具体而言:若返回了用户信息列表,则直接调用客户端P2P下载子模块实现下载操作。若不存在该列表信息,即返回一错误信息,那么直接调用客户端源站点下载实现子模块从源站点实现文件的下载。详细流程请参见图4-5。
文件下载模块中下载实现子模块的功能是根据集中索引服务器端返回的信息判断以何种方式进行下载处理操作,具体地讲,根据下载方式的不同可以分为源站点下载实现子模块、P2P下载子模块。
源站点下载实现子模块是直接从提供HTTP/FTP(HTTP的英文全称是HyperText Transfer Protocol,即超级文本传输协议;FTP的英文全称是File Transfer Protocol,即文件传输协议)的源站点下载文件。采用该方式下载的原因可能有以下几种:
1.客户端不能从集中索引服务器上找到保存该文件块的用户;
2.客户端虽然获得了一个保存该文件块的用户列表,但是由于某些原因下载不能实现(比如不能穿越防火墙,用户在传输的过程中下线等);
3.客户端从其它用户下载了文件块,但是文件块的校验不正确;
4.源站点不支持文件块传输。
源站点下载实现子模块对请求的HTTP协议(HyperText TransferProtocol,即超级文本传输协议)和FTP协议(File Transfer Protocol,即文件传输协议)分别处理。站点下载实现子模块的流程图请参见图4-13。
该模块的操作避免了现有技术中由于“种子”缺失造成的下载断档的问题。
P2P下载子模块的功能是从其它用户那里传输文件分块。它依据从集中索引服务器返回的用户信息列表,依次请求从其它客户端那里传输文件块,如果请求错误,则从用户列表中尝试下一个,如果都错误,则从源站点进行下载。传输部分请参见流程图4-14。该P2P下载子模块本身为现有技术。
客户端的P2P上传模块,作为下载的提供端,为下载请求客户端提供文件的某一块的传输。有关下载过程中下载请求端和下载提供端P2P下载模块P2P上传模块之间的关系图请参见2-7,P2P上传模块将本地缓存提取子模块(该本地缓存提取子模块内容请详见下面描述)获得的文件块传输到下载请求端用户。P2P上传模块的流程图请参见图4-15。该P2P上传模块本身为现有技术。
块管理子模块中块校验子模块的主要功能是计算每一个下载后的文件块的校验码(即文件块的特征信息blockmd5),并和上述客户端文件信息至块信息查询模块从集中索引服务器获得的文件块的特征信息进行比较,并返回是否一致的信息,如果校验的信息一致,则可以对该文件块进行存储(存储的详细信息请参见下述块存储子模块的叙述),如果不一致,则从源站点重新进行下载块的操作。该块校验子模块具体的操作详见4-10。
块管理子模块中块存储子模块的功能是将通过校验后的文件块存储到本地的目标文件中,并对缓存进行处理。具体的实现操作是,将文件块存储到本地目标文件中。而后,对缓存空间进行判断,判断是否还有剩余空间,若缓存空间已满,则按照先进先出的方法(FIFO,First In First Out)进行删除文件块的操作,该删除操作由块删除子模块执行,删除操作后,由块删除汇报子模块将块的删除信息汇报到服务器端。如果缓存还有空间,则调用本地缓存保存子模块(该模块的具体功能请参见下面本地缓存管理模块的描述)将该文件块存到本地缓存中,以便为下载操作提供下载源。详情请参见存储过程的图4-8。
上述块删除汇报子模块的主要功能是将块删除信息汇报到服务器,由服务器端块删除汇报子模块对库表进行具体的操作。客户端块删除汇报子模块与服务器端块删除汇报子模块的对立关系图2-6。具体的实现操作是:该块删除汇报子模块将删除文件块的特征信息blockmd5,uuid,cookie信息传递到集中索引服务器,首先由服务器端用户管理模块中用户认证子模块根据uuid,cookie信息进行操作认证,认证通过后集中索引服务器块删除汇报子模块执行库的更新操作。(该更新操作请详见服务器端块删除汇报子模块的叙述)。
块管理子模块中块存储汇报子模块的功能是对存储的文件块的特征信息和用户ID进行汇报,并接收集中索引服务器端块存储汇报子模块进行处理后的返回信息。具体的实现操作是:客户端块存储汇报子模块将块blockmd5,uuid,cookie传递到客户端由集中索引服务器端块存储汇报子模块进行具体的实现操作(该操作请详见服务器端该模块的叙述)。客户端块存储汇报子模块接收服务器端的返回信息,若返回正确信息,则证明存储成功。若返回错误信息,则说明本地缓存中存储的块就不能为其他下载请求端提供块的传输,那么由删除子模块将本地缓存中的文件块进行删除。该过程请参见图4-9。
文件下载模块中的文件管理子模块主要功能是对下载到本地目标文件中块进行判断,是否将所有的块下载完毕,若下载完毕,则将所有文件块按顺序进行合并,实现对文件的存储。并将存储的文件信息汇报到集中索引服务器。该模块主要由文件存储子模块和文件汇报子模块构成。
其中,文件存储子模块的功能是判断文件所有模块是否下载完毕,若下载完毕,则将该文件按照块的序号顺序合并,存储在目标文件中,若没有下载完毕,则返回操作。主要操作详见图4-6。
文件汇报子模块的功能是文件下载完毕后向集中索引服务器发出文件的信息汇报请求。具体的操作是,在文件存储后,客户端文件汇报子模块将url,urlmd5,filesize,lastmodtime和用于操作认证的uuid,cookie信息传递到服务器端,由集中索引服务器中文件管理模块的文件存储汇报子模块进行处理请求(详细的信息请参见集中索引服务器中文件管理模块的文件存储汇报子模块内容叙述)。主要操作详见图4-7。
客户器端本地缓存管理模块,是负责本地缓存的保存和提取操作的。本地缓存是本***安装时就在用户硬盘上创建的文件(所创建的文件的大小依据用户的硬盘剩余空间而定)。缓存文件分为文件块信息索引部分和文件块数据部分。索引部分含有文件块的blockmd5、分块大小和块在文件中所存放的位置等信息。
用户下载无论是从源站点下载还是从P2P用户处下载文件,会保存文件块到缓存文件中,同时汇报给索引服务器。如果其它用户通过网络连接来请求文件块,则客户端为该请求提供相应的上传服务。
本地缓存管理模块分为本地缓存保存子模块和本地缓存提取子模块。
本地缓存保存子模块的功能是保存文件块信息到缓存文件中,并在缓存文件中建立对该块的索引。如果保存时该缓存文件已经没有空闲的空间,则调用客户端块删除子模块删除最早保存的文件块,并调用块删除汇报子模块把删除文件块的特征信息汇报给集中索引服务器。本地缓存保存子模块的流程图请参见图4-11。
本地缓存提取子模块的功能是从本地缓存中索引到文件块的内容并返回文件块的内容信息。它的流程图请参见4-12。
(三)、缓存服务器是专用的服务器仅具有上传的功能,缓存服务器用于存储并发数比较高的文件的下载。它具有较大的缓存和较高的带宽,在用户查询时占有很高的优先级。缓存服务器相当于只提供上传服务的客户端,它预先缓存一些特定的文件(包括文件块)。它与服务器和其它客户端之间的传输协议和普通的客户端相同。具体讲缓存服务器包含有上述客户端的本地缓存管理模块和P2P上传模块。
二、具体使用过程描述:
注册用户在登录后,可以使用本***提供的下载方法,现结合图4-16来具体说明本***提供的下载方法:
如图4-16中a步骤:当用户通过左键点击或右键菜单触发下载事件时,由IE辅助模块获得文件的url(统一资源***),然后从源站点获得filesize(文件大小),lastmodtime(文件最后修改日期),根据url、filesize、lastmodtime作为输入参数,按照MD5算法计算出文件特征信息urlmd5。
如图4-16中b步骤:获得了文件大小信息之后由客户端分块子模块将文件进行分块处理,获得文件块的序号blockseq。
如图4-16中c步骤:客户端文件信息至块信息查询子模块将文件的urlmd5、文件块的序号blockseq信息以及用于进行用户操作认证的uuid、cookie信息向集中索引服务器发出查询文件块的特征信息的请求,服务器端用户管理模块中用户认证子模块首先根据uuid、cookie信息进行用户操作认证,认证通过后,服务器端文件信息至块信息子模块从数据库表urlmd5_to_urlid中查询出urlid,以文件块的序号blockseq以及查询出的urlid从数据库表urlseq_to_blockmd5中查询出文件块的特征信息blockmd5,将该文件块的特征信息blockmd5传递回客户端。如果上述查询操作没有查询出结果,则返回错误信息,下载文件的操作直接由客户端源站点下载实现子模块从源站点进行。
如图4-16中d步骤:客户端在接收到服务器端返回的文件块的特征信息blockmd5后,由客户端块信息至用户信息查询子模块向服务器端发送请求,将uuid,cookie,blockmd5信息发送到服务器端,由服务器端块信息至用户信息子模块进行处理,具体地讲:服务器端用户管理模块中用户认证子模块首先根据用户uuid和cookie进行操作认证,认证通过后,根据客户端传递来的文件块的特征信息blockmd5查询数据库表blockmd5_to_blockid获得对应的blockid,再以该blockid为条件查询数据库表blockid_to_uuid获得多个用户的uuid,最后根据每一个uuid从数据库表uuid中查询出相应用户的内网IP地址信息internal_ip和外网IP地址信息external_ip,该uuid、internal_ip、external_ip信息组成用户信息列表,并将该用户信息列表返回到客户端。如果上述查询操作出现错误,则将错误信息返回客户端,客户端源站点下载实现子模块从源站点实现下载操作。
如图4-16中e步骤:服务器端将用户信息列表传回客户端后,客户端下载实现子模块中P2P下载子模块依据从集中索引服务器端返回的用户信息列表,依次请求从该用户信息列表中的下载提供客户端那里传输文件块,如果请求错误,则从用户信息列表中尝试下一个,如果都错误,则从源站点进行下载。
如图4-16中f步骤:下载后的文件块由客户端块存储子模块将文件块存储到本地目标文件,同时还要将文件块存储到本地缓存中,以便为下载操作提供下载提供端。
如图4-16中g步骤:经过上述的操作后,客户端块存储汇报子模块向服务器汇报存储在本地缓存中文件块的信息和用户ID,具体地讲:将uuid,cookie,blockmd5上传到服务器,服务器端用户管理模块中用户认证子模块首先根据uuid,cookie进行操作认证,认证许可后,服务器端块存储汇报子模块根据blockmd5查询blockmd5_to_blockid表是否存在对应的blockid,若已经存在该块的信息存储,则通过服务器端块校验模块校验该信息和其他用户汇报的信息是否一致,主要的操作是将现汇报的blockmd5与相同blockid的blockmd5值进行比较。如果一致,则在blockid_to_uuid表中***一条以该blockid和汇报的uuid为内容的新记录。如果不一致,则需查询urlseq_to_blockmd5中的saved_count的数值,是否小于某特定值(该值为一经验值);若小于则将以前所有的记录删除,并将blockid和汇报的uuid的存入blockid_to_uuid,否则,向管理员发出报错请求,进行手工异常处理。
如图4-16中h步骤:所有的文件块均经过上述下载过程,当文件所有的文件块下载完毕后,由客户端文件存储子模块对文件进行合并,保存该文件。
如图4-16中i步骤:并由客户端文件汇报子模块进行文件信息汇报工作,该客户端文件汇报子模块将uuid,url,urlmd5,filesize,lastmodtime,cookie信息汇报给服务器端,服务器端用户管理模块中用户认证子模块首先根据uuid、cookie信息进行用户操作认证,认证通过后,服务器端文件存储汇报子模块根据urlmd5查询urlmd5_to_urlid表,判断是否存在对应的urlid,若存在,则不进行存储,退出该模块操作。若不存在,则在urlmd5_to_urlid表中创建新的一条纪录将相应的文件信息进行存储。