BitTorrent 协议规范(BT协议集合)二二

用C语言开发一个BT下载软件(一) ------ BitTorrent协议 -1 BitTorrent(简称BT)是一个文件分发协议,每个下载者在下载的同时不断地向其他下载者上传已下载的数据。它是属于一个应用层的协议。   基于BT协议的文件分发系统由以下几个实体构成: 一个web服务器一个种子文件一个Tracker服务器一个原始文件提供者一个网络浏览器 若干个下载者       web服务器上保存着种子文件。种子文件又称为元文件或metafile,它保存 阅读详情
昨天重新读了BT协议和客户端代码,发现对协议本身部分比较熟悉了,但是对BT在实际运行期间各种行为的发生情景还非常模糊,有些步骤还想清楚,大家一起来讨论一下.

我们来一起描述一下BT各种消息的发送情景. 有些不是特别肯定的我没有加上,大家在这个基础上进行增加或者修改.

其中client指本机上运行的BT客户端.peer指tracker返回的远程客户端.
piece指torrent文件中的20byte SHA1 hash代表的数据段. block指每次向其他peer请求的数据段(子分片).

[3-16更新]
1. client->tracker的GET消息.
<1>第一次启动后发送(携带event为started).
<2>以后根据tracker reponse中的interval定时发送.
<3>某种事件发生(stopped, completed)时发送.
<4>需要更多的peer列表时发送.

2.tracker->client的reponse
<1>每次收到client的GET请求后发送.

3.client->peer的handshake消息
<1> client主动向peer发起TCP连接并成功建立,client主动发起handshake.
<2> peer主动向client发起TCP连接并成功建立, client收到peer的handshake后回应handshake.

4.peer->client的handshake消息
<1> peer主动向client发起TCP连接并成功建立,peer主动发起handshake.
<2> client主动向peer发起TCP连接并成功建立, peer收到handshake的handshake后回应handshake.

5.client->peer的bitField消息
<1> 如果client主动发起连接,client收到peer的handshake回应后,发送bitField消息.
<2> 如果peer主动发起连接,client回应完handshake后发送bitField消息.

6.peer->client的bitField消息
<1> 如果peer主动发起连接,peer收到client的handshake回应后,发送bitField消息.
<2> 如果client主动发起连接,peer回应完handshake后发送bitField消息.

7.client->peer的keep-alive消息
<1>定时发送(2分钟一次)

8.peer->client的keep-alive消息
<1>定时发送(2分钟一次)

9.client->peer的choke消息
<1> 每隔30秒扫描一次peer列表,对不符合条件??的peer发送choke ???
<2> 如果接到peer的无效request请求,向peer发送choke

10.peer->client的choke消息
<1> 每隔30秒扫描一次peer列表,对不符合条件??的peer发送choke ???
<2> 如果接到client的无效request请求,向client发送choke

11.client->peer的unchoke消息
<1> 每隔30秒扫描一次peer列表,对符合条件??的peer发送unchoke ???

12.peer->client的unchoke消息
<1> 每隔30秒扫描一次peer列表,对符合条件??的peer发送unchoke ???

13.client->peer的interested消息
<1> 收到peer的bitField消息后,根据本地情况进行判断是否向peer发送interested消息.
<2> 收到peer的have消息后,根据本地情况进行判断是否向peer发送interested消息.

14.peer->client的interested消息
<1> 收到client的bitField消息后,根据本地情况进行判断是否向client发送interested消息.
<2> 收到client的have消息后,根据本地情况进行判断是否向client发送interested消息.

15.client->peer的not interested消息
<1> 收到peer的bitField消息后,根据本地情况进行判断是否向peer发送not interested消息.
<2> 收到peer的piece消息后,根据本地情况进行判断是否向peer发送not interested消息.

16.peer->client的not interested消息
<1> 收到client的bitField消息后,根据本地情况进行判断是否向client发送not interested消息.
<2> 收到client的piece消息后,根据本地情况进行判断是否向client发送not interested消息.

17.client->peer的have消息
<1>client下载某个piece完成并且校验后发送.

18.peer->client的have消息
<1>peer下载某个piece完成并且校验后发送.

19.client->peer的request消息
<1>client收到peer的unchoke消息,根据本地情况进行判断是否向peer发送request
<2>client收到peer的have消息,根据本地情况进行判断是否向peer发送request
<3>client收到peer的piece消息,根据本地情况进行判断是否向peer发送request

