博客网 >

迅雷工作原理研究(2)
作者:分类:默认分类标签:

                                    迅雷工作原理研究(2)
  有时闲着发呆的时候总是想编个类似迅雷的软件,基本的技术是:
(1)HTTP/FTP多线程下载+断点续传
(2)网络爬虫+数据组织和存储(P2SP)
(3)P2P节点组织,穿透和数据共享
(4)高并发访问与服务器负载均衡
关于上面几个问题的难点,我的分析如下:
1)HTTP/FTP多线程下载+断点续传
   HTTP/FTP断点续传不是什么困难的事,毕竟FlashGet,NetAnts这些软件
也已经出来快10年了,这些技术也比较简单。关键是多线程下载时的任务
分配算法和数据存储算法。由于HTTP支持的Range只有起始偏移,并没有指定
结束的偏移,而任务分配算法是以数据块为单位的(4KB or 8KB),所以各个下载任务
需要监控自己的下载情况,下载完成块后判断自己的任务是否已经结束,如果结束
就要向任务分配器请求分配新的任务。给各个任务块分配任务的时候尽量保证分配
的任务块是连续的。
   数据存储算法可以简单点实现,直接获取文件长度,不妨设为L,那么在本地
磁盘上建立一个L+M长度的文件,在文件的文件尾部加上一个M个Bytes的数据块位图,
另外还需要纪录数据块位图的长度,文件命名为xxx.ext.td, 如果下载完毕去掉尾部
的附加数据,将文件Rename为xxx.ext就可以了。

2)网络爬虫+数据组织和存储
  Spider倒是不太难关键是数据怎么组织的问题,毫无疑问,数据爬下来以后肯定是
存入到数据库里面去了,存入的信息应该有(资源地址,资源的CID,资源的大小,资源类型),
客户端下载时需要根据资源的CID到数据库中搜索然后获取相关的资源地址列表。问题出来了:
如何计算CID,在Thunder中我们发现其有一个文件xunlei_bcid_caculator.cpp,应该就是
计算资源的CID的,其实如何计算倒不是什么大问题,基本上都是采用类似MD5,SHA的内容
Digest算法。网络爬虫在爬取资源的时候如何得到资源的CID,难道要自己下载一遍么?应该
不会吧?另外客户端下载时怎么获取资源的CID呢?其实,其本质问题是面对一个HTTP/FTP
下载资源,如何快速而有效的对其内容给出一个唯一的CID?继续分析,我发现一个可疑的
接口query_part_cid,难道是对资源选择部分进行cid的标识?
  关于数据库的操作我一直都不太满意,自己在数据库方面的研究太少,只是知道数据库的
可以采用主/从数据库,内存数据库进行负载均衡和增加查询效率。Tencent和Thunder可是这
方面的行家,不太熟悉。略过...

3)P2P节点组织,穿透和数据共享
  相信用过Thunder的多少会知道有时你下在数据是从一些诸如192.168.xx.xx和172.16.xx.xx
的内网地址上获取的。这涉及到P2P的穿透和数据共享机制,迅雷采用的似BT的机制,采用
STUN协议进行Firewall的穿透,采用Tracker进行Peer的组织。Peer启动迅雷下载的同时也把
自己电脑上的资源和上行带宽无偿地贡献给了迅雷。

4)高并发访问与服务器负载均衡
  一直没有QQ,迅雷或是PPLive这样的庞大用户群,所以也没机会体验高并发访问与服务器负载均衡
系统的设计,不过,还是有点思路的。比如,基于Web的SQUID技术和基于Socket的接入服务器技术。

 

<< 一个网络封包加密算法 / P2P流媒体开发中的一点疑惑 >>

专题推荐

不平凡的水果世界

不平凡的水果世界

平凡的水果世界,平凡中的不平凡。 今朝看水果是水果 ,看水果还是水果 ,看水果已不是水果。这境界,谁人可比?在不平凡的水果世界里,仁者见仁,智者见智。

中国春节的那些习俗

中国春节的那些习俗

正月是农历新年的开始,人们往往将它看作是新的一年年运好坏的兆示期。所以,过年的时候“禁忌”特别多。当然,各个地方的风俗习惯不一样,过年的禁忌也是不一样的。

评论
0/200
表情 验证码:

David.Zhu

  • 文章总数0
  • 画报总数0
  • 画报点击数0
  • 文章点击数0
个人排行
        博文分类
        日期归档