上一篇中,我们已经实现了对tracker的访问,从而获取到了peer对等体的ip地址以及端口号。我们这一篇要实现的是对等体之间的通讯。

在bt种子下载中,对等体就是正在下载你需要文件的另一台主机或提供下载你需要文件的主机。每一个种子一开始都是有一个做种者做种,将种子,或磁力链发布到网上,提供给其他用户下载,上传的种子如果被其他人下载了。这时做种者即使退出,种子同样可以在网络上传播,因为已下载的用户又会自动充当种子的提供者,提供后来用户下载,就和种子一样,开花,结果,又产生新的种子。
在bt协议中,每个用户,既是下载者又是种子的提供者。所以bt协议种资源不在一个网站上,而是在对等体中。我们只需要与对等体在bt协议下进行通讯,即可获得资源。

part1对等体协议包
参见这篇论文 https://www.docin.com/p-1038423389.html
基本上是这篇论文里提到的11种格式,但是我抓包还发现了两种格式

           4bytes 1byte Xbytes port    1+X   9      端口号 4bytes 1byte Xbytesextended 1+X    20   extended

可能还有其他的包格式,但是基本的结构都是

 4bytes      1byte       Xbytes 1+X     包种类编号   内容

为了安全起见,代码中还是要预留一个未知包的处理情况

判断包种类的流程是
1.从输入流中读取4个字节(Head)
2.判断前4个字节是否为0,为0表示心跳包(主要为了维持tcp连接,防止tcp连接因长时间为响应断开,可以选择不做处理,后面另外开一个线程专门处理心跳包),否则再读取一个字节
3.通过这个字节判断包种类,1-9,default,对不通包设置不同的处理函数
4.读取Head-1长的字节。

part2对等体通讯协议基本流程
1.建立tcp连接
2.发送握手请求包
3.接收对方的握手请求包
4.检查握手请求包,主要检查hash检验值(磁力链特征码)是否和你需要下载的文件一致
5.如果一致,发送己方bitfield包
6.接收对方的bitfield包
7.检验bitfield包长度是否正确
8.比较己方和对方的bitfield包,如果对方含有己方没有的piece片段,发送interested包,反之,发送uninterested包
9.等待对方的unchoke包。若收到unchoke包即可进行请求交互。
10.发送request请求,请求需要资源片段
11.如果request请求合法,对方将发送给你piece包,piece包中包含了资源片段。非法的话对方会choke你的。
12.检验资源片段是否正确,正确者存入磁盘,反之,重新发送请求
13.重复10,11,12,即可获取资源

上面是站在请求资源角度情况下一对一的主要流程。实际情况下,
1.对方也会向你发送请求(每个用户既是下载者又是提供者),倒过来对方也会通过以上流程向你发送请求。
2.一般而言bt下载是一对多的,这样下载快。不太可能只从一个用户获取资源。
3.还有许多可能的错误情况需要处理,上面只是理想情况下的流程

所以实际上还是有些复杂的。主要需要用到的知识是 一些并发编程的知识。

基本思路,
主程序开两种线程,检验下载是否完成的线程,socket连接线程,socket线程里包含三条线程,心跳包线程,发送信息线程,接收信息线程。
目前初步实现了socket线程,代码放最后,以后继续完善

贴上实验结果



由于只和一个peer进行交互,下了半天,才下了10片段。等全部下载完成后,将所有文件按照种子文件里各文件的排序,以及各文件长度,将资源切分合并成对应格式即可(比如原来种子中显示资源中有100字节的文本,200M的视频,我们自需要将piece文件对照切分,前100各字节打包成txt文本,后200M打包成视频文件)。

ps:在编写代码中我碰到了几个问题,这里记录下来
1.tcp连接除非是对方主动shutdown,否则在inputstream中是不会读到结尾标识-1的,所以在tcp交互时,不要以-1作为一次读取的结尾标志。我一开始就以为每次发送数据都会有结尾标识符,然后一直read timeout。现在理解起来tcp交互的模型和管道通讯有点像。
2.在第二篇我们通过tracker获取的ip地址,一般情况下80%以上的我们是访问不了的。为了快捷找到可用对等体进行测试,可以利用比特彗星(比特彗星下载后360会提示木马,我没理它,现在用着也没问题,大概没问题的吧2333)查看。
3.根据实验发现,内网可访问的对等体数目比较少(不知道是网络原因还是需要tcp打洞?),我连接室内移动的wifi时一些无法访问的ip,在换成外部电信网就好多了。
4.包格式一定要对

代码
https://github.com/yyyhah/BtDownload/blob/master/Connection/ConnectionThread.java

