目前主流的,开源的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/

https://www.evernote.com/shard/s49/sh/6f391cc2-4644-4daf-9d7e-e705dabce1fc/1f853c3ad1ed9cd13d4bfd66f60027ad

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/

https://www.evernote.com/shard/s49/sh/b7e8d324-30e0-423a-bbe0-0469e642444a/152072a88b407afcf0be297242c23ea4

BT的DHT网络爬虫实现步骤:http://codemacro.com/2013/06/21/magnet-search-impl/

emule的一些文档:http://emulefans.com/emule-kademlia-protocol-document/

https://www.evernote.com/shard/s49/sh/c2d88ff8-93c7-4dc8-bc5a-67a1e04f3c44/0ffebdfa1fa0528ebd3a3ba2175cc94c