与Tracker交互主要有两个目的:一是将字节的下载进度告知给Tracker以便Tracker进行一些相关的统计;二是获取
当前下载同一个共享文件的peer的IP地址和端口号。
客户端使用HTTP协议与Tracker进行通信。Tracker通过Http Get方法获取请求,如 htttp://myBT.net/announce
?param1=value1¶m2=value2。
客户端发往Tracker的Get请求中,包含的参数为:
info_hash: 与种子文件中info关键字对应的值,通过Shal算法计算其hash值,该值就是info_hash参数对应的值。
peer_id: 每个客户端在下载文件前以随机的方式生成的20字节的标示符,用于标识自己,它的长度也是固定不变的。
port:监听端口号,用于接收其他peer的连接请求。
uploaded:当前总的上传量,以字节为单位。
downloaded:当前总的下载量,以字节为单位。
left: 还剩余多少字节需要下载,以字节为单位。
compact:该参数指示服务器以何种方式返回peer,该值为1时,每个peer占6个字节,前4个字节为peer的IP地址,
后两个为peer的端口号。
event:它的值为started,completed,stopped 其中之一,客户端第一次与Tracker进行通信时,该值为started,下载
完成时,该值为completed;客户端即将关闭时,该值为stopped。
ip:可选,将客户端的IP地址告知给Tracker。
numwant: 可选,希望Tracker返回多少个peer的IP地址和端口号。
key: 可选,值为一个随机数,用于进一步标识客户端。
trackerid:可选,一般不用。
Tracker服务器的返回信息是一个经过B编码的字典:
failure reason: 指明Get请求失败的原因,如果返回信息中含有这个关键字,就不会在包含其他任何关键字。
warnging message: 一个可以读到的警告字符串。
interval:指明客户端在下一次连接Tracker前所需等待的时间,以秒为单位
min interval :指明客户端在下一次连接Tracker前所需等待的最少时间,以秒为单位
tracker id:指明Tracker的ID。
complete:一个整数,指明当前有多少个peer已经完成了整个共享文件的下载
incomplete:一个整数,指明当前有多少个peer还没有完成共享文件的下载。
peers: 返回各个peer的IP和端口号,他的值是一个字符串,首先是第一个peer的IP地址,然后是其端口号,接着是第二个peer的IP
地址,然后是其端口号。
peer之间的通信协议
peer之间的通信协议是一个基于TCP协议的应用层协议
客户端与peer建立TCP连接后,客户端必须维持的几个状态变量:
am_chocking : 该值若为1,表明客户端将远程peer阻塞。此时如果peer发送数据请求给客户端,客户端将不会理会。即一旦
将peer阻塞,peer就无法从客户端下载到数据。该值若为0,则刚好相反,即peer未被阻塞,允许从客户端下载数据。
am_interested: 为1,表明客户端对远程的peer感兴趣,当peer拥有某个piece,而客户端没有,则客户端对peer感兴趣。
该值若为0,则相反。
peer_chocking:为1,表明peer见啊ing客户端阻塞,此时,客户端无法从peer处下载到数据。若为0,表明客户端可以向peer发送
数据请求,客户端将进行相应。
peer——interested:为1,peer对客户端感兴趣,即客户端拥有某个piece,而peer没有。为0,表明peer客户端不感兴趣。