文件bt怎么打开(百度网盘里的BT怎么打开)

历史早期的BT下载主要是通过开放网站发布种子资源。利用tracker中心服务器完成下载对等体的交换,最终从下载用户的计算机上获取资源。在这个过程中,有两个相对危

历史

文件bt怎么打开(百度网盘里的BT怎么打开)

早期的BT下载主要是通过开放网站发布种子资源。利用tracker中心服务器完成下载对等体的交换,最终从下载用户的计算机上获取资源。

在这个过程中,有两个相对危险的点:

第一个发布种子的网站,种子文件包含了要下载资源的所有信息,很容易检测出种子内容是否合规,从而关闭种子发布资源网站。

提供追踪器的第二个中心服务节点也很容易从种子中找到,很容易被阻塞。P2P的免费分享环境被打破。

在此基础上,有一些新的方法来代替tracker服务器和seed。我们简单介绍一下分散追踪器的P2P共享网络和种子共享网站。

激流和磁铁

首先,从获取种子的第一步开始,我们一般都是想找一部电影/游戏或者其他一些资源,一般是在线搜盘,或者去BT站、PT找种子,或者在论坛上找链接。首先,介绍一下种子和磁链的关系。种子通常以索引文件结尾。激流。

torrent

D8:announce 62:https://xxxxx . im . XXX/88696 DC 48 CBD ad 7518 E4 b 111 b 83 ee 77 c 7:comment 14:torrent GUI。ORG10:创建者13:uTorrent/ 221013:创建日期1523099215e8:编码5:UTF-84:info D6:length I 23715250176 E4:Name 14:sky hunter。ISO 12:件数长度i 4194304E6:件数113100: XXX此序列化信息是种子。bencode的第二部分是简介。

反序列化主要包含以下信息:

announce:Tracker的主服务器announce-list:Tracker服务器列表comment:种子文件的注释comment.utf-8:种子文件注释的utf-8编码creation date:种子文件建立的时间,是从1970年1月1日00:00:00到现在的秒数。encoding:种子文件的默认编码,比如GB2312,Big5,utf-8等info:所有关于下载的文件的信息都在这个字段里,根据下载的是单个文件还是多个文件,子字段的项目会不同。files:表示文件的名字,大小,该字段包含如下三个子字段:length:文件的大小,用byte计算path:文件的名字,在下载时不可更改path.utf-8:文件名的UTF-8编码,

多文件Torrent的结构树形图如下

多档torrent├─announce├─announce-list├─comment├─comment.utf-8├─creationdate├─encoding├─info│├─files││├─length││├─path││└─path.utf-8│├─na me│├─name . utf-8│├─片长├─pieces│├─publisher-URL│├─publisher-URL . utf-8│─publisher . utf-

单文件torrent├─announce├─announce-list├─comment├─comment.utf-8├─creationdate├─encoding├─info│ ├─length│ ├ ─name│ ├ ─name.utf-8│├─piece长度│├─件数│├─发行商│├─发行商-网址│ ─发行商-网址. utf-8 └ ─发行商. utf-8 └ ─节点磁铁为了解决第一个种子文件包含太多内容信息的问题,很容易检测出关键信息。第二个种子文件太大,不容易传播和共享。有一个代替种子文件的信息字符串,它是一个磁性链接。形状:磁铁:?XT = urn:btih:b 7d 9 b 9d 9 df 8d 7678 af 1 f 2542677 e 195 fdb db 1674

其中主要领域是btih。实际上,这里的值是bt种子文件中info字段的sha1值的base32编码字符串。

bencode

种子文件的bencode包含四种类型的代码:

string类型

字符串类型的编码格式为[长度]:[字符串]。以字符串的长度开始,添加一个冒号,以字符串的内容结束。

例子:& # 34;abc & # 34= & gt3:abc

int类型

int类型的编码格式是I [int] e,以I开头,加数字,以e结尾。

示例:123 = >i123e

List<object>类型

列表& ltobject & gt类型的编码格式是l [object] e,以l开头,加上列表中每个元素的代码(BEncoding也支持元素的类型),以e结尾。

示例:列表

Dictionary<string, object>类型

字典& lt字符串,对象& gttype的编码格式是d [key-valuepair] e,以d开头,加上字典中每个键值对的代码,以e结尾。

示例:字典

以上代码列表和字典支持嵌套。Bencode编码也用于后续BT查询消息的构造。

分散对等交换网络

在分散交换网络上,每个用户(节点)都会存储一些种子信息和种子索引信息。这些索引信息包括你正在下载的资源(peer),你正在下载的身边的资源(peer),以及一些可能有一些子资源的信息(node)。当我们得到某个种子或者磁链的时候,我们会去这个网络查询有哪些用户在下载这个种子的资源,得到这些用户的对等体信息(包括ip端口令牌),然后和这些对等体连接得到资源。在查询的过程中,krpc主要用于调用,这是一种基于udp的rpc调用服务。

