A
Another_eYes
Unregistered / Unconfirmed
GUEST, unregistred user!
(转载请指明作者)
(上一篇: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2520466)
Tracker服务器是一个web服务器,它主要作用是管理各个.torrent文件对应的下载服务中各client的当前状态。BT下载首先需要连接Tracker服务器获取所有正在下载某个.torrent任务的Client列表(真正的下载内容是从这些Client获取的)并随时通知Tracker服务器当前的下载状态。由于Tracker服务器是个web服务器,所以和Tracker服务器之间的通讯是通过HTTP协议完成的。客户端通过HTTP GET来获取Tracker服务器的client列表和通知Tracker服务器当前下载状态。
HTTP GET的url形式:将.torrent文件中的announce指明的url加上“?”后面跟上一串key=value形式的参数,参数间用“&”分隔。例如:
http://xxx.xxx.xxx.xxx/announce.php?key=value&key=value&..
需要注意一点:由于url中的参数只支持字符0-9, a-z, A-Z, 和 $-_.+!*'(),所以参数中所有不在上述字符范围内的字符都必须转换成“%nn”这种表现形式,这里nn是16进制字符串,比如空格需要转成%20。
HTTP GET中各key=value参数的说明(千万别搞错一点:这里是真正的“key=value”表现形式,key和value都是它们本来的样子,不是Bencode编码):
info_hash:value是20字节的SHA1 hash值,这个hash值是计算.torrent文件中的info项的value得到的(别和.torrent中文件块的SHA1 hash值搞混了),需要说明的是计算hash时需要包含原始信息中开头的“d”和结尾的“e”(没忘记info项的值本来就是个Bencode编码的dictionary吧)。
peer_id:value是20字节的任意字符,标识客户端用的,由客户端生成,BT协议没有规定具体内容是什么,我个人喜欢用GUID+4字节随机数。
port:value是个十进制数字符串,标识客户端提供下载服务的端口号,这个值为6881-6889之一。协议建议如果客户端无法监听这个范围的port则放弃下载任务(也就是说同一台机器最多运行9个BT程序?)
uploaded:value是个十进制数字符串,标识客户端总共上传了(提供其他客户端下载了)多少字节
downloaded:value是个十进制数字符串,标识客户端总共下载了多少字节。
left:value是个十进制数字符串,标识客户端还有多少字节需要下载。
event:可选项,有三种值:
event=started :第一次连Tracker服务器时必须包含这个参数
event=stopped :客户端关闭时必须通知Tracker服务器并包含此项
event=completed :如果客户端下载完所有所需内容(此时不一定客户端关闭,因为仍可作为种子提供他人下载)后通知Tracker服务器时必须包含此项。注意一点,如果客户端启动时就已经下载100%了也不要包含此项,此项只在开始时完成度不是100%而下载完成度达到100%时通知Tracker服务器用。
如果未包含event参数,则表明是定时通知Tracker服务器状态
ip:可选项,客户端真实的ip,一般不需要提供,因为Tracker服务器可以从客户端的HTTP请求中获知ip,只在HTTP请求的ip和客户端真实ip不同时才需要提供,比如通过proxy访问Tracker服务器时或者客户端和Tracker服务器处于同一局域网内时。
numwant:可选项,希望获得的其他客户端列表的项数,这个值可以为0(比如种子客户端),如果没有提供这项,则服务器返回的列表数为50(如果有那么多客户端的话)
Tracker服务器的回应信息:Tracker服务器响应客户端的HTTP GET返回的是一个text/plain类型的文件,文件内容是一个Bencode的dictionary项,包含以下key和value项(记住是Bencoded的啊):
failure reason:如果字典中包含此项,则字典中就不再有其他内容,此项说明HTTP GET请求失败,value是一个string,说明失败原因。
interval:value是一个int,说明至多间隔多少秒(不是毫秒)就需要和Tracker服务器通讯一次。
peers:value是一个list,list中每项是一个dictionary,对应一个客户端的信息。这个字典中包含以下key和value:
peer id:value是字符串,标识某个客户端(还记得发给Tracker服务器的peer_id项吗?这里的就是别的客户端的peer_id)
ip:客户端的ip,value是个string,注意这个值可能是个Internet名字,需要查DNS才能获取真正连接用的ip
port:客户端提供服务的端口号
和其它客户端之间的通讯协议
(待续)
(上一篇: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2520466)
Tracker服务器是一个web服务器,它主要作用是管理各个.torrent文件对应的下载服务中各client的当前状态。BT下载首先需要连接Tracker服务器获取所有正在下载某个.torrent任务的Client列表(真正的下载内容是从这些Client获取的)并随时通知Tracker服务器当前的下载状态。由于Tracker服务器是个web服务器,所以和Tracker服务器之间的通讯是通过HTTP协议完成的。客户端通过HTTP GET来获取Tracker服务器的client列表和通知Tracker服务器当前下载状态。
HTTP GET的url形式:将.torrent文件中的announce指明的url加上“?”后面跟上一串key=value形式的参数,参数间用“&”分隔。例如:
http://xxx.xxx.xxx.xxx/announce.php?key=value&key=value&..
需要注意一点:由于url中的参数只支持字符0-9, a-z, A-Z, 和 $-_.+!*'(),所以参数中所有不在上述字符范围内的字符都必须转换成“%nn”这种表现形式,这里nn是16进制字符串,比如空格需要转成%20。
HTTP GET中各key=value参数的说明(千万别搞错一点:这里是真正的“key=value”表现形式,key和value都是它们本来的样子,不是Bencode编码):
info_hash:value是20字节的SHA1 hash值,这个hash值是计算.torrent文件中的info项的value得到的(别和.torrent中文件块的SHA1 hash值搞混了),需要说明的是计算hash时需要包含原始信息中开头的“d”和结尾的“e”(没忘记info项的值本来就是个Bencode编码的dictionary吧)。
peer_id:value是20字节的任意字符,标识客户端用的,由客户端生成,BT协议没有规定具体内容是什么,我个人喜欢用GUID+4字节随机数。
port:value是个十进制数字符串,标识客户端提供下载服务的端口号,这个值为6881-6889之一。协议建议如果客户端无法监听这个范围的port则放弃下载任务(也就是说同一台机器最多运行9个BT程序?)
uploaded:value是个十进制数字符串,标识客户端总共上传了(提供其他客户端下载了)多少字节
downloaded:value是个十进制数字符串,标识客户端总共下载了多少字节。
left:value是个十进制数字符串,标识客户端还有多少字节需要下载。
event:可选项,有三种值:
event=started :第一次连Tracker服务器时必须包含这个参数
event=stopped :客户端关闭时必须通知Tracker服务器并包含此项
event=completed :如果客户端下载完所有所需内容(此时不一定客户端关闭,因为仍可作为种子提供他人下载)后通知Tracker服务器时必须包含此项。注意一点,如果客户端启动时就已经下载100%了也不要包含此项,此项只在开始时完成度不是100%而下载完成度达到100%时通知Tracker服务器用。
如果未包含event参数,则表明是定时通知Tracker服务器状态
ip:可选项,客户端真实的ip,一般不需要提供,因为Tracker服务器可以从客户端的HTTP请求中获知ip,只在HTTP请求的ip和客户端真实ip不同时才需要提供,比如通过proxy访问Tracker服务器时或者客户端和Tracker服务器处于同一局域网内时。
numwant:可选项,希望获得的其他客户端列表的项数,这个值可以为0(比如种子客户端),如果没有提供这项,则服务器返回的列表数为50(如果有那么多客户端的话)
Tracker服务器的回应信息:Tracker服务器响应客户端的HTTP GET返回的是一个text/plain类型的文件,文件内容是一个Bencode的dictionary项,包含以下key和value项(记住是Bencoded的啊):
failure reason:如果字典中包含此项,则字典中就不再有其他内容,此项说明HTTP GET请求失败,value是一个string,说明失败原因。
interval:value是一个int,说明至多间隔多少秒(不是毫秒)就需要和Tracker服务器通讯一次。
peers:value是一个list,list中每项是一个dictionary,对应一个客户端的信息。这个字典中包含以下key和value:
peer id:value是字符串,标识某个客户端(还记得发给Tracker服务器的peer_id项吗?这里的就是别的客户端的peer_id)
ip:客户端的ip,value是个string,注意这个值可能是个Internet名字,需要查DNS才能获取真正连接用的ip
port:客户端提供服务的端口号
和其它客户端之间的通讯协议
(待续)