Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581120
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: C/C++

2015-04-10 15:56:56

这篇文章接着上一篇  [C++,BitTorrent] torrent 文件解析之 B 编码
3. 分析 Tracker 回复信息

    3.1 Tracker 接到的 GET 请求信息中包含的字段有哪些?
        
      从上面的思维导图可以看出,客户端在通过解析 .torrent 文件,从中获得 announce 后的 URL 地址之后,
     就会向 URL 标定的 Tracker 发送请求下载资源的请求信息。而这个请求信息便是我们常说的 资源下载端发往 Tracker 的GET 请求信息。
    GET 信息是 HTTP 中的一种,
 请求信息中的字段描述如下

名称 作用
peer_id 每个向Tracker发送请求下载资源信息的下载端都通过一个随机生成的 id 号码来唯一的标识自身,
该id号码长度不变为 20 个字节
port 发送请求信息的请求下载端通常也会接受来自其他下载同一个共享文件的
其他下载对等端(peer)的数据,这个port 用于表示当前请求下载端与peer 进行连接的端口号码
uploaded 记录当前下载端总共上传了多少数据,以字节为单位
downloaded 记录当前的下载端总共下载了多少的数据,以字节为单位
left 记录当前下载端下载的资源文件还有多少没有下载到本地,字节为单位
compact 当前的下载端为了提高数据传输率,不仅从Tracker获取数据,
还会从正在从 Tracker 上下载同一个共享文件的端点也就是对等端(peer)发送请求下载数据的信息。
而对等端(peer) 的网络地址和端口号 都是通过 Tracker 获取的, 
那么 Tracker 以何种方式来返回呢? 这个时候就需要用到 compact 了,
如果将 compact 的数值置为 1 的话,那么,Tracker 将会把当前下载端的 peer 地址
存放到一个 6 个字节的字段中,其中 ip 地址占用 4 个字节, 端口号 port 占用 2 个字节
 
event 这个变量用于记录当前请求信息下载端向 Tracker 发送消息的类型,取值有 三个
started , completed , stopped 
event 若是 started 表明的是,此信息为请求下载端首次与 Tracker 连接
event 若是 completed  表明的是,此信息为请求下载端将所有的文件块下载完毕,
结束与 Tracker 的连接。
event 若是 stopped 表明,请求下载端(客户端)还没有将所有的数据下载完就首先关闭连接,
Tracker 接收到此类型信息之后,也会将于客户端的连接进行关闭
    ip
(可选字段)
Tracker 可以通过此变量信息来获取请求下载端(客户端)的ip地址,
也可以通过分析来自客户端的ip数据报获得,所以该字段是可写可不写的。
numwant
(可选字段)
在Tracker 接收到请求下载端向其发送的请求对等端的IP地址与端口号的请求的核实后,
会根据请求下载端发送信息中的 numwant 数值来决定将多少个对等端的发送
给请求下载者,该数值默认为 50 ,是可选可不选的,若没有特殊要求,不写它就会按照 50 进行返回。
如果有特殊的要求,则通过 numwant 既可以对原有默认的 50 数值进行更改
info_hash
该字段与种子文件 .torrent 文件中的 info 的关键字是一一对应的。
key
(可选项)
功能与 peer_id 是相同的,普通功能中不会用到,若是基于 DHT 的话可能需要它
trackerid
(可选项,一般不用)
这个记录的是 Tracker 的标号,用于从备用 Tracker 上下载资源的情况,基本无用

例子:知道了上述字段的不同含义之后,我们来看一个实际的例子:

点击(此处)折叠或打开

  1. info_hash=034234456789&peer_id=5434534537890123456789&port=1027&compact=1&upload=0
  2. &download=0&left=17892332&event=started

关键字都已经使用红色字体标出来,可以对照上面表格中的记录进行分析
 
本文的重点并不是 GET 请求信息的分析,因为这个很好懂,重点是 Tracker 回复给请求下载资源端的、经过 B编码的 、Tracker回复信息。

3.2 分析 Tracker的 回复信息中信息字段有哪些?



Tracker 回复给请求下载端的信息全都是经过 B 编码编码的,回复信息本身便是一个 dict (字典结构的信息段),
其中的各个字段类型与含义描述如下:
关键字/名称 B编码类型 功能/含义
failure reason
用于描述等待下载端向 Tracker 发送信息出错的描述信息
warning message 字符串类型 用于描述等待下载端向 Tracker 发送信息警告的描述信息
interval 整型类型 i...e 用于记录当前等待下载端下一次与和 Tracker 连接之前需要等待的时间,单位是秒(整数)
min interval 整型类型 i...e 用于记录当前待下载端下一次和Tracker 连接之前需要等待的最小时间,单位是秒
incomplete 整型类型 i...e 用于记录从当前的Tracker 下载共享文件还没有下载所有的文件块的请求下载端的个数
complete 整型类型 i...e 用于记录从当前的 Tracker 下载共享文件已经全部下载完成的请求下载端的个数
tracker id 字符串类型 用于Tracker 唯一标识自己的 ID 号码,类似于请求下载端的 peer_id 字段的含义
peers 字符串类型 
<字符串长度>:<字符串内容>
该字段是Tracker 在接收到请求下载端发送的请求 peer IP:port 信息之后,
将 peer 信息回复给请求下载端。
在这里需要注意的就是:peers后面的 以字节的格式存放,共占位 6 个字节
 ip 占位前4 个字节,port 占后 2 个字节
所以这个 peers后面的字符串长度数值一定是 6 的整数倍。
tracker response 字典类型 tracker reponse 关键字在回复信息中是不可见的,
之所以这么表示是为了让使用者清楚,tracker response message 是字典类型 d....e

例子:


点击(此处)折叠或打开

  1. d
  2.  8:complete            i 210 e
  3.  10:incomplete         i 120 e
  4.  8:interval            i 3400 e
  5.  5:peers               3600:......
  6. e
从上面的 Tracker 回复的信息中可以抽取出有用的信息为:
1.在当前这个 Tracker 上已经完成下载完整的共享文件的客户端有 210 个
2.没有结束下载完整的共享文件的客户端的数目由 120 个
3.接收到该 Tracker 回复信息的客户端如果中途与 Tracker断开连接的话,需要再等待 3400 秒之后才能与该 Tracker 再次连接
3.与接收该 Tracker 回复信息的客户端下载 Tracker 上同一个共享文件的对等端的信息(ip:port) 被存放在 peers 字段后面的字符串中,
 其字符串的长度为 3600 个字节,由于上面客户端的GET 信息的字段中 "compact=1",所以这 3600 个字节中,每个 ip:port 占位 6 个字节
一共发来了 60 个 peer 端的 ip:port 信息, 前面的 4 个字节为 peer 的 IP 地址, 后面的 2 个字节为 peer 的 port 数值。

 end
阅读(1794) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~