众所周知,当我们想要下载一个盗版电影或者是某些不可描述的东西的时候,首先会去寻找这个资源的磁力链接,然后通过迅雷或者百度网盘等方式下载资源。那么,磁力链接到底是什么呢?又是如何通过一个磁力链接来获取资源的呢?

在了解磁力链接之前,我们先了解一下BitTorrent。

BitTorrent

以下是维基百科对于BitTorrent的解释

BitTorrent协议(简称BT,俗称比特洪流、BT下载)是用在对等网络中文件分享的网络协议程序。和点对点(point-to-point)的协议程序不同,它是用户群对用户群(peer-to-peer),而且用户越多,下载同一文件的人越多,下载该文件的速度越快。且下载后,继续维持上传的状态,就可以“分享”,成为其用户端节点下载的种子文件(.torrent),同时上传及下载。

BitTorrent是一个协议,就像是计算机网络中的HTTP协议那样。他通过DHT来保存拥有资源的客户端的信息。

以下是百度百科对于DHT的解释。

DHT全称叫分布式哈希表(Distributed Hash Table),是一种分布式存储方法。在不需要服务器的情况下,每个客户端负责一个小范围的路由,并负责存储一小部分数据,从而实现整个DHT网络的寻址和存储。

从中我们可以了解到DHT是分布式的,也就是说资源并不存储在某一个特定的服务器上,而是分布在整个DHT网络之中。

在DHT网络之中,客户端被称为Node,拥有资源的客户端被称为Peer。所有的客户端和资源都有一个160位(20字节)的id,主机叫NodeId,资源叫InfoHash。举个栗子:4D9FA761D69964B00DF0B3B0C9C1F968EA6C47D0。可以看到,id由40个16进制位组成,也就是20字节。

