【转】bt协议的详细分析
转自:https://baoz.net/bt-protocol/
一 BT系统的组成结构
1 普通的Web服务器: 例如Apache或IIS服务器
2 一个静态的种子文件: 即.Torrent文件,采用Bencoding编码
3 Tracker服务器: 追踪下载同一文件的用户
4 终端用户的Web浏览器: 用于下载种子文件
5 BT客户端: 例如BitCommet,BitSpirit
二 种子文件
1 格式介绍
种子文件采用bencoding编码,整个文件包含以下关键字:
announce: Tracke服务器的UR以字符串)。
announce-list(可选): 备用Tracker服务器列表(列表)。
creation date(可选): 种子创建的时I司。
comment(可选): 备注(字符串)。
created by(可选): 创建人或创建程序的信息(字符串)。
Info: 一个字典结构,包含文件的主要信息,分二种情况:单文件结构或多文件结构
单文件结构如下:
length: 文件长度,单位字节(整数)。
md5sum(可选): 长32个字符的文件的MD5校验和,BT不使用这个值,只是为了兼容一些程序所保留!(字符串)。
Name: 文件名(字符串)。
Piece length: 每个块的大小,单位字节(整数)。
Pieces: 每个块的20个字节的SHAT Hash的值(二进制格式)。
多文件结构如下:
files: 一个字典结构。
Length: 文件长度,单位字节(整数)。
md5sum(可选): 同单文件结构中相同。
Path: 文件的路径和名字,是一个列表结构,如test\test.txt列表 为 14:test8test.txte
Name: 最上层的目录名字(字符串))o
Piece length: 同单文件结构中相同。
Pieces: 同单文件结构中相同。
2 Bencoding编码规则:
(1)字符串编码:<字符串长度>:<字符串>
例如字符串spam被编码为4:spam
(2)整数编码: i<整数>e
例如数字23表示为i23e,-23表示为i-23e,0为i0e
(3)列表编码: 1<Bencoding编码类型>e
例如l4:spam4:eggse表示两个字符串“spam”,“eggs”
(4)字典编码: d<Bencoding字符串><Bencoding编码类型>e
例如d3:cow3:moo4:spam4:eggse表示{“cow“=“moo“, “spam“=“eggs“}
d4:path3:C:\8:filename8:test.txte表示{“path”=”C:\”,”filename”=”test.txt”}
3 文件举例(以下是用记事本打开.torrent文件)
d8:announce40:udp://tracker.bitcomet.net:8080/announce13:creation datei1175422660e8:encoding3:GBK4:infod6:lengthi7080818e4:name18:gettingoveryou.mp310:name.utf-818:gettingoveryou.mp312:piece lengthi1048576e6:pieces140:琚瀲⒂!堯??M挷咲i?屩轩@鏋EU轒50-?鷰靀F?@憸%l?Iy~ ??R?襉軦d[1]f岤\>@陗罏?樯燐#o?翟木懣槾”霡瓼W?棈Dk鰛殴鴞?チY庖}0!$苶 7:privatei1ee13:publisher-url7:http://19:publisher-url.utf-87:http://e
三 BT系统的通信过程(没有采用DHT时)
BT客户端通过种子文件获得相关信息,在下载过程中定期与Tracker服务器交互(通过http协议或者https协议)。Tracker定期从下载者处接受信息,并返回一个Peers列表。
下载者周期性的向Tracker登记,Tracker根据各个下载者的登记信息不断更新Peers列表。因此BT客户端定时的向Tracker发出获取Peers列表的请求,以便客户端能获得更快、更多的Peers,使得它的下载速度更快。
BT客户端之间根据Peers列表的信息,向相应的BT客户端发起连接,下载需要的部分,从而实现了各个客户端之间的相互通信。这种连接是基于TCP的BT对等协议。
四 Tracker查询
Tracker通过HTTP的GET命令的参数来接收信息BT客户单发送给Tracker服务器GET请求,包含一下关键字:
Info_ hash: 种子文件中info部分的SHA-1 (Secure Hash Algorithm 1) , 20字节长。每一个片断都采用SHA-I,当BT客户端每下载完一个片断,都需要验证数据的正确性。
PeerId: 下载者的ID,一个20字节长的字符串。每个下载者在开始一次新的下载之前,随机创建一个ID 。
IP(可选): 给出了peer的IP地址。
Port: peer所监听的端口。下载者通常在在6881端口上监听,如果该端口被占用,就会尝试6882,如果还被占用,那么会一直尝试到6889,如果都被占用,那么就放弃监听。
Uploaded: 已经上载的数据大小。
Downloaded: 已经下载的数据大小。
Left: 该Peer还有多少数据没有下载完。
Event(可选):值可以为started, completed或stopped之一
五 Tracker响应
BT客户端向Tracker查询后,Track会发出响应。响应是用Bencoding编码的字典。
1 如果响应中有关键字failure reason,则表示查询失败,其值为一个字符串,解释失败原因。不再有其它关键字。
2 否则有两个关键字:
Interval: 两次发送请求的时间间隔
Peers: 一个字典的列表,每个字典包括一下关键字Peer Id , IP , Port,分别对应Peer所选择的ID, IP地址。
六 BT对等协议
是基于TCP的应用层协议,用于Peer之间交换信息。连接后两个Peer之间是对称的,数据可以双向传送。当一个Peer下载完一个片段后,就会向所有Peer宣布它拥有了这个片段。包括一下几个消息:
1 Handshake消息
2 Bitfield消息
3 Have消息
4 Request消息
5 Cancel消息
6 Choke消息
7 Interested消息
8 keep-alive消息
注:在没有采用DHT(Distributed Hash Table或Dynamic Hash Table)技术时,对等体之间的互相发现需要通过Tracker服务器,因此如果没有Tracker服务器,BT客户端就不会获得新加入的用户的信息, 速度会受很大影响甚至根本无法下载。现在很多BT软件采用DHT技术的Kad算法,可以不通过服务器实现对等体之间的相互定位与发现,例如电驴就采用了 kad网络。
参考网站:http://www.bittorrent.org/
【转】bt协议的详细分析的更多相关文章
- BT协议分析(1)—1.0协议
简述 BT下载是采用P2P的下载方式,下载的大致形式采用如下图所示,处于图示中心的称为Tracker服务器,其余称为Peer. 缺点 1.资源的安全性 2.资源的实效性(没有上传者则BT也将失效) ...
- bt协议详解 DHT篇(上)
bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...
- HashMap 源码详细分析(JDK1.8)
一.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...
- LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
- ArrayList 源码详细分析
1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...
- 网络协议抓包分析——IP互联网协议
前言 IP协议是位于OSI模型的第三层协议,其主要目的就是使得网络间可以相互通信.在这一层上运行的协议不止IP协议,但是使用最为广泛的就是互联网协议. 什么是IP数据报 TCP/IP协议定义了一个在因 ...
- 一个DOS攻击木马的详细分析过程
一个DOS攻击木马的详细分析过程 0×01 起因 网路流量里发现了大量的的1.exe的文件,而且一直在持续,第一感觉就像是一个木马程序,而且每个1.exe的MD5都不一样,对比发现只有几个字节不一样( ...
- 黑暗幽灵(DCM)木马详细分析
黑暗幽灵(DCM)木马详细分析 0x00 背景 只要插上网线或连上WIFI,无需任何操作,不一会儿电脑就被木马感染了,这可能吗?近期,腾讯反病毒实验室拦截到一个“黑暗幽灵”木马的新变种,该木马功能强大 ...
- 新手向:从不同的角度来详细分析Redis
最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...
随机推荐
- WinCE启动失败的原因与解决办法分析
本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...
- Android开发之MediaPlayer和SurfaceView组成视频播放器
SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...
- mysql运算符的优先级
Operator precedences are shown in the following list, from highest precedence to the lowest. Operato ...
- Ehcache和MemCached比较分析
项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将ca ...
- 【转】Android动态改变对 onCreateDialog话框值 -- 不错不错!!!
原文网址:http://www.111cn.net/sj/android/46484.htm 使用方法是这样的,Activity.showDialog()激发Activity.onCreateDial ...
- 【转】1.5 起步 - 初次运行 Git 前的配置
原文网址:http://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5-%E5%88%9D%E6%AC%A1%E8%BF%90%E8%A1%8C-Git-%E5%8 ...
- ps一般常用的快捷键
jpg 不支持透明和半透明 :网页中的大图,高清图(体积大) gif 支持透明 不支持半透明 :网页中的小图标(动画图片)png8 支持透明 不支持半透明 :网页中的小图标png24 支持透明 支持半 ...
- iOS开发之UILabel
UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 4 ...
- unix network programming(3rd)Vol.1 [第2~5章]《读书笔记系列》
13~22章 重要 第2章 传输层: TCP/ UDP / STCP (Stream Control Transmission Protocol) TCP 可靠,有重传机制,SYN队列号 UDP 不可 ...
- 用Apache Kafka构建流数据平台
近来,有许多关于“流处理”和“事件数据”的讨论,它们往往都与像Kafka.Storm或Samza这样的技术相关.但并不是每个人都知道如何将这种技术引入他们自己的技术栈.于是,Confluent联合创始 ...