前序文章:
前文内容回顾:
首先需要知道,Tracker 请求基于 HTTP 请求,通常使用 GET 方法,一个 Tracker GET 请求应该包含以下信息:
info
字段经过编码后计算 SHA-1 的哈希值,特别注意的是,用于计算该哈希值的内容应符合编码规范中所规定的排序规则和其他规则。started
、completed
或stopped
,若为空则与未提供该键相同表示定期间隔内进行的通讯。started
,表示下载刚开始;completed
,表示下载已完成,如果在开始时文件已经完整,则不会发送completed,在停止时应发送stopped
。一次 Tracker 请求的实质就是一个 HTTP GET 请求,以元数据文件部分示例的种子为例,在局域网内部署 tracker 服务器(过程略)进行请求示例。
首先计算信息部分哈希值,如下:
Info内容:
{
"length": 1373744,
"name": "ChromeSetup.exe",
"piece length": 524288,
"pieces": b"L\xb2k\xd9\x83\xa4\x84\x84\x00g\xeb\xf7\x1d\xfe3\xa2\xd9\x95\x0f\\\xa6\xb2E\xcd!^\xe3\xed\x8a\x85\xe7>(\x99\x9dU\x06g%b\x08@\xc9\x9fG\xb8S\x8f\x067K#3\xa7\xbf\xb8`N\xac3"
}
使用前文 encode_bencode 函数计算编码,并计算 SHA1 后对其进行 url 编码结果:
%E7%D6%A1%A7%88-%E0%11%0E%3C%BB%FBP%91%FB%DE%EBg%1E%C1
根据 Tracker 请求结构,构建开始下载请求,如下:
最终构造的请求如下:
{TrackerURL}?info_hash=%f3%e4%3a%1c!)C%e2%18%eav%a0%1d%5d%c5%9b%d1%88%e6%a1&peer_id=-None-ARandomString-&port=6881&uploaded=0&downloaded=0&left=0&event=started
对上文其进行请求,得到 Tracker 返回如下:
进行解码,得到返回字典:
{
"complete": 0,
"downloaded": 0,
"incomplete": 1,
"interval": 1863,
"mininterval": 931,
"peers": b'\n\x00\xb29\x1a\xe1'
}
这是一个成功的请求格式,接下来来具体看看 Tracker 的响应内容。
果发生错误,则只需要有 failure reason
即可,无需其他内容。
如果是一个成功的响应,则响应内容应该包括:
根据上述内容容易发现,之前测试的 Tracker 返回信息 peers 并不是标准形式,这就要看 BEP0023 中所规定的紧凑方式返回 peers 列表,在紧凑方式下每个对等方信息由4字节的IPv4地址和2字节的端口号组成,不再包括Peers ID。
同时需要注意,由于紧凑方式被推荐使用,很多 Tracker 只支持这种方式返回,但作为下载器,必须同时支持。
对上述请求进行分析,可得:Tracker 希望 下一次请求在 1863 秒后,peers 列表:
[{'ip': '10.0.178.57', 'port': 6881}]
BitTorrent的协议是对等的,没有服务器和客户端的概念,每一个节点(Peer)都是相同的,它们之间互相传输数据的形式也是一致的。
此处以TCP连接为例,节点之间首先建立 TCP 连接,随后开始握手,握手数据如下:
19
(0x13);BitTorrent protocol
;
注:此后所有整数均以四字节大端字序进行编码;双方一次发送上述数据,互相进行校验,即完成握手过程,长度为 0 的保持连接消息通常每 2 分钟发送一次,在请求数据传输期间,超时时间可以更短。
推荐结合 Bittorrent 协议浅析(三)对等数据传输实例 共同完成此部分阅读。
在握手完毕后,双方便可以开始交换数据,所有非 保持连接(长度为 0)的数据均以单个字节开头,开头字节介绍:
标识 | 说明 |
---|---|
0 | choke |
1 | unchoke |
2 | interested |
3 | not interested |
4 | have |
5 | bitfield |
6 | request |
7 | piece |
8 | cancel |
前四项,choke interested的含义如下:
当连接建立后,默认状态为阻塞和不感兴趣。
第二部分 Tracker 和对等节点 暂时就到这里,实践和拓展协议等先关内容的分析之后链接会放在这里:
最后,征文活动广告:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。