如何通过Infohash获取Torrent元数据?求元数据查询报文示例
BitTorrent元数据查询的具体实现(BEP 9 实操指南)
核心前提
元数据查询不是独立报文,是基于BEP 10扩展协议在握手完成后发起的——这也是你在Wireshark里找不到单独“元数据报文”的原因,它被封装在扩展消息里。
完整流程与消息格式
1. 先协商扩展支持
握手完成后,双方会发送extended消息(消息ID固定为20),其中的m字段会声明支持的扩展能力。如果对方支持元数据,会包含ut_metadata条目,值是对应的子消息ID(比如1)。
2. 元数据查询/响应的具体结构
所有元数据相关消息都遵循扩展协议的框架:
<4字节大端长度前缀> <消息ID=20> <ut_metadata子ID> <Bencode编码的负载>
示例1:请求元数据片段
负载是Bencode字典,用于请求第0个片段(元数据按16KB分片):
d8:msg_typei0e5:piecei0e10:total_sizei184320ee
解码后对应:
{ "msg_type": 0, // 0=请求 "piece": 0, // 片段索引 "total_size": 184320 // 元数据总大小(可选,首次请求时携带) }
示例2:响应元数据片段
负载包含对应片段的二进制数据:
d8:msg_typei1e5:piecei0e6:pieces<16384字节的元数据二进制内容>ee
解码后:
{ "msg_type": 1, // 1=响应 "piece": 0, "pieces": "<二进制元数据片段>" }
示例3:拒绝请求
如果对方拒绝提供元数据,负载会是:
d8:msg_typei2ee
解码后:
{ "msg_type": 2 // 2=拒绝 }
Wireshark中定位这类流量
- 先用过滤器
bittorrent筛选BT流量 - 找消息ID为20的报文(扩展协议消息)
- 查看Payload部分,解析其中的Bencode数据——如果包含
msg_type、piece这类字段,就是元数据相关报文
排查没找到的原因
- 对等节点不支持BEP 9:部分老节点或私有集群节点可能禁用了元数据下载
- 抓包阶段不对:元数据请求在握手+扩展协商之后才会发送,你可能只抓到了握手阶段的流量
- Wireshark解析限制:默认情况下Wireshark不会自动解析BEP 9的内容,需要手动查看Payload的Bencode结构
内容的提问来源于stack exchange,提问作者orraz1
相关产品推荐
相关产品推荐

