转自: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. 【HDOJ】2890 Longest Repeated subsequence

    后缀数组的应用.和男人八题那个后缀数组差不多. /* 2890 */ #include <iostream> #include <sstream> #include <s ...

  2. bzoj2245

    这道题还是比较简单的费用流,由于w是递增的 实际上,这题数据还可以强一点,比如说分段函数不保证费用递增, 就要加一点技巧了(要保证函数的顺序) ; type node=record        ne ...

  3. 【MooTools】

    MooTools a compact javascript frameworkhttp://mootools.net/docs/core 30天学会 MooTools 教学(1): 认识MooTool ...

  4. Button的四种Click响应方法

    Button用得挺多的,在这整理了下它的事件处理方法,发现实现方法还不少,我比较喜欢第二种,你呢,最常用哪一种? 实现一: Button bt_Demo = (Button)findViewById( ...

  5. C++ 文件操作(CFile类)

    原文:文件操作(CFile),C吉羊 一.Visual C++编程文件操作 有如下方法可进行操作: (1)使用标准C运行库函数,包括fopen.fclose.fseek等. (2)使用Win16下的文 ...

  6. 《深入Java虚拟机学习笔记》- 第19章 方法的调用与返回

    <深入Java虚拟机学习笔记>- 第19章 方法的调用与返回

  7. Android中Bitmap和Drawable,等相关内容

    一.相关概念 1.Drawable就是一个可画的对象,其可能是一张位图(BitmapDrawable),也可能是一个图形(ShapeDrawable),还有可能是一个图层(LayerDrawable) ...

  8. HDU 1255 覆盖的面积 线段树+扫描线

    同 POJ1151 这次是两次 #include <iostream> #include <algorithm> #include <cstdio> #includ ...

  9. 【树莓PI】下载机

    sudo app-get install ntfs-3g  读写ntfs格式的磁盘 mount -t ntfs /dev/sda4 /mnt/usb -o nls=utf8,umask=0 fdisk ...

  10. 寒假训练第九场 Brocard Point of a Triangle

    题意:求布洛卡点坐标 思路:直接利用布洛卡点的性质.http://pan.baidu.com/s/1eQiP76E #include<cstdio> #include<cstring ...