目前主流的,开源的P2P下载主要BT和emule。
为了P2P下载一个文件,首先要知道还有哪些节点在下载这个文件。BT网络中存在一组tracker服务器,用来管理正在下载文件的节点,BT的早期版本我们只能从tracker服务器来获取其他节点的信息。
BT种子以及磁力链接里面就含有这些tracker服务器信息。
后来的BT网络添加了DHT,这样即使没有tracker服务器服务器,我们也能从其他节点获取正在下载更多节点。DHT网络初始化主要是将BT种子和磁力链接里面的tracker服务器信息替换成含有资源的的节点。
DHT网络(emule叫做Kad网络)是基于Kademlia算法。DHT是distributed hash table(分布式哈希表)的缩写。其核心理念是每个节点ID是可排序的,每个节点只知道少量的其他节点,其中离节点本身比较近的节点较多,由近及远逐渐减少(这里的远近概念是值节点之间的差值)。
查找某个节点信息时,先从自身知道的节点中选取离节点比较近的一些节点发送查找消息,这些节点要么返回相应的节点,要么返回离结果更近的n个节点,当前节点再针对返回的n个节点进一步迭代发送查询消息,直到找到或者找不到为止。
在DHT网络下载一个文件之前,首先要有一个节点发布这个文件,发布文件的话首先获得文件hash,这里获得的文件hash格式长度都是的节点ID的格式长度一样的,然后将自身持有文件这个消息发送到离文件hash(因为格式一样,文件hash也能用来和节点ID做比较)最近的一些节点上面。
查找持有该文件的其他节点时,就根据文件hash为目标,查找询问节点信息,因为发布消息时候持有该文件的节点信息就在文件hash作为节点ID附近。
emule的下载和BT下载基本上类似。emule的文件名搜索主要是通过关键字实现的。文件名被划分为一组关键字,每个关键字对应一组文件hash,通过这些hash来查找具有这些文件的节点,然后就能完成下载了。
现有的一些类库:
libtorrent库: http://www.rasterbar.com/products/libtorrent/。bt的一个跨平台c++库,在iOS平台编译通过。能够下载磁力链接和网络本地种子。不支持文件过滤。
emule:http://www.emule-project.net/home/perl/general.cgi?l=1&rm=download 电驴开源项目。仅支持window平台。
phpmybittorrent:https://www.phpmybittorrent.com/ 这个是php的一个版本。同时支持BT以及电驴e2Dk网络。
文档资源:
Kademlian算法的文档:http://en.wikipedia.org/wiki/Kademlia
BT协议的相关文档:http://www.bittorrent.org/beps/bep_0003.html
http://www.kristenwidman.com/blog/how-to-write-a-bittorrent-client-part-1/
http://www.kristenwidman.com/blog/how-to-write-a-bittorrent-client-part-2/
BT的DHT网络协议介绍:http://en.wikipedia.org/wiki/Mainline_DHT
http://gobismoon.blog.163.com/blog/static/5244280220100893055533/
http://www.bittorrent.org/beps/bep_0005.html
BT的DHT网络爬虫原理: http://codemacro.com/2013/05/19/crawl-dht/
BT的DHT网络爬虫实现步骤:http://codemacro.com/2013/06/21/magnet-search-impl/
emule的一些文档:http://emulefans.com/emule-kademlia-protocol-document/