BitTorrent协议详解(2) d4:spaml1:a1:bee相当于{'spam': ['a', 'b']}关键值必须是处理过的字符串(用原始字符串编码的,而且不是数字字母混合编码的)。元信息文件就是B编码的有以下关键值的字典:announce(声明)Tracker的URL。info(信息)此关键值对应一个字典包含以下描述的关键值:关键值name对应一个字符串,代表默认的下载文件或存成目录的名字。它是纯粹建议性的。关键值piece length(块长)对应文件分割成的块的字节数。出于传输需要,文件被分割成大小相等的块,除了最后一块通常会小一些。块长一般来说是2的权值,大部分设块长为256K(2的18次幂)。关键值pieces(块)对应一个字符串,此字符串长度是20的倍数。它可以再分成每20字节一段的多个字符串,分别对应块在索引中的SHA1校验码(hash)。还有关键值length(长度)和files(文件),它们不能同时出现也不能都不出现。当length出现说明这个元信息文件只是单文件下载,否则说明是多文件的目录结构下载。单文件情况下,length对应文件长度的字节数。多文件情况被看作是把许多单文件按文件列表中的顺序连成一个大文件下载,而关键值files就对应文件列表,是一个字典的列表,其中每个字典又包含以下关键值:length(长度)文件长度的字节数。path(路径)一个包含字符串的列表,字符串就是子目录名,最后一项的字符串是文件名。(一个长度为零的length表单是错误的。)在单文件情况下,关键值name是文件名;多文件情况下,它就成了目录名。Tracker质询是双向的。Tracker通过HTTP GET参数获得信息,然后返回一个B编码后的信息。尽管Tracker需要在服务器端执行,但它运行流畅像Apache的一个模块。Tracker的GET请求有如下关键值:info_hash20字节长的SHA1验证码,来自B编码过的元信息文件中的info值下,是元信息文件的一个支链。这个值是自动转换的。peer_id一个20字节长的字符串,是每个用户开始下载时随机生成的ID。这个值也是是自动转换的。ip一个可选择的参数给出peer所在的IP(或DNS主机名),一般是和Tracker同机器的原始下载者得到后以便散发文件。port监听端口,官方默认的是从6881端口开始试,如果端口被占用则依次向后推一个端口找空闲端口,到6889端口为止。uploaded目前总上传量,编码为十进制ASCII码。downloaded目前总下载量,编码为十进制ASCII码。left未下载的字节数,编码为十进制ASCII码。这个数不是通过文件长度和已下载数算出来的,因为文件可能在被续传,还有一些已经下载的数据不能通过完整性检查必须重新下载。event这是个选择性的关键值,选项有started,completed或stopped(或empty,等同于没有运行)。如果没有运行,这个声明会定期间隔一定时间发出。开始下载时发出started值,完成下载时发出completed。当文件完整后再开始,没有completed发出,下载者中止下载时发出stopped。Tracker的回应也是B编码字典。如果Tracker回应中有关键值failure reason(失败原因),就会对应一个人可以读懂的字符串信息解释质询失败的原因,不需要其它关键值。否则,回应必须有两个关键值:interval(间隔)对应下载者定期发出请求的间隔秒数;peers,peer自选ID,IP地址或DNS主机名的字符串和端口号。记住peers不会完全按照计划的间隔发送请求,假如他们发生一个事件或者想要更多的peers。 如果你想对元信息文件或者Tracker质询进行扩展,请与Bram Cohen进行协调,确保所有扩展都兼容。BitTorrent peer协议通过TCP协议进行操作。它不用调节任何socket选项就可以流畅运行。peer之间的连接是对称的。两个方向送出的信息要协调一致,数据可以流入任一方。peer协议指一个peer从零开始下载,每得到元信息文件索引中所描述的一个块且验证码一致,就向所有peer声明已得到此块。