在来自 Tracker Server (bitTorrent) 的 Annouce 响应中解析 Peers IP 地址

Posted

技术标签:

【中文标题】在来自 Tracker Server (bitTorrent) 的 Annouce 响应中解析 Peers IP 地址【英文标题】:Parsing Peers IP Address in Annouce Response From Tracker Server (bitTorrent) 【发布时间】:2015-07-20 00:44:51 【问题描述】:

所以下面的请求:

torrent.ubuntu.com:6969/announce?info_hash=%02%21%CA%F9j%A3%CB%94%F0%F5%8DE%8Ex%B0%FC4J%D8%BF&peer_id=ABCDEFGHIJKLMNOPQRST&port=6881&uploaded=0&downloaded=0&left=3353370624&compact=0

导致提供一个 Announce 文件。在该文件被弯曲编码后,您会得到:

'peers': '\xb9\x15\xd9\x08\xd8\x05[\xbd_\x15\x1b!', 'interval': 1800, 'complete': 5, 'incomplete': 1

我很纠结

'\xb9\x15\xd9\x08\xd8\x05[\xbd_\x15\x1b!'

使用 compact=1 你会得到:

'\xbd_\x15\x1b\n\xb9\x15\xd9\x08\xd8\x05'

如果这是网络顺序(小端)?

来自here 我读到:

请注意,如果您在二进制模型中获得对等体,最后两个字节一起编码端口号(即'\x1a\xe1' = 26 * 256 + 225 = 6881)。

所以也许 '\xd8\x05' 构成端口:216 * 256 + 5 = 55301 或者不是。

有人可以向我解释如何将这些十六进制数字解析为 ip:port 地址吗?

在谷歌上搜索了一段时间,没有发现太多,所以任何帮助都将不胜感激。

【问题讨论】:

【参考方案1】:

所以根据specification

peers:(二进制模型)不使用上述字典模型,peers 值可以是由 6 个字节的倍数组成的字符串。前 4 个字节是 IP 地址,后 2 个字节是端口号。全部采用网络(大端)表示法。

这是紧凑标志设置为 1(真)的时候,我只关心这个 atm,因为它看起来很标准。

解析完编码后的announce文件后,取出key 'peers'会得到6字节字符串的倍数。

这个字符串是二进制数据并且是大端的,所以我们可以解析第一个地址(在 Python 中):

decoded = bdecode(announce) # decode the bencoded announce
binary_ip = decoded['peers']
print len(binary_ip) # this will be a multiple of 6 (ie, 12 = 2 ip:port)
offset = 0
ip1 = struct.unpack_from("!i", binary_ip, offset)[0] # ! = network order(big endian); i = int
first_ip = socket.inet_ntoa(struct.pack("!i", ip1)
offset +=4 # save where the first ip ends and the port begins
port1 = struct.unpack_from("!H", binary_ip, offset)[0] # H = unsigned short
offset += 2

如果有更多的对等 ips 要读取,显然你可以遍历它。

【讨论】:

【参考方案2】:

您应该阅读bittorrent specification 和compact announce extension

网络顺序(小端)?

“网络订单”无需进一步限定generally is big endian。

有人可以向我解释如何将这些十六进制数字解析为 ip:port 地址吗?

它们不是十六进制数字。经编码的数据是没有任何特定字符集的原始二进制文件。无论您使用什么来显示它都会创建十六进制输出。

【讨论】:

感谢您为我指明正确的方向。想通了几乎要在 Python 中写下我的答案。

以上是关于在来自 Tracker Server (bitTorrent) 的 Annouce 响应中解析 Peers IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

来自 Tracker Network API (SWIFT) 的 JSON

来自上下文案例类的隐式 val

Bittorrent:响应消息“???ackeConnection ID 不匹配”是啥意思。 from tracker server 是啥意思?

重新初始化后 OpenCV 3 Tracker 将无法工作

confluence 统计页面访问量插件Page View Tracker

fastdfs学习二————集群各项测试