正在分析来自跟踪服务器(bitTorrent)的通知响应中的对等方IP地址

正在分析来自跟踪服务器(bitTorrent)的通知响应中的对等方IP地址,bittorrent,tracker,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 结果是提供了一个公告文件。对该文件进行编码后,您将获得:

因此,我们提出以下要求:

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
结果是提供了一个公告文件。对该文件进行编码后,您将获得:

{'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'
如果这是网络订单(little endian)

我读到:

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

因此,端口可能由“\xd8\x05”组成:216*256+5=55301,也可能不是

有人能给我解释一下如何将这些十六进制数解析成ip:端口地址吗

已经在谷歌上搜索了一段时间,没有找到太多的帮助,因此我们将不胜感激。

您应该阅读和

网络秩序(小端)

“网络订单”,无需进一步限定

有人能给我解释一下如何将这些十六进制数解析成ip:端口地址吗

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

因此根据

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

这是当compact标志设置为1(True)时,我只关心这个atm,因为它看起来很标准

解析bencodedannound文件后,拉出键“peers”将得到6字节字符串的倍数

该字符串是二进制数据,是大端数据,因此要解析我们可以解析的第一个地址(在Python中):


显然,如果有更多的对等IP需要阅读,您可以在此循环。

感谢您为我指明了正确的方向。我想我会用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