Home » Code » BT客户端与Tracker服务器的交互

BT客户端与Tracker服务器的交互

接上篇《torrent种子结构解析与B编码》,客户端发送到服务器端的是普通的HTTP GET请求,先看看主要有哪些参数。

  • info_hash,必须,这是种子文件中info字典B编码后取20位长度的原始sha1值,再进行urlencode的结果;
  • peer_id,必须,这是客户端的唯一标识,不同客户端不一样,也是20位原始sha1值进行urlencode的结果;
  • port,必须,客户端使用的端口,理论上范围是1~65535,但都有个常见的范围;
  • uploaded,必须,从发送”started”事件起到目前总的上传量,单位字节;
  • downloaded,必须,从发送”started”事件起到目前的总的下载量,单位字节;
  • left,必须,还需要下载多少才能完成;
  • compact,必须,表示客户端是否接收紧密响应。一般都是1,表示接受,客户端列表由客户端串代替,此串中每个客户端都编码成 6 字节。前 4 字节是主机名(以网络的字节顺序),后两个字节是端口号(同样以网络字节的顺序)。
  • no_peer_id,可选,值为1,表示不需要其他用户的peer_id信息。compact为1一般都忽视这个;
  • event,可选,事件,如果指定该参数,值必须是started、stopped、completed三者之一。
  • —started,已开始,表示是第一次请求tracker服务器;
  • —stopped,已停止,客户端正常退出时一定会发送;
  • —completed,已完成,下载完成时一定会发送。当下载已经完成客户端再次启动开始该任务时不会再发送。
  • ip,可选,客户端的ip地址;
  • numwant,可选,客户端想要从服务器获得的peers数量;
  • key,可选,一个不与任何用户共享的另外的标识。当 IP 地址改变后,允许客户端证明它们的标识。
  • trackerid,可选。

基本的参数就这些,可选部分ip和最后两个一般是没有的。一个真实的请求如下:

uTorrent发起的请求

uTorrent发起的请求

服务器端的返回

服务器返回一个类型为”text/plain”的纯文本,包含B编码的以下字段:

  • failure reason,可选,如果有该字段,表示请求失败,其他字段都无效的了,值是可读的错误原因;
  • warning message,可选的新增加的一个字段,跟failure reason相似,但其他字段仍是有效,请求会继续;
  • interval,必须,以秒为单位,表示发送常规请求的时间间隔,也即发了一次后等待这么久后再发一次;
  • min interval,可选,最小时间间隔,告知客户端两次请求最小时间间隔不能小于此值;
  • tracker id,可选,一个字符串客户端下次请求应该发送过来的,就是上边的trackerid吧,如果之前有发送,现在这个返回的也是它,继续使用不会丢弃(实际看这个并没有);
  • complete,必须,下载完成者的数量,也即做种者数量;
  • incomplete,必须,未下载完成者的数量,也即下载者数量;
  • peers,必须,也就是关键的做种下载者信息,有两种模式,如果请求信息中compact为1可以返回二进制(brinay),否则返回字典。字典模式返回的是一个字典列表,每个字典含以下字段:
  • —peer id,必须,就是上边发送过来的peer_id;
  • —ip,必须,peer的ip地址,可以是ipv4或者ipv6;
  • —port,必须,peer的端口,就是上边发送过来的。
  • peers,如果为二进制模式,是一个普通的字符串,每个值为6字节长的这字符串,前4个字节是ip地址后2个字节是端口号,都采用网络字节序也就是大字节序。各个值连接起来。

[2015/3/30更新补充]

上边说到客户端发送到服务器端的info_hash和peer_id是原始二进制20位sha1值进行urlencode后的结果,服务器端PHP接收后确实是经过urlencode后的可读字符串,但$_GET中的值却是会被自动urldecode过的,又变回不可读的二进制乱码了($_SERVER中的是倒没有被urldecode过),所以判断长度可以直接判断,使用还得再一次urlencode。

其中有几个细节,网上根本找不到答案,自己测试得出:

那三个事件started,stopped,completed到底啥时候发生?

  • started:新建一个任务、任务由停止状态(停止任务或者直接退出客户端)再开始时发生,暂停再开始不会有;
  • stopped:停止一个任务或者直接退出客户端时发生,暂停任务不会发生;
  • completed:只有完成任务时发生。

另外,暂停任务根本不会发生任何交互。停止任务再开始,peer_id不会变,但uploaded、downloaded的值会归0,这两个值只是在一个连续的下载过程中一直变化,一旦停止再开始又都从0开始,left是按正常的一直减小。退出客户端再开始,peer_id会改变!!!uploaded、downloaded也是归0!!!

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.