想做个磁力链搜索引擎 3相关推荐

  1. 想做个磁力链搜索引擎 2

    上一篇我们已经解析出种子的基本结构.下一个问题就是,如何通过种子文件所给的信息,获取文件的下载地址. 上一篇中我们解析种子发现有两个键比较特殊,分别时announce以及announce-list 这 ...

  2. 想做网络推广浅析网站的快照不更新是由哪些因素导致的?

    想做网络推广的优化人员们都知道,百度快照对随着网站的内容更新二更新,其更新的速度也会和网站更新的速度成正比,不过有时候,你发现网站也在更新,但快照怎么就没更新呢?下面想做网络推广就带大家一起来了解一下 ...

  3. 想做网络推广教你如何快速通过SEO考核期呢?

    想做网络推广表示,在网站优化的过程中,都是要经历过"沙盒期"才能获得更好地优化效果.而"沙盒期"就是对网站各方面考核督查的一个阶段,只要过了这个阶段,网站做的优 ...

  4. mysql教学磁力链_使用MySQL存储以太坊事件

    在本文中,我将演示一种缓存以太坊事件的简单方法.我只想说,通常我们将事务用于链下操作,例如跟踪令牌的传输或检索特定事务的筛选列表,就像一个SQL查询一样. 假设我们想要创建一个跟踪令牌传输的网站,Et ...

  5. 想做钢铁侠?听说很多大佬都是用它入门的

    作者:HelloGitHub-Anthony 你是否想过成为一名 Geek,就像"野生钢铁侠"稚晖君那样自己能做出各种新奇有趣的电子设备,却不知道从哪里入手.如何开始?今天我们不聊 ...

  6. 想做网络推广浅析网站优化中标题该如何设置?

    在对网站优化的过程中,标题也是非常重要的一部分,因为标题位置所能聚集的权重和得到的排名也是非常重要的,那么对于网站的关键词,想做网络推广优化人员们都该如何进行设置,又需要注意到哪几点呢? 1.标题精准 ...

  7. # 解析bt文件_BT、磁力链这些词语是什么意思?

    "知其然知其所以然".我们经常在下载资料的时候能看到BT.磁力链等词语,这些词语到底是什么意思呢? 下载都会用,但是你了解吗? BT下载 传统的下载模式是每个客户端从服务器拷贝文件 ...

  8. 应届生,你为什么那么想做产品经理

    近一个月以来,知乎上不停有应届生私信我请教如何在校招拿到产品offer,一开始我都会耐心地给予指导,但是随着问得人越来越多,我会慢慢地产生了疑问:为什么现在这么多应届生会想做产品经理,这种现象背后的原 ...

  9. 做锤子区块链手机的4种方法(行业观察)

    为了避免区块链变成皇帝的新衣,趁还没有被皇帝穿上时,我觉有必要发声当个傻小孩也是不错的,这不,可怜的老罗就被人套路进去了,做锤子区块链手机啊! 很久没有更新文章,是觉目前这个状态下似乎很少有人喜欢研究 ...

  10. 开发一个从磁力链取得影片截图的命令行工具

    开发了一个不需要下载磁力链里的整个影片,可以对磁力链(或种子)里面的影片进行截图的Node命令行工具.我们来聊聊相关的技术点吧. 日常,一个经常性遇到的问题就是:有个种子(或磁力链)摆在你面前,要先下 ...

最新文章

  1. Java注解---通俗易懂
  2. MIT与商汤科技成立人工智能联盟
  3. Python3-面向对象编程
  4. 如何从官方渠道下载Spring MVC所需jar包
  5. 二叉树的层次遍历_【腾讯面试热身题】二叉树层次遍历(动画展示)
  6. 如何在一分钟内搞定面试官
  7. http://java.sun.com/jsp/jstl/core cannot be resolved(含有jstl1.2jar包网盘)
  8. 【刷算法】LeetCode- 两数之和 1
  9. 数据库 case when then 的用法 (举个栗子~~~)
  10. 看到抖音上 Python 工程师晒的工资条,我沉默了.....
  11. 去掉QQ2008的腾讯迷你首页和聊天时的广告
  12. java new 关键字到底做了什么?
  13. 聆听音乐-推荐好听的歌曲
  14. python如何实现微信自动聊天_如何利用python实现微信智能聊天功能,具体该怎么做?...
  15. 因为工资补贴邮件被划空银行卡?搜狐全体员工被诈骗始末
  16. python把四个图画在一个窗口_python plt多个图在同一窗口显示方法
  17. C语言低配版扫雷游戏
  18. k8s - containerd 磁盘清理
  19. TM1668兼用VK1668 SOP24/SSOP24 应用于VCR.DVD 等产品的显示驱动
  20. PSO粒子群算法调节PID控制器参数

热门文章

  1. 使用keras训练一个区分不同人声音的模型
  2. 使用spss求标准化的线性回归方程
  3. 史上最全的程序员常用英语词汇 珍藏版
  4. 三大检索工具(SCI、EI、ISTP)
  5. android黑科技系列——手机端破解神器MT的内购VIP功能破解教程
  6. postman删除workspace
  7. 开源流媒体SRS结合硬件视频实时转码服务器的部署
  8. 使用百度网盘自动同步Zotero的文献
  9. 12306 终于随随便便撑起洪峰流量了,全面拥抱Redis 6.x!
  10. 帆软客户画像分析与客户价值模型