这个扩展(Extension for Peers to Send Metadata Files)的目的是允许客户端加入一个 swarm ,而无需先下载一个种子(.torrent)文件
元数据
在这个扩展中,只传输 metadata 部分,称为“info-dictionary”。因为这部分数据足以让其他客户端知道如何加入到特定的“swarm”中,并开始下载文件数据。而通过使用 info-hash 来验证 metadata 的完整性,可以确保客户端从可靠的来源下载 metadata,而不会受到恶意修改的影响。
元数据被分成大小为 16KiB(16384字节)的块进行处理。这些元数据块从 0 开始索引。每个块的大小都是 16KiB,除了最后一个块可能会比 16KiB 小。
扩展头部
当客户端与其他节点建立连接时,它们会通过握手消息进行通信。元数据扩展使 Extension Protocol 规定的扩展协议来向其他节点宣布自己的存在。具体而言,它将”ut_metadata”条目添加到扩展握手消息的”m”字典中,用于标识此消息所使用的消息码。此外,它还在握手消息中添加了”metadata_size”字段(不在”m”字典中),用于指定元数据的字节数。换句话说,当客户端和其他节点建立连接并进行扩展握手时,如果元数据扩展可用,则客户端将发送一个包含”ut_metadata”和”metadata_size”字段的扩展握手消息,以告知其他节点它支持获取元数据。
分机握手消息示例:
{'m': {'ut_metadata', 3}, 'metadata_size': 31235}
扩展信息详情见此篇
扩展消息已编码。有 3 种不同类型的消息:
- request
- data
- reject
请求消息
请求消息是一个字典,没有额外的键(即附加信息)。如果节点支持该扩展,它会响应一个 reject 或者 data 消息,响应的 piece 必须与请求时相同。具体而言,请求和响应都涉及到相同的数据块(piece)。
在该网络中,一个节点必须验证它发送的任何数据块(piece)都通过了 info-hash 的校验。也就是说,在该节点获得完整的元数据之前,它不能运行 SHA-1 算法来验证所生成的哈希值与 info-hash 相同。如果一个节点没有完整的元数据,那么当它收到其他节点的元数据请求时,它必须向请求方发送一个”reject”消息来拒绝请求。这是因为只有具有完整元数据的节点才能够正确地进行 info-hash 校验。因此,该网络确保了文件传输的完整性和准确性,从而防止了潜在的恶意操作或数据损坏。
例:
{'msg_type': 0, 'piece': 0}
d8:msg_typei0e5:piecei0ee
请求消息正在请求第一个 metadata piece。
数据消息
数据消息在字典中增加了一个新的条目,即 “total_size”。该键具有与扩展标头中的 “metadata_size” 相同的语义,并且它的值为整数。这个键表示整个数据块的总大小或长度,用于指示接收方需要接收多少数据才能完全重建原始数据。
在传输元数据时,需要先将字典序列化为二进制数据,并根据协议要求加上长度前缀。这个长度前缀不仅要包括字典本身的长度,还要包括元数据的一些附加信息,这些附加信息被称为 metadata piece。metadata piece 不是字典的一部分,而是消息的一部分。如果 metadata piece 是元数据的最后一部分,则其大小可以小于 16KB;但如果不是最后一部分,则其大小必须是 16KB。
例:
{'msg_type': 1, 'piece': 0, 'total_size': 3425}
d8:msg_typei1e5:piecei0e10:total_sizei34256eexxxxxxxx...
x 表示二进制数据(元数据)。
驳回消息
拒绝消息不包含任何附加键或值,如果收到该消息,则应理解为对应的对等方没有被请求的元数据。这意味着该对等方无法提供所需的数据片段。客户端可以通过在服务一定数量的请求消息后开始拒绝它们来实现洪泛攻击的保护。这个数量通常是所请求的元数据块数乘以一个因子。
例:
{'msg_type': 2, 'piece': 0}
d8:msg_typei1e5:piecei0ee
Magnet URI 格式
magnet URI 格式为:
v1: magnet:?xt=urn:btih:<info-hash>&dn=<name>&tr=<tracker-url>&x.pe=<peer-address> v2: magnet:?xt=urn:btmh:<tagged-info-hash>&dn=<name>&tr=<tracker-url>&x.pe=<peer-address>
<info-hash>
<tagged-info-hash>
<peer-address>
xt dn tr x.pe
详情见此篇
参考链接
- http://bittorrent.org/beps/bep_0009.html