debian-10.9.0-amd64-netinst.iso
.torrent文件部分内容
经过解析,我们可以获取到一个Tracker的主服务器地址,以及可能存在的Tracker服务器备用节点列表(有些种子torrent文件里面是没有这个的)
就像这个debian-10.9.0-amd64-netinst.iso的torrent文件,解析出来就是没有备用节点列表的。
我们需要请求这个服务器地址获取可用的peer节点列表。
peer-to-peer
在开始之前我们需要了解一下P2P(peer-to-peer,对等计算)
传统的客户端/服务器(C/S架构)关系中,下载器连接到中央服务器(例如:在Netflix上观看电影或加载您正在阅读的网页)。
BitTorrent网络中的参与者(称为peers)之间交换下载文件的分块-这就是p2p(peer-to-peer)。
网络的参与者共享他们所拥有的一部分硬件资源(处理能力、存储能力、网络连接能力等),这些共享资源通过网络提供服务和内容,能被其他的对等节点(peer)直接访问而无需经过中间实体。此网络的参与者既是资源提供者(Server),又是资源获取者(Client)。
不难看出去中心化是P2P的一个很突出的特点。
获取peer节点列表
announce
在我们发起请求之前,在发起请求之前,我们先稍微理一下几个概念。
info hash 和 peerId
一起来猜想一下,我们对Tracker服务器发起的请求可能需要包含的内容,可能是下面这样的
"我(是谁)想要知道文件 debian-10.9.0-amd64-netinst.iso(文件id) 的所有peers节点列表"
这应该是问一个服务器获取数据一个必要条件吧,我们必须得告诉服务器,我们需要获取 peer列表 的对应的文件id,没有这个id,服务器也不知道该该你谁的 peer列表。
有时候我们还需要告诉服务器来获取这个列表的“我”是谁。
所以这里就引出了两个概念 info hash 和 peerId。
- info_hash:标识我们要下载的文件。这是我们之前根据bencode的info字段内容,计算出的信息哈希。Tracker服务器将使用它来确定向我们显示哪些Peers。
- peer_id:一个20字节的名称。用于向跟踪者和Peers标识自己。可以随机生成20个随机字节。真正的BitTorrent客户端具有ID. 例如ID -TR2940-k8hj0wgej6ch.用于标识客户端软件和版本-在这种情况下.TR2940代表传输客户端2.94.
构建请求路径
http://bttracker.debian.org:6969/announce?compact=1&downloaded=0&info_hash=%9F%29%2C%93%EB%0D%BD%D7%FFzJ%A5Q%AA%A1%EA%7C%AF%E0%04&left=353370112&peer_id=%E2%DA%C30%E9%B8%25%98%CDr%89%92b%BB%29%1B%2C%A3%A5%B1&port=6882&uploaded=0
Tracker响应给我们的数据为
- Interval:告诉我们应该多久再次连接到Tracker服务器以刷新我们的Peers列表。值900表示我们应该每15分钟(900秒)重新连接一次.
- peers:是另一个长二进制Blob。其中包含每个Peers的IP地址。它由六个字节组成.每个组中的前四个字节代表Peers的IPv4地址-每个字节代表IP中的数字。最后两个字节将端口表示为big-endian uint16。
Big-endian(大端模式,与之对应的是小端模式(Little-endian)) 是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中 数字0x12345678在内存中的大端模式表示形式为: 低地址 -----------------> 高地址 0x12 | 0x34 | 0x56 | 0x78
参考
参考了下面的链接,不过这位大神只做了单文件下载,没有做多文件的,只支持TCP协议。