从跟踪器服务器(bitTorrent)解析Annouce响应中的对等IP地址

时间:2015-07-20 00:44:51

标签: bittorrent tracker

以下请求:

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文件。在该文件被bendecoded后,你得到:

{'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:端口地址吗?

谷歌搜索了一段时间没有找到太多,所以任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

按照specification

  

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

这是紧凑标志设置为1(True)的时候,我只关心这个atm,因为它似乎非常标准。

在解析了bencoded宣布文件后,拉出关键字'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

显然,如果有更多的peer ips要阅读,你可以循环使用。

答案 1 :(得分:1)

您应该阅读bittorrent specificationcompact announce extension

  

网络订单(小端)?

"网络订单"没有进一步的资格generally is big endian

  

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

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