BT种子分析
BT种子采用bencoding,包含如下内容。
向Tracker服务器请求peers
Tracker服务器是一个http服务器,请求peers时是发送一个http GET请求,包含以下参数
Peer交互协议
底层采用TCP或者uTP(这个是啥协议)。
peer连接是对等的,收发两端发送的数据结构一致。
连接两端都有一个2bit的状态位分别标识四种状态choking or not以及interested or not。
数据只有在一端是interested并且一端不是choking时候传输。
握手:
握手消息开始与数字19然后紧接字符串”BitTorrent protocol”
协议后面的整数都以4bytes big-endian编码。
固定的头含有8个保留字节,目前的实现全为0,用于做一些扩展工作。
后面是20字节的info_hash,如果两端的info_hash都相同,连接就算建立了。
Peer messages
除了keepalive消息外,还有如下几种消息
其中的choke, unchoke, interested, not interested消息没有payload。
bitfield消息只会是握手之后的第一个消息。他的payload是一个变长的bitfield,哪些块下载了就是1,缺失的就是0。
have消息的payload是刚下载完成并验校通过的块序号。
request消息payload包含请求的块序号,开始位置以及长度。长度通常是2的整数次幂,目前实现为216。
cancel消息和request消息差不多,主要用于快下完的时候,为了防止最后几块下载时间过长,下载端会给peer list列表里面所有的peer请求最后几块,一旦完成后就要给之前发送过请求的peer发送cancle消息。
piece消息是收到request消息后,并且发现自己并没有choke对方时发送.
参考资料:
http://www.bittorrent.org/beps/bep_0003.html
http://www.kristenwidman.com/blog/how-to-write-a-bittorrent-client-part-2/