转自: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协议的详细分析的更多相关文章

  1. BT协议分析(1)—1.0协议

    简述 BT下载是采用P2P的下载方式,下载的大致形式采用如下图所示,处于图示中心的称为Tracker服务器,其余称为Peer.   缺点 1.资源的安全性 2.资源的实效性(没有上传者则BT也将失效) ...

  2. bt协议详解 DHT篇(上)

    bt协议详解 DHT篇(上) 最近开发了一个免费教程的网站,突然产生了仔细了解bt协议的想法,这篇文章是bt协议详解系列的第三篇,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的 ...

  3. HashMap 源码详细分析(JDK1.8)

    一.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...

  4. LinkedHashMap 源码详细分析(JDK1.8)

    1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...

  5. ArrayList 源码详细分析

    1.概述 ArrayList 是一种变长的集合类,基于定长数组实现.ArrayList 允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,其会通过扩容机制重新生成一个 ...

  6. 网络协议抓包分析——IP互联网协议

    前言 IP协议是位于OSI模型的第三层协议,其主要目的就是使得网络间可以相互通信.在这一层上运行的协议不止IP协议,但是使用最为广泛的就是互联网协议. 什么是IP数据报 TCP/IP协议定义了一个在因 ...

  7. 一个DOS攻击木马的详细分析过程

    一个DOS攻击木马的详细分析过程 0×01 起因 网路流量里发现了大量的的1.exe的文件,而且一直在持续,第一感觉就像是一个木马程序,而且每个1.exe的MD5都不一样,对比发现只有几个字节不一样( ...

  8. 黑暗幽灵(DCM)木马详细分析

    黑暗幽灵(DCM)木马详细分析 0x00 背景 只要插上网线或连上WIFI,无需任何操作,不一会儿电脑就被木马感染了,这可能吗?近期,腾讯反病毒实验室拦截到一个“黑暗幽灵”木马的新变种,该木马功能强大 ...

  9. 新手向:从不同的角度来详细分析Redis

    最近对华为云分布式缓存产品Redis做了一些研究,于是整理了一些基本的知识拿出来与大家分享,首先跟大家分享的是,如何从不同的角度来详细使用Redis. 小编将从以下9个角度来进行详细分析,希望可以帮到 ...

随机推荐

  1. WinCE启动失败的原因与解决办法分析

    本文通过一个真实的嵌入式项目进行说明.文中的嵌入式系统用的是ARM处理器+WinCE平台,项目的目的是要把WinCE平台从旧版本移植到WinCE6.0平台上.但结果是这个WinCE系统在启动的时候经常 ...

  2. Android开发之MediaPlayer和SurfaceView组成视频播放器

    SurfaceView 使用双缓冲技术 是个重量级的组件 只要不可见,就不会创建,可见时,才会创建 只要不可见,就会销毁 SurfaceView一旦不可见,就会被销毁,一旦可见,就会被创建,销毁时停止 ...

  3. mysql运算符的优先级

    Operator precedences are shown in the following list, from highest precedence to the lowest. Operato ...

  4. Ehcache和MemCached比较分析

    项目 Memcache Ehcache 分布式 不完全,集群默认不实现 支持 集群 可通过客户端实现 支持(默认是异步同步) 持久化 可通过第三方应用实现,如sina研发的memcachedb,将ca ...

  5. 【转】Android动态改变对 onCreateDialog话框值 -- 不错不错!!!

    原文网址:http://www.111cn.net/sj/android/46484.htm 使用方法是这样的,Activity.showDialog()激发Activity.onCreateDial ...

  6. 【转】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 ...

  7. ps一般常用的快捷键

    jpg 不支持透明和半透明 :网页中的大图,高清图(体积大) gif 支持透明 不支持半透明 :网页中的小图标(动画图片)png8 支持透明 不支持半透明 :网页中的小图标png24 支持透明 支持半 ...

  8. iOS开发之UILabel

    UILabel是iOS开发中常用的一个组件,主要用来显示内容. UILabel的主要使用如下: /*尺寸*/ CGRect labelRect = CGRectMake(100, 100, 80, 4 ...

  9. unix network programming(3rd)Vol.1 [第2~5章]《读书笔记系列》

    13~22章 重要 第2章 传输层: TCP/ UDP / STCP (Stream Control Transmission Protocol) TCP 可靠,有重传机制,SYN队列号 UDP 不可 ...

  10. 用Apache Kafka构建流数据平台

    近来,有许多关于“流处理”和“事件数据”的讨论,它们往往都与像Kafka.Storm或Samza这样的技术相关.但并不是每个人都知道如何将这种技术引入他们自己的技术栈.于是,Confluent联合创始 ...