You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:01:24