3. 与Tracker交互及peer之间的通信

        与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客户端不感兴趣。

 

 

 

 

你可能感兴趣的:(BT下载软件(linux,C编程实战))