BT通讯协议学习

最近在做游戏客户端下载的方案,考虑到客户端比较大,下载成本高的情况,就考虑用bt方式下载,故收集和整理了一下有关资料,希望对大家也有帮助。

一、BT协议的工作过程

BT协议主要包括3个部分:.torrent文件的格式、tracker HTTP/HTTPS协议和peer wire协议(使用TCP)。其中tracker HTTP/HTTPS协议是BT客户机与tracker服务器之间的通信协议,peer wire是BT客户机之间的通信协议。

1、torrent文件的结构

.torrent文件的内容,采用了B编码。B编码是一种简洁的数据组织方式,支持4种数据类型:bytestrings、integers、lists和dictionaries。integers、lists和dictionaries类型分别以字母i、l、d作为首定界符,以字母e作为尾定界符。bytestrings类型不使用首/尾定界符,其格式为<十进制表示的字符串长度>:<字符串>,如4:spam表示字符串“spam”。这4种数据类型嵌套使用构成了.torrent文件的内容。

以ubuntu镜像下载种子文件为例:

d8:announce39:http://torrent.ubuntu.com:6969/announce13:announce-listll39:http://torrent.ubuntu.com:6969/announceel44:http://ipv6.torrent.ubuntu.com:6969/announceee7:comment29:Ubuntu CD releases.ubuntu.com13:creation datei1476352338e4:infod6:lengthi700448768e4:name29:ubuntu-16.10-server-amd64.iso12:piece lengthi524288e6:pieces26720:d?

其中的一些主要成份如下:

    ●announce:tracker服务器的URL,本例中为http://torrent.ubuntu.com:6969/announce

    ●announce-list:可选。备用tracker服务器的URL列表,本例中为http://torrent.ubuntu.com:6969/announce、http://ipv6.torrent.ubuntu.com:6969/announce

    ●comment:可选。.torrent文件制作者添加的任意格式的说明。本例中为Ubuntu CD releases.ubuntu.com

    ●creationdate:可选。.torrent文件的创建日期,使用标准的UNIX时间,本例中为1476352338

    ●createdby:可选。制作.torrent文件的工具

    ●encoding:可选。发布的资源使用的编码方式

    ●info:发布的文件的信息。有两种格式,单文件格式和多文件格式。单文件格式包括length、md5sum(可选)、name、piecelength、pieces;多文件格式包括files、name、piecelength、pieces,其中files包括length、path、md5sum(可选),每一个文件都有单独的length、path、md5sum(可选)。

2、tracker HTTP/HTTPS协议

1)客户端获取tracker服务器的ip地址:91.189.95.21

2)TrackerHTTP/HTTPS协议

BT客户端依次向.torrent文件中的tracker服务器发送连接请求,以获取peers列表(主要是IP地址和监听端口)。如果连接成功获取列表,就关闭连接,尝试与列表中的对等方建立连接;如果不成功,尝试下一个tracker服务器。

URI: /announce?info_hash=%BFo%2B%E5I%A8%AC%A5wf8%B5%9B%2B%CAS%D7%BB%C7H&peer_id=-BC0137-%90%0E%E4%A5%06%A8%5E%9D-G%8A%3C&port=21702&natmapped=1&localip=192.168.14.100&port_type=wan&uploaded=0&downloaded=0&left=700448768&numwant=200&compact=1&no_peer_id=1&key=

客户端http请求部分包含:

●     info_hash:.torrent文件中的info部分的sha1效验码,共20字节。Tracker服务器通过它在发布列表中找到对应的记录。

●     peer_id:BT客户端的唯一性标识,在客户端启动时产生,共20bit。貌似没有具体的产生peer-id的算法,只要求能够保证唯一性即可。

●     ip:可选,IP地址,没有的话服务器会自己找到。

●     port:监听端口,这里为10775。

●     uploaded/downloaded:上传/下载的字节数(从客户机向Tracker服务器发送”started”开始计算)。

●     left:还需下载的字节数。

●     numwant:可选。客户端希望从Tracker服务器得到的对等方的数目。

●     key:可选。一个扩展的唯一性标识,即使改变了IP地址,也可以使用该字段标识该BT客户机。

●     compact:压缩标志。如果值为1表示接受压缩格式的对等方列表,即用6byte表示一个对等方      (前4byte表示IP地址,后2byte表示端口号);值为0表示不接受。

服务器响应内容:

HTTPPayloadLine: d8:completei888e10:incompletei8e8:intervali1800e5:peers300:ˆ> 'ÈÕ3ÿ'µÈÕW”h]ÈÕ£¬RPÈÖA¶à'á¹-ÃÀNÊԛêÈÕG®^ÈÕ_h)ÑÈÕG8¶+ÈÖbµ>ÈÕmɾMÈÒޚJ¿ÔJP֏AñFAÝÈÕhŽÂçÄSW^'À~®4ÈFÈÕL­[áÜðm}ÈÕ¢í€n¤[†Ø·¡Æ[M=œJ>ÒÀ´ÐøÉ§îŠDGîÈÕL)Éà^Æ@×ÈÕmÝ–#'£¬˜ñ)^¹Ø

其中“300:”以及之前的部分使用的是ASCII字符集,“300:”之后的部分是用16进制表示的二进制数。从分组内容可以看出:完成整个文件下载的peers数为888;还没有完成该文件下载的peers数目为8;interval的值为1800,也就是说BT客户端最多每隔1800个时间单位就与tracker服务器重新联系一次;最少时间间隔为983;peer部分共有300个字节,由于BT客户端支持对等方列表的压缩,即6个字节表示一个对等方,也就说返回的对等方个数为18个。

3) peer wire协议

待续...

 

转载:http://blog.chinaunix.net/uid-26548237-id-3056731.html

        http://www.bittorrent.org/beps/bep_0005.html

 

posted on 2017-02-15 15:05  guoqp  阅读(1355)  评论(0编辑  收藏  举报

导航