等等,我们加点东西,magnet:?xt=urn:btih:4D9FA761D69964B00DF0B3B0C9C1F968EA6C47D0,这不就是磁力链接嘛!是的,其实磁力链接就是InfoHsah加上前面的一串东西。我们来看看这串东西的意思:

  • magnet:协议名。
  • xt:exact topic的缩写,包含文件哈希值的统一资源名称。BTIH(BitTorrent Info Hash)表示哈希方法名,这里还可以使用ED2K,AICH,SHA1和MD5等。这个值是文件的标识符,是不可缺少的。
  • urn:(Uniform Resource Name, URN 表示资源名
  • btih:BitTorrent info hash,种子散列函数

由此,第一个问题得到了解答,我们来看第二个问题,也是本章的重点:迅雷是如何通过磁力链接获取资源的?

要回答这个问题,我们得深入了解一下BitTorrent协议

通过磁力链接获取资源

在BitTorrent协议中有4种操作:

ping

用来检查Node状态,用以更新Routing table。

find_node

通常是用来初始化Routing table,因为一开始,Routing table是空的,我们需要通过向公共节点发送find_node来填充之。

get_peers

当用户要下载种子资源时向其它Node发起。如果Node有该资源,则返回资源的下载端口以供对方下载,如果没有,则根据异或算法在自己的Routing table中寻找离资源最近的Node返回给对方,对方如此递归发送get_peers,直到找到资源为止。

announce_peer

当一个用户下载完种子资源,种子开始下载时通知所有曾经get_peers咨询过的node。

上面提到了一个概念:Routing table,路由表。在DHT网络中, 每个节点都会维护一张路由表,用来存储离别的节点的信息。节点与节点之间的距离并不是物理上的距离,而是逻辑上的距离,这个距离通过异或算法来得到。

所以,迅雷其实是实现了这个BitTorrent协议,通过get_peers来获取存储资源的节点,然后向他们请求资源。下载资源的用户可能会把资源存储在本机中,让自己也成为一个peer,这也就是为什么下载一个资源的用户越多,下载速度就越快。

恰饭时间

我用Node实现了一个基于BitTorrent协议的BT种子搜索器,有兴趣的童鞋可以看看,如果觉得还不错的话,麻烦点一个star,谢谢了~

huajiayi/node-bittorrent​github.com

获取文件哈希值_迅雷是如何通过磁力链接获取资源的?相关推荐

  1. 获取文件哈希值_图解:什么是哈希?

    为什么要有哈希? 假设我们要设计一个系统来存储将员工手机号作为主键的员工记录,并希望高效地执行以下操作: 插入电话号码和相应的信息.(插入) 搜索电话号码并获取信息.(查找) 删除电话号码及相关信息. ...

  2. 获取文件哈希值_浅谈查找---哈希查找

    在上一篇综述中,我给出了排序是为了更快的查找这个观点.也介绍了查找的一些典型应用场景如: 1.判断一个给定值,是否在一个数组 2.mysql 的查询优化 3.再到给定a.b两个文件,各存放50亿个ur ...

  3. 获取文件哈希值_关于哈希的一切,都在这里了

    前言 本文收录于专辑:http://dwz.win/HjK,点击解锁更多数据结构与算法的知识. 你好,我是彤哥. 上一节,我们一起学习了,在Java中如何构建高性能队列,里面牵涉到很多底层的知识,不知 ...

  4. QT学习记录 --- 获取文件哈希值

    前言 本来想阐述一番,想了一哈,实在没啥说的,直接上代码了- 获取文件哈希函数 bool Widget::FileHash(QString srcDir) //参数为目标文件路径 {QFile fil ...

  5. python中的content方法_content最新:python计算Content-MD5并获取文件的Content-MD5值方式_爱安网 LoveAn.com...

    关于"content"的最新内容 聚合阅读 这篇文章主要介绍了python计算Content-MD5并获取文件的Content-MD5值方式,具有很好的参考价值,希望对大家有所帮助 ...

  6. 使用 Solid 私有化存储 IPFS 文件哈希值

    背景 星际文件系统 IPFS(InterPlanetary File System)是一个面向全球的.点对点的分布式文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将 ...

  7. golang 获取文件的MD5值

    golang 获取文件的MD5值 调用下面的函数(输入参数是文件的路径,如/home/user/test.txt),即可获取指定文件的MD5值. func GetFileMD5(pathName st ...

  8. JAVA 获取文件的MD5值大小以及常见的工具类

    1 /** 2 * 获取文件的MD5值大小 3 * 4 * @param file 5 * 文件对象 6 * @return 7 */ 8 public static String getMD5(Fi ...

  9. c++判断文件是否被修改(获取文件的MD5值)

    需求分析 因为项目中需要检测一个文件是否被篡改,我采用了监测文件的MD5值. MD5,简单地来说,就是文件的"指纹".如果原始文件被修改了,那么MD5值也就会跟着发生变化,所以我们 ...

  10. linux 查看文件哈希码,使用linux的sha1sum命令查看效验文件哈希值命令

    服务器 今天小编给大家分享的是使用linux的sha1sum命令查看效验文件哈希值命令,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧.一定会有所收获的哦. sha1 ...

最新文章

  1. 爬虫:获取页面 -- request库的使用
  2. hdu 2586 How far away ?
  3. java decompiler_Java Decompiler(Java反编译工具)
  4. ejb能调用另一个ejb吗_异步EJB只是一个Gi头吗?
  5. python 加锁_Python 共享变量加锁、释放详解
  6. 我的docker随笔:开篇
  7. vue企业门户网站模板_6 个火爆 GitHub 的后台管理模板,快来收藏!
  8. 关于left join 一些测试
  9. 人人,金山西山居,腾讯互娱,微信,网易游戏offer及面经(转)
  10. 本特利监控卡件3500/42M/128229-01后模块
  11. python怎么激活_Python窗口激活
  12. 三、生成树协议(Spanning Tree Protocol,STP)
  13. CSDN下载频道2013下半年超人气精华资源汇总
  14. 人工智能的逆向工程--反向智能研究综述
  15. jQuery遍历li节点
  16. collection集合 厂家_一篇搞定Java集合类原理-WEB资讯专栏-DMOZ中文网站分类目录
  17. 一个月薪10000的北京程序员的真实生活
  18. HJ42 学英语(递归)
  19. 智能卡操作系统—COS概述
  20. [BZOJ 1095] [ZJOI2007]Hide 捉迷藏——线段树+括号序列(强..)

热门文章

  1. new function()理解
  2. 精灵图(雪碧图)一招解决定位难问题,再也不用猜位置或者ps测距离了
  3. 第十一届hackathon落地啦:百度截图识字
  4. java验证码kaptcha_spring整合kaptcha验证码的实现
  5. 余额表前后台操作和对应sql
  6. java实现头脑王者辅助答题_头脑王者2答题神器app-头脑王者2答题辅助神器安卓版v1.0...
  7. 萤石云监控地址视频播放
  8. 上海理工大学HVAC综合实验室(图)
  9. 接口测试用例生成工具介绍及应用
  10. If you already have a 64-bit JDK installed 解决方法