BitTorrent协议规范(BitTorrent Protocol Specification)之Tracker HTTP/HTTPS Protocol-第三部分

Tracker HTTP/HTTPS Protocol
Tracker是一个响应HTTP GET请求的HTTP/HTTPS服务。这个请求包含来自客户端的度量信息,这些信息能够帮助Tracker全面地统计torrent。Tracker的响应包含一个peers列表,这个列表能够帮助客户端加入到torrent中。Base URL由元数据文件(即以.torrent为后缀的文件)中定义的announce URL组成,然后使用标准的CGI方式将这些请求参数追加到这个URL后面(CGI方式即在announce URL后面紧跟一个’?’,然后是一个以’&’分隔的’param=value’序列)。

注意:URL中的所有二进制数据(特别是info_hash和peer_id)必须适当地进行转义。这意味着不在集合{0-9, a-z, A-Z, ‘.’, ‘-’, ‘_’, ‘~’}中的字节必须以’%nn’方式编码,其中nn是这个字节的十六进制值。

对于一个20字节的散列值 “\x12\x34\x56\x78\x9a\xbc\xde\xf1\x23\x45\x67\x89\xab\xcd\xef\

x12\x34\x56\x78\x9a”,其正确的编码形式是“%124Vx%9A%BC%DE%F1%23Eg%89%AB%CD%EF

%124Vx%9A“。

Tracker Request Parameters
从客户端发送到Tracker的请求包含如下参数:

l  info_hash:URL编码的20字节SHA1散列,这个散列是元信息文件中info键所对应的值的SHA1散列。注意info键所对应的值是一个B编码的dictionary,关于info键的定义请参考我的上一篇博文。

l  peer_id:使用URL编码的20字节串,用于标识客户端的唯一ID,由客户端启动时生成。这个ID可以是任意值,甚至可能是二进制数据。目前没有生成该ID的标准准则,尽管如此,实现者必须保证该ID对于本地主机是唯一的,因此可以通过包含进程ID和启动时记录的时间戳(timestamp)来达到这个目的。关于这个字段的常用客户端编码,请参考我的下一篇博文。

l  port:客户端正在监听的端口号。为BitTorrent协议保留的端口号是6881-6889。如果不能使用该区间的数字建立端口号,客户端有可能拒绝建立连接。

l  uploaded:客户端已经上传的总量(从客户端发送’started’事件到Tracker算起),以十进制ASCII表示。尽管官方规范没有显式指定,大部分情况下是指已经下载的字节总数。

l  downloaded:已下载的字节总量(从客户端发送’started’事件到Tracker算起),以十进制ASCII表示。尽管官方规范没有显式指定,大部分情况下是指已经下载的字节总数。

l  left:客户端还没有下载的字节数,以十进制ASCII表示。

l  compact:如果设置为1,表示客户端接收压缩的响应包。这时peers列表将被peers串代替,在这个peers串中,每个peer占六个字节。这六个字节的前四个字节表示主机信息(以大端表示即以网络字节序),后两个字节表示端口号(以大端表示即以网络字节序)。需要注意的是,为了节约带宽,有些Tracker只支持返回压缩的响应包,如果没有将compact设置为1,Tracker将拒绝这个请求或者如果请求中不包括compact=0这个参数,Tracker将返回压缩的响应包。

l  no_peer_id:表示Tracker将省略peers dictionary中的id字段。如果启用compact,那么就会忽略这个选项。

l  event:如果指定的话,必须是started, completed, stopped和空(和不指定的意义一样)中的一个。如果一个请求不指定event,表明它只是每隔一定间隔发送的请求。

n  started:第一个发送到Tracker的请求其event值必须是该值。

n  stopped:如果正常关闭客户端,必须发送改事件到Tracker。

n  completed:如果下载完毕,必须发送改事件到Tracker。如果客户端启动之前,已经下载完成的话,则没有必要发送该事件。Tracker仅仅基于该事件增加已经完成的下载数。

l  ip:(可选),客户主机的IP地址,点分十进制IPv4或者RFC3513指定的十六进制Ipv6地址。注意:一般情况下这个参数没有必要,因为IP地址可以从HTTP请求中得到。只有当请求中的IP地址不是客户端的IP地址时,才需要这个参数(只有客户端通过代理和tracker 交互时才会发生这种情况)。如果客户端和Tracker都在NAT网关的同一侧,这个时候这个参数就是必要的。原因是Tracker会公布不能路由的客户端物理地址。因此客户端必须显示指出自己的IP地址,以将信息公布给外部的peers。不同的Tracker对待该参数的方式不同。一些Tracker只有当请求中的IP地址在RFC1918空间才使用它,有一些则无条件使用,另一些则根本不使用。如果是Ipv6地址,它表示这个客户端只能通过IPv6交互。

l  numwant:(可选),客户端希望从Tracker接受到的peers数,如果省略,则默认是50个。

l  key:(可选),不和其他用户共享的附加标识。当客户端IP地址改变时,可以使用该标识来证明自己的身份。

l  trackerid:(可选),如果之前的announce包含一个tracker id,那么当前的请求必须设置该参数。

Tracker Response
Tracker以”text/plain”文本响应客户端的请求,这个响应文本由B编码的dictionary组成,而这个dictionary则包含如下的键(key):

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgwzyd.html