krpc

基本结构如下:

{ "t & # 34:"aa & # 34,-transactionid 2^16两个字节& # 34;y & # 34:"r & # 34,-消息类型查询-& gt;q回应-& gt;r错误-& gt;e & # 34q & # 34:""。-ping find _ node get _ peers & # 34;r & # 34:{} "e & # 34"一& # 34;:-query params } KRPC消息由独立的字典组成,其中2个关键字包含在所有消息中,其余的附加关键字取决于消息类型。每条消息都包含“t”关键字,这是表示事务ID的字符串类型。事务ID由请求节点生成,应答中要包含echo字段,所以应答可能对应一个节点的多个请求。事务ID应该编码为一个短的二进制字符串,例如2个字节,它可以对应于2 ^ 16个请求。每个KRPC消息包含的另一个关键字是“y”,它由一个表示消息类型的字节组成。对应y有三种值:q表示请求,r表示回复,e表示错误。

它主要包括以下四种操作:

ping

检测节点是否处于活动状态。

最基本的请求是ping。"q & # 34="平& # 34;,ping请求有一个参数& # 34;id & # 34,其值是一个20字节的字符串,包含网络字节排序的发送方的节点ID。对ping的适当回复有一个关键字& # 34;id & # 34一个,包含发送答复的节点的节点ID。

参数:{ & # 34;id & # 34: "& lt查询节点id & gt"}回应:{ & # 34;id & # 34: "& lt查询的节点id & gt"}示例Packetsping查询= { & # 34;t & # 34:"aa & # 34, "y & # 34:"q & # 34, "q & # 34:"平& # 34;, "一& # 34;:{"id & # 34:"abcdefghij0123456789 & # 34} } bencoded = D1:ad2:id20:abcdefghij 0123456789 e 1:Q4:ping 1:T2:aa1:y1:qeResponse = { & # 34;t & # 34:"aa & # 34, "y & # 34:"r & # 34, "r & # 34: {"id & # 34:"mnopqrstuvwxyz123456 & # 34} } encoded = D1:RD2:ID20:mnopqrstuvwxyz 123456 e 1:T2:AA1:Y1:Redind _ Node查找节点。

Find_node用于查找具有给定ID的节点的联系信息。这时& # 34;q & # 34== "查找节点& # 34;。find_node请求包含两个参数。第一个参数是id,它包含请求节点的ID。第二个参数是target,它包含请求者正在寻找的节点的ID。当一个节点收到find_node的请求时,它应该给出相应的回复,其中包含两个关键字id和节点。nodes是字符串类型,包含被请求节点的路由表中K(n)个最近节点的联系信息。在标准的DHT网络中,K(n)的推荐值是8。

参数:{ & # 34;id & # 34: "& lt查询节点id & gt", "目标& # 34;: "& lt目标节点的id & gt;"}回应:{ & # 34;id & # 34: "& lt查询的节点id & gt", "节点& # 34;: "& lt压缩节点信息& gt"}示例Packetsfind _ node Query = { & # 34t & # 34:"aa & # 34, "y & # 34:"q & # 34, "q & # 34:"查找节点& # 34;, "一& # 34;: {"id & # 34:"abcdefghij0123456789 & # 34, "目标& # 34;:"mnopqrstuvwxyz123456 & # 34} } Ben coded = D1:ad2:id20:abcdefghij 01234567896:target 20:mnopqrstuvwxyz 123456 e 1:q9:find _ node 1:T2:aa1:y1:qeResponse = { & # 34;t & # 34:"aa & # 34, "y & # 34:"r & # 34, "r & # 34: {"id & # 34:"0123456789abcdefghij & # 34, "节点& # 34;: "def456..."} } encoded = D1:rd2:id20:0123456789 abcdefghij 5:node S9:def 456...e1: t2: aa1: y1: reget _ peers查找文件对等点。

Get_peers与torrent文件的infohash相关。这时& # 34;q & # 34="get _ peers & # 34。get_peers请求包含两个参数。第一个参数是id,它包含请求节点的ID。第二个参数是info_hash,表示torrent文件的infohash。如果被请求的节点有对应于info_hash的对等节点,它将返回一个关键字values,这是一个列表类型的字符串。每个字符串包含& # 34;compact IP-地址/端口信息& # 34;格式中的对等信息。如果被请求的节点没有这个infohash的对等节点,它将返回关键字nodes,其中包含被请求节点的路由表中最接近info_hash的k个节点。

参数:{ & # 34;id & # 34: "& lt查询节点id & gt", "info _ hash & # 34: "& lt目标torrent的20字节info hash & gt;"}回应:{ & # 34;id & # 34: "& lt查询的节点id & gt", "token & # 34:"& lt不透明写令牌& gt", "价值观& # 34;: ["& lt对等1信息字符串& gt", "& lt对等2信息字符串& gt"]}或者:{ & # 34;id & # 34: "& lt查询的节点id & gt", "token & # 34:"& lt不透明写令牌& gt", "节点& # 34;: "& lt压缩节点信息& gt"}示例Packetsget _ peers Query = { & # 34t & # 34:"aa & # 34, "y & # 34:"q & # 34, "q & # 34:"get _ peers & # 34, "一& # 34;: {"id & # 34:"abcdefghij0123456789 & # 34, "info _ hash & # 34:"mnopqrstuvwxyz123456 & # 34} } Ben coded = D1:ad2:id20:abcdefghij 01234567899:info _ hash 20:mnopqrstuvwxyz 123456 e 1:q9:get _ peers 1:T2:aa1:y1:qeResponse with peers = { & # 34;t & # 34:"aa & # 34, "y & # 34:"r & # 34, "r & # 34: {"id & # 34:"abcdefghij0123456789 & # 34, "token & # 34:"aoeusnth & # 34, "价值观& # 34;: ["axje.u & # 34, "idhtnm & # 34]} } bencoded = D1:rd2:id20:abcdefghij 01234567895:token 8:aoeusnth 6:values l6:axje . U6:idhtnmee 1:T2:aa1:y1:与最近节点的重新响应= { & # 34;t & # 34:"aa & # 34, "y & # 34:"r & # 34, "r & # 34: {"id & # 34:"abcdefghij0123456789 & # 34, "token & # 34:"aoeusnth & # 34, "节点& # 34;: "def456..."} } encoded = D1:rd2:id20:abcdefghij 01234567895:node 9:def 456...5:token 8:AOE USS 1:T2:aa1:y1:announcement _ peer发起请求节点。

该请求用于指示发出announce_peer _ peer请求的节点正在某个端口下载torrent文件。Announce_peer _ peer包含四个参数。第一个参数是id,它包含请求节点的ID;第二个参数是info_hash,包含infohash种子文件的;第三个参数是port包含一个整数端口号,表示peer下载哪个端口;第四个参数是token,它包含在前面的get_peers请求收到的回复中。接收announce_peer _ peer请求的节点必须检查这个令牌是否与我们之前回复给这个节点get_peers的令牌相同。如果相同,被请求的节点将在对等联系信息中相应的infohash下记录发送announce_peer _ peer的节点的IP和请求中包含的端口号。

参数:{ & # 34;id & # 34: "& lt查询节点id & gt", "implied _ port & # 34:& lt0或1 & gt, "info _ hash & # 34: "& lt目标torrent的20字节info hash & gt;", "端口& # 34;:& lt端口号& gt, "token & # 34: "& lt不透明令牌& gt"}回应:{ & # 34;id & # 34: "& lt查询的节点id & gt"}示例packets announce _ peers Query = { & # 34;t & # 34:"aa & # 34, "y & # 34:"q & # 34, "q & # 34:"announce _ peer & # 34, "一& # 34;: {"id & # 34:"abcdefghij0123456789 & # 34, "implied _ port & # 34: 1, "info _ hash & # 34:"mnopqrstuvwxyz123456 & # 34, "端口& # 34;: 6881, "token & # 34: "aoeusnth & # 34} } Ben coded = D1:ad2:id20:abcdefghij 012345678912:implied _ porti 1e 9:info _ hash 20:mnopqrstuvwxyz 1234564:porti 6881 e 5:token 8:aoeusnthe1:q13:announce _ peer 1:T2:aa1:y1:qeResponse = { & # 34;t & # 34:"aa & # 34, "y & # 34:"r & # 34, "r & # 34: {"id & # 34:"mnopqrstuvwxyz123456 & # 34} } Ben coded = D1:rd2:id20:mnopqrstuvwxyz 123456 e 1:T2:aa1:y1:re

DHT和Kademlia

DHT(分布式哈希表)分布式哈希表,Kad网络是实现的一种方式。Kademlia协议(以下简称Kad)是PetarP公布的一项研究成果“Kademlia:基于异或度量的对等信息系统”。纽约大学的Maymounkov和David Mazieres在2002年。

nodeid

2 160位标志id,可以是本地mac的sha1值。在DHT共享网络中,资源的信息散列只有160比特。在kad网络中,info-hash存储在与其相邻的几个节点中,在查询过程中使用get_peer便于快速近似。在如何判断是否接近它的问题上,kad网络使用的是异或运算。

xor distance

卡德姆利亚分类

首先,异或是一种有效的度量方法(虽然不是欧几里得几何意义上的)。显然,d (x,x)= 0;当x不等于y时,d (x,y)>;0,并且对于任意x,y,d(x,y)=d(y,x)。异或还有三角特性:d (x,y)+d(y,z)大于等于d(x,z)。这个三角性质可以从d(x,y) ⊕d(y,z)=d(x,z)这个事实中推导出来,并且对于任何a和b大于或等于0: A+B大于或等于a ⊕b B

同时,XOR也刻画了我们基于二叉树描述的系统中隐含的距离概念。在具有160位ID的完整二叉树中,两个ID之间的距离是包含它们的最小子树的高度。当树未满时,最接近ID x的叶子是其ID和X具有最长公共前缀的叶子。如果树中有空个分支,将会有多个具有最长公共前缀的叶子。此时,基于树的空分支,我们通过反转对应于x的位来获得ID x ',因此最接近x '的叶子就是最接近x的叶子..利用异或的距离度量,最差的O(n)可以得到查询结果。

routing table

路由表是一棵二叉树,它的叶子是k桶。每个k-bucket存储具有一些公共ID前缀的节点。前缀是k桶在二叉树中的位置。所以每个K桶覆盖ID 空之间的一定范围,所有K桶加起来覆盖整个160位ID 空。

节点根据需要动态分配给路由树。起初,节点A的路由树只有一个节点——覆盖整个ID 空的单个k-bucket。当A通过find_node或get_peer获得一个新节点的联系方式时,会尝试将其插入到对应的k-bucket中。如果桶不满意,就直接插入。否则,如果k-bucket的区间范围包含A自己的节点ID,那么这个bucket将被拆分成两个新的bucket,原来的内容将被划分到这两个bucket中,然后重复插入过程。如果k桶已满并且不包含A的节点ID,则直接丢弃新的联系信息。需要注意的是,P2P节点的在线时间是不稳定的,需要定期ping每一个被k-bucket刺伤的节点,死了就淘汰。没有根据beps005规范更新的节点需要每15分钟检测一次。主动节点被认为是能够在每个krpc操作中正常响应的节点。

Kad网络中还有一个高度不平衡的二叉树均衡过程,目前在BT DHT网络中还没有使用。

BT爬虫实现要点

1.首先,假装对公共节点进行find_node查询,加入网络。

"router . BitTorrent . com:6881 & # 34;,"router . utorrent . com:6881 & # 34;,"DHT . transmission Bt . com:6881 & # 34;2.在返回的find_node中,将返回的nodeid中不在区间内的部分n位替换为返回节点的节点id,继续探索整个网络节点的分布。

func CreateRandomFindNode(目标字符串)(res []byte,transid string){ msg:= make(map[string]interface { })msg[& # 34;t & # 34] = TCIDMNGR。gettransactionid()msg[& # 34;y & # 34] = "q & # 34msg[& # 34;q & # 34] = "查找节点& # 34;msg[& # 34;一& # 34;]= map[string]接口{ } { & # 34;id & # 34:target[:15] + OwnNodeID。ToString()[15:],& # 34;目标& # 34;:target } return[]byte(package message(msg)),msg[& # 34;t & # 34].(字符串)}3。BT爬虫一般都是被动接收announce_peer _ peer,通过使用peer wire协议从对等体的信息中获取元数据,即种子信息。然后分析torrent中的信息,确认文件的内容。

4.注意ip黑名单过滤。DHT网络中有很多这样的爬虫。在实现过程中,发现北美某ip爬虫疯狂改变nodeid做find_node请求,内存已满(1G)。注意控制本地DHT表中的节点总数。

5.加速搜索过程,在获取get_peer请求时做一个递归的get_peer请求,注意控制深度。它可以扩大K桶的大小,降低二叉树的深度。

6.在使用peer wire协议的过程中,由于运营商屏蔽了P2P,很多情况下下载种子失败,可以使用知名的种子库下载info-hash。

7.注意控制udp包传递的速度,避免被主机厂商的防火墙误认为中毒。

体育锻炼

另外,关于现在的PT,禁止在PT网络中开启DHT,防止资源泄露。PT站发布的种子会包含PT站的私有追踪器服务地址,每个成员下载的种子也会包含自己的私有令牌。当种子泄露给BT时,PT管理员可以轻松屏蔽该成员的信息。PT致力于打造高端活跃的P2P分享网络。

参考数据

http://www.cs.rice.edu/Conferences/IPTPS02/109.pdf

http://www.bittorrent.org/beps/bep_0005.html

http://www.bittorrent.org/beps/bep_0003.html

http://www.bittorrent.org/beps/bep_0000.html

http://www.bittorrent.org/beps/bep_0009.html

https://wiki.theory.org/index.php/

作者:祁华伟

来源:微信微信官方账号:讯飞科技沙龙

资料来源:https://mp.weixin.qq.com/s/Y1hMesi54glenNt7n_UCiw.

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/386070.html

发表回复

登录后才能评论