原文示例链接:https://blog.csdn.net/csdnnews/article/details/130333678

去年10月份开始研究相关的协议与资料,中途乱七八糟的事情差点没坚持下来,寒假期间修修补补,上礼拜把crowh发布了,经过社交网络发布之后,发生了裂变式的分享,上线第三天UV就达到了两万多,也算是对这几个月工作的一点肯定吧。

界面比较简洁,一共三个页面:首页、列表页、详情页。如果你需要下载对应的文件,电脑里面需要安装一款支持磁力链接的软件,例如迅雷,QQ旋风,BitComet等。

DHT Protocal

一个种子主要包含元信息(文件标题、文件大小、文件列表等)和Tracker服务器信息,每当一个用户想要下载一个文件,客户端会先询问Tracker服务器,目前有哪些电脑正在下载这个文件,这些电脑被称为“peer”,然后客户端会向这些peer分别请求文件的各个片段,等每个片段都下载完成之后再组合成一个完整的文件,至此整个下载过程完毕。

由此可见,Tracker服务器相当于提供了一种“路由”服务,在整个下载过程中挥舞着指挥棒。但近年来由于打击盗版等原因,一些Tracker服务器开始陆续关闭,没有Tracker用户还怎么用种子下载文件呢?后来bt协议进行了扩充,添加了DHT(Distributed Hash Table) ,它把Tracker的路由服务分散到了BT网络中的每个节点,那么一个种子由哪个或哪些节点负责路由服务呢?

首先,每个种子都有一个对应的20字节的hash,这个hash有sha1算法得到,每个节点也有一个20字节的id,通常是随机的20字节。如果这时有两个节点A和B,怎么判断这个种子放在A好还是B好呢?通过Kademlia算法计算种子hash和节点id的异或值(称为距离),异或值最小(距离最近)的那个节点更适合提供这个种子的路由。

那整个网络之间的节点是如何进行沟通的呢?根据DHT Protocal,主要有四种请求:ping,find_node,get_peers,announce_peer。这四种消息其实都是字典类型,要经过B编码之后才能被对方正确的处理,使用UDP协议进行发送,这四种请求都会影响自己维护的一张路由表。

路由表

路由表主要用于存储跟自己打过交道的节点信息,节点信息包含IP、Port和节点ID信息。而路由表由一个个的吊桶(Bucket)组成,在这里我简称它为“桶”。每个桶只能存储一定节点ID在一定范围的节点信息,并且桶的容量有限,一般规定一个桶只能存储8个节点。起初路由表里面只有1个桶,这个桶能存储的节点ID范围在2^0至2^160,也就是任何节点它都能保存,等这个桶满了之后怎么办?——分裂。例如桶(min, max)分裂为两个桶后,两个桶能保存的范围分别为(min, max/2), (max/2, max),原先的那个桶里面的8个节点也要重新分配到分裂后的两个桶中。

伟大的毛主席说过,只要有一拨人,就分左中右。节点也是这样,分为good、questionable和bad,“good”指过去15分钟内该节点跟我有过联系,如果15分钟内该节点没有跟我联系过,它会变成“questionable”状态,客户端就会向它发出几个ping,如果没有收到回应,它就变为“bad”,可以把它从路由表中删除。

KPRC Protocal

1. ping

注意这里的ping,不是你用cmd黑框框里面的ping。这个请求主要用户询问对方是否在线,比较简单,主要用于维护自己路由表里面的节点。

2. find_node

顾名思义,find_node就是为了查询节点,它根据对方节点的id询问DHT网络,收到这个请求的节点,会把自己路由表中与该节点距离最接近的8个节点返回。

3. get_peers

get_peers用于查找一个资源hash对应的peer,它询问路由表中与该hash最接近的8节点,收到该请求的节点如果发现自己知道对应的peer,返回这些peer的信息,否则返回它自己路由表中跟该hash最近的8个节点信息。发起get_peers的节点在收到peer信息了,则跟peer建立连接,正式开始下载文件片段。如果收到的是节点信息,则选出这些节点中跟hash最近的几个节点,递归的get_peers,直到发现peer。有两种情况要控制这种递归的返回:1. 超时,在一定时间内如果没有发现peer,则放弃。2. 已经发现了跟该hash最近的节点,但它没有peer信息。

4. announce_peer

announce_peer用于在自己get_peers发现peers之后发送,发送的对象是先前回复过自己get_peers的节点,告诉对方自己发现了peer,你们也可以“备份”一下,减小整个网络查询该hash的次数。

磁力链接

以前一个种子对应一个文件,现在一个hash对应一个文件,通过hash构造的磁力链接就可以下载一个文件。磁力链接的构造方式如下:

magnet:?xt=urn:btih:{hash}

磁力链接中的hash就是一个40个字符组成的字符串,由20字节的hash计算得来:

1

2

3

4

5

6

7

8

9

public static string ToHexString(byte[] hash)

{

    var sb = new StringBuilder();

    foreach (var b in bytes)

    {

        sb.Append(b.ToString("X2"));

    }

    return sb.ToString();

}