20.peer->client的request消息
<1>peer收到client的unchoke消息,根据本地情况进行判断是否向client发送request
<2>peer收到client的have消息,根据本地情况进行判断是否向client发送request
<3>peer收到client的piece消息,根据本地情况进行判断是否向client发送request

21.client->peer的piece消息
<1>client收到peer的request消息后,并且发现自己并没有choke对方时发送.

22.peer->client的piece消息
<1>peer收到client的request消息后,并且发现自己并没有choke对方时发送.

23.client->peer的cancel消息
<1>client在即将完成下载阶段(endgame),向所有peer发送request消息(是向所有没有choke自己的peer??), 如果某个peer最先返回了请求的block(piece消息),则向其他未返回的peer发送cancel消息.

也就是说这个阶段client端还是可能收到重复的block.

24.peer->client的cancel消息
<1>peer在即将完成下载阶段(endgame),向所有peer发送request消息(是向所有没有choke自己的peer??), 如果某个peer最先返回了请求的block(piece消息),则向其他未返回的peer发送cancel消息.
也就是说这个阶段如果client还没有给peer发送piece消息,那么会收到cancel消息.
并且可能在client刚刚给peer发送出piece消息后就收到了cancel消息.

以上的场景描述都是基于个人理解,可能有些地方是错误的,希望大家指出来.

另外对于client端在什么时候开始发送request请求(主动发送还是被动发送),还有就是如何进行上载速率控制(对那些peer分配多少上载带宽,本地上载带宽限制)等问题,我还比较模糊,希望大家指教.尤其象小马哥这样的分析过源码的DX多多发言.

问题:
1.在libBT中,收到unchoke消息后,也会发送interested/not interested消息,但是我觉得没有必要这样做,在bitField/have消息后更新状态已经保证了每个peer的interested/not interested状态真实有效.
2.什么情况下认为一个peer应该被choke/unchoke?
3.client初始化为 local_interested = 0 //client对peer不感兴趣
local_choking = 1 //client is choking peer
remote_interested = 0 //peer对client不感兴趣
remote_choking =1 //peer is choking client
因此,应该说client是在收到某个peer的unchoke后才开始从这个peer处下载.然后根据不停的have消息和piece消息完成从某个peer处的连续下载.
问题在于什么条件下remote peer会给client发送unchoke?? 相同的问题也就是client什么情况下会给peer开始发送unchoke消息??
从code中可以看到,每个定长时间(30 seconds),检查哪些peer符合unchoke条件(Client没有被peer怠慢,并且Peer对Client感兴趣).但是每个peer的初始状态被设置为了怠慢. 所以不知道如何才能让client去unchoke peer??? 
BT协议分析  一 BT系统的组成结构  1 普通的Web服务器:   例如Apache或IIS服务器2 一个静态的种子文件:   即.Torrent文件,采用Bencoding编码3  Tracker服务器:        追踪下载同一文件的用户4 终端用户的Web浏览器:用于下载种子文件5  BT客户端:            例如BitCommet,BitSpirit 二 阅读详情

相关推荐

torrent-piece:洪流片抽象

激流片 洪流片抽象 也可以在带有的浏览器中使用! 和使用此模块。 安装 npm install torrent-piece 用法 const Piece = require ( 'torrent-piece' ) Piece . BLOCK_LENGTH // 16384 const pieceLength = Piece . BLOCK_LENGTH * 5 const piece = new Piece ( pieceLength ) piece . missing // 81920 piece . reserve ( ) // 0 piece . set ( 0 , someBuffer0 ) piece . reserve ( ) // 1 piece . reserve ( ) // 2 piece . reserve ( ) // 3 piece . set ( 1 , so

封BT的一些常见用法