例如构造了一个磁力链接:magnet:?xt=urn:btih:EAE833FFE5A06B42B9B8C3F239660B537579C8A3 ,用迅雷打开后,迅雷就会下载对应的种子,然后下载该资源。

用.NET开发的磁力搜索引擎-crowh相关推荐

  1. 高效的磁力搜索引擎 -_高效的企业测试-结论(6/6)

    高效的磁力搜索引擎 - 该系列的最后一部分将涵盖其他端到端测试,生产中的测试以及各部分的结论. 进一步的端到端测试和生产中的测试 除了仅验证单个被测应用程序并模拟外部问题的系统测试之外,我们的管道还必 ...

  2. 几款磁力搜索引擎,找资料更方便

    Bt177.info 一款强大的磁力搜索引擎网站,这款网站包含有7万多个磁力链接,提供提供网盘形式和磁力形式的储存,有很多你想要的东西.如果是音频和视频的话支持在线观看. Bt977 磁力搜索引擎,支 ...

  3. 垂直搜索开发:垂直搜索引擎开发全过程[原创]

    //http://blog.csdn.net/chengg0769 转载保留此行 //这只是我随笔涂鸦,我并不是一个完整实践者,只是准备如此施行.勿笑话我. //070817增加忠告部分:070823 ...

  4. 开发自己的搜索引擎读书笔记——搜索引擎与信息检索、Lucene入门

    这部分是在读<开发自己的搜索引擎>第二版,邱哲.符滔滔.王学松编著,人民邮电出版社,的随手笔记与猜想.若有不足之处还请不吝赐教,以不断完善之. 搜索引擎与信息检索 信息检索的过程: 构建文 ...

  5. 业余时间开发的磁力链在线云播安卓app 欢迎大家体验

    1.磁力链搜素封装了一些比较知名的磁力搜索引擎 2.点击就能在线转码播放 3.资源全面 播放速度还行 欢迎大家下载体验 https://pan.baidu.com/s/1pLgyQzL 转载于:htt ...

  6. 开发自己的搜索引擎--Lucene 2.0+Heriterx(目录)

    第一篇  搜索引擎入门 第1章  搜索引擎与信息检索    1 1.1  搜索引擎的历史    1 1.1.1  萌芽:Archie.Gopher    1 1.1.2  起步:Robot(网络机器人 ...

  7. python语言磁力搜索引擎源码公开,基于DHT协议,十二分有技术含量的技术博客...

    之前我在写百度网盘爬虫,百度图片爬虫的时候答应网友说,抽时间要把ok搜搜的的源码公开,如今是时候兑现诺言了,下面就是爬虫的所有代码,完全,彻底的公开,你会不会写程序都可以使用,不过请先装个linux系 ...

  8. 使用Lucene开发自己的搜索引擎

    1.下载Lucene开发包,请到:http://lucene.apache.org/ 2.在myeclipse环境部署该开发包: 3.代码编写: package Lucene;import java. ...

  9. Lucene.Net+盘古分词-开发自己的搜索引擎

    //封装类 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Luc ...

最新文章

  1. Windows 10全新分支版本曝光!专门优化高配置PC
  2. python PyQt5中文教程☞【第八节】PyQt5控件(II)
  3. Django默认用户认证系统和用户模型类
  4. ubuntu下安装proxychains
  5. linux安装外部软件,科学网—Madagascar 软件安装方法(Ubuntu下,适用于其他Linux系统) - 罗飞的博文...
  6. 二十个方法鼓励自己最有效
  7. python 表格格式输出_简单介绍python输出列表元素的所有排列形式
  8. js函数、事件、补充知识
  9. vue 时间插件_Vue插件丨vxe-table初体验
  10. Scrapy0.24.1_中文文档
  11. Java | PTA练习:伪随机数题解
  12. 用winpcap实现局域网DNS欺骗之一(基础知识)
  13. 高等代数_证明_对称矩阵属于不同特征值的特征向量正交
  14. 批量剔除consul无效服务
  15. 下一代防火墙(NGFW)已死!
  16. linux电脑外放没声音,告诉你Ubuntu扬声器无声的解决方法及命令
  17. 拓嘉辰丰电商:拼多多所属哪种电商模式
  18. 002 Figuring in C/C++
  19. C语言 队列(循环队列和链队初始化进出队等基本操作)
  20. 无线射频专题《无线局域网排错,第二层重传问题3@多径现象》

热门文章

  1. [影评]错的时间和对的人
  2. Matcher类中方法简介说明
  3. Google网站管理员工具删除网址功能一定要慎用
  4. 好客租房129-百度地图api3使用步骤
  5. 高性能游戏本搭服务器,高性能游戏本盘点,玩游戏拒绝卡顿!
  6. 【web前端】JavaScript实现图片幻灯片滚动播放动画效果
  7. php 多维数组怎么去重,php数组去重的方法
  8. netty实现网络推送
  9. 揭秘信用卡套现三种方法 手续费为套现额的10%
  10. 22-05-19 西安 javaweb(04) xml、DOM4J,Xpath、 tomcat应用服务器、HTTP协议