封BT一些网吧用聚生网关或P2P终结者之类的软件,这都是治标不治本的,网吧防ARP双绑MAC后都没用了,还影响网络稳定,我总结了一些限制BT的方法系统使用“TCP/IP筛选”对话框里选择“启用TCP/IP筛选”的复选框,然后把左边“TCP端口”上的“只允许”选上就可以了使用注册表禁止p2p程序运行:Windows Registry Editor Version 5.00[HKEY_CU

休休的专栏 2244

国央企创新负责人如何通过平台实现科研成果的快速识别与转化?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

bt协议详解 基础篇(上)

bt协议详解 基础篇(上) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待。 1 简介 bt是BitTorrent协议的简称,bt协议是最流行的p2p下载协议,另外一种比较流行的p2p下载协议叫ed2k,ed2k的全称叫eDonkey2000 network,这里我们只讨论bt协议...

weixin_33890526的博客 849

别再为域名备案发愁了!微信小程序后端调用,试试这个‘官方捷径’——云托管

本文介绍了微信小程序后端部署的新思路——利用微信云托管服务绕过域名备案难题。通过详细的环境准备、数据库配置、服务部署和小程序端调用方案,帮助开发者快速实现小程序与后端服务的无缝对接,大幅缩短上线周期并降低运维成本。

weixin_29243279的博客 673

微信内置浏览器抓包全攻略:从ADB配置到Chrome调试(附常见问题解决)

本文提供了一套完整的微信内置浏览器抓包与调试解决方案。从ADB工具的深度配置与稳定性连接开始,详细讲解了如何开启X5内核调试开关,并利用Chrome DevTools建立远程连接。文章重点剖析了Network面板进行网络请求抓取、性能分析和问题定位的实战技巧,并附带了设备连接失败、无网络请求等常见问题的排查指南,帮助开发者高效解决微信H5页面调试难题。

gitlab7runner的博客 543

P2P-BT对端管理协议(附BT协议1.0)

对端管理 指的是远端peer集合的管理(虽然自身client也可以视为一个peer,但对端管理不包括自身peer) 一个客户端(client)必须维持与每一个远程peer连接的状态信息,即1V1关系(本端对某个远端peer) 在本代码中PcPeer指这种1V1关系,而不是仅指远程peer 对于每个连接连接来说,每一端的peer应该是4种状态之一:一端是interested或者not...

hgy413的专栏 7449

PINN——加入物理约束的神经网络

【摘要】 基于物理信息的神经网络(Physics-informed Neural Network, 简称PINN),是一类用于解决有监督学习任务的神经网络,它不仅能够像传统神经网络一样学习到训练数据样本的分布规律,而且能够学习到数学方程描述的物理定律。与纯数据驱动的神经网络学习相比,PINN在训练过程中施加了物理信息约束,因而能用更少的数据样本学习到更具泛化能力的模型。本文主要解析这种神经网络以...

qq_39444290的博客 4583

BT下载原理简介

1.   BT下载原理简介 BT是一种用来进行文件下载的共享软件(不是“变态”),全名叫"BitTorrent"。BitTorrent是一个多点下载的源码公开的P2P软件,使用非常方便,就像一个浏览器插件,很适合新 发布的热门下载。其特点简单的说就是:下载的人越多,速度越快 。   一般来讲,下载是把文件由服务器端传送到客户端,例如FTP,HTTP,PUB等等。工作原理如下图: 但是

hemeinvyiqiluoben的专栏 3万+

AFSim插件开发实战:从环境搭建到功能扩展

本文详细介绍了AFSim插件开发的完整流程,从环境搭建到功能扩展,涵盖了SDK配置、插件创建、核心代码解析、功能扩展实战、调试优化以及高级开发技巧。通过实战案例和实用技巧,帮助开发者快速掌握AFSim插件开发,提升仿真系统的扩展性和灵活性。

weixin_29309475的博客 576

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 466

Linux BT下载(6)-BT下载实现的关键算法和策略

BT下载实现的关键算法和策略 流水线作业

cslqm 1852

2026从0到1!C#工控机开发实战指南:新手一周就能跑通的完整项目

这篇文章摘要如下: 工业自动化领域工控机开发入门指南,针对零基础开发者提供从环境搭建到项目实战的全流程指导。文章首先解答工控机开发的3个核心问题,比较工控机与普通PC的区别,推荐使用C#作为开发语言。随后详细讲解开发环境配置、四大核心技术栈(通信协议、数据库、UI框架、多线程),并重点演示Modbus TCP通信的实现。最后通过一个完整的温度监控系统项目实战,展示如何用WPF构建实时数据采集界面,包括Modbus通信类编写、数据采集服务实现等关键代码片段。全文采用图解+代码的方式,帮助开发者快速掌握工控系统

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 702

Nordic SDK15.3 主动断开Bug

蓝牙开发问题分享

一头小笨驴的博客 1431

使用AutoDL云服务器训练YOLO计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤

AutoDL AI算力云是一个提供人工智能算力服务的云平台。丰富的GPU资源:提供多种GPU型号,包括NVIDIA的A100A800L40V100RTX 4090RTX 3090等,能满足我们在不同场景下的需求,无论是进行大规模的AI训练还是复杂的科学计算等任务,都可以找到合适的GPU资源。灵活的付费方式:支持按量付费包日包周包月等多种付费模式。对于短期的实验或不确定时长的项目,可以选择按量付费;如果有长期稳定的算力需求,预付费或包周包月则可能更划算,可以根据自己的需求和预算进行选择。集成主流框架:集成了。

Limiiiing的博客 957

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1844

BT协议各种消息

1. 客户端与一个peer建立TCP连接后,首先向peer发送握手消息,peer收到握手消息后回应一个握手消息。 l     握手消息是一个长度固定为68字节的消息。消息的格式如下: 消息格式中一些参数的含义如表13-9所示。 表13-9                                                               握手消息

xidianliusoftware的专栏 2121

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

bt协议分析

BitTorrent协议特征分析 1、概述 BitTorrent(简称BT)是一种文件分发协议,属于P2P协议。它通过URL识别内容并且和网络无缝结合。它在HTTP平台上的优势在于,同时下在一个文件的下载者在下载的同时不断互相上传数据,使文件源可以在很有限的负载增加的情况下支持大量下载者同时下载。 一 BT系统的组成结构   1 普通的Web服务器:   例如Apache

程序狗的成长之路 8907

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

NORDIC softDevice 蓝牙协议栈初始化程序分析(蓝牙主机,ble_central)

基于 NORDIC softDevice 蓝牙协议栈 S132 蓝牙角色: 主机,ble_central 应用主函数 main() 中必须的函数:     ble_stack_init();     gatt_init();     db_discovery_init();     scan_start(); int main(void) { // Initialize. ...

Hansen Mi Blog 5532

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

nrf51822 断开蓝牙连接

调用该方法就可以主动断开蓝牙的连接 sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);

xujianc的博客 3700

BitTorrent下载协议的译文

转载自:http://www.winu.cn/space-14160-do-blog-id-6532.html 简单地说BT协议就是多点多段多线程同时下载。 从速度上来说,网络速度 以常见的宽带网络为例,无论是ADSL还是小区局域网,基本上以100k起,这里是指字节传输速度,即每秒种传输100k字节。如何发挥这100k的速度就需要一个比较好的算法。 下载算法分这几个

n70joey的专栏 1759

BitTorrent协议规范

鉴定 BitTorrent是由布莱姆·科恩设计的一个端对端(peer to peer)文件共享协议,此协议使多个peers通过不可信任的网络的文件传输变得更容易。 目的 此规范的目的是详细介绍 BitTorrent 协议规范 v1.0 。Bram 的协议规范网站 http://www.bittorrent.com/protocol.html 简要地叙述了此协议,在部分范围缺少详细的行

dps game 1796

Linux BT下载(12)-消息处理模块

消息处理模块 消息处理模块由message.h和message.c组成,负责根据当前的状态生成并发送消息,接收以及处理消息。 #ifndef MESSAGE_H #define MESSAGE_H #include "peer.h" int int_to_char(int i, unsigned char c[4]); /

cslqm 807

java解析bt协议详解_bt协议详解 基础篇(下)

bt协议详解 基础篇(下)最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待。1 简介bt是BitTorrent协议的简称,bt协议是最流行的p2p下载协议,另外一种比较流行的p2p下载协议叫ed2k,ed2k的全称叫eDonkey2000 network,这里我们只讨论bt协议,ed...

weixin_34684094的博客 1031

BitTorrent协议分析二

 接一 客户端与一个peer建立TCP连接后,首先向peer发送握手消息,peer收到握手消息后回应一个握手消息。 l     握手消息是一个长度固定为68字节的消息。消息的格式如下: &lt;pstrlen&gt;&lt;pstr&gt;&lt;reserved&gt;&lt;info_hash&gt;&lt;peer_id&gt; 消息格式中一些参数的含义如表13-9所示。 表13-...

p312011150的博客 1257

bt peer通信协议报文格式

接下来协议的所有报文采用如下的结构:。length prefix(长度前缀)是一个4字节的大端(big-endian)值。message ID是单个十进制值。playload与消息相关。 l  keep-alive: keep-alive消息是一个0字节的消息,将length prefix设置成0。没有message ID和payload。如果peers在一个固定时间段内没有收到任何报文(k

Dablekai的专栏 2060
上一篇: BitTorrent 协议规范(BT协议集合)二一
下一篇: BitTorrent 协议规范(BT协议集合)二三
Pregunta
博客等级 码龄23年 6粉丝 19原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值