Python 我如何与来自DHT网络的对等方进行通信?

Python 我如何与来自DHT网络的对等方进行通信?,python,bittorrent,dht,Python,Bittorrent,Dht,我最近正在学习Bit torrent协议,我已经使我的脚本成功地通过DHT协议获取了大量对等地址,具体取决于文件bep_0005: 如果查询的节点具有infohash的对等节点,则将以 键“values”作为字符串列表。每个字符串都包含“compact” 为单个对等点设置对等信息的格式 所以,我将这些“值”解码为ip/端口 我尝试通过TCP套接字与他们连接,超时,无法访问网络,出现连接拒绝错误 我尝试通过UDP套接字发送依赖于bep_0029的握手消息,但没有人回复 任何人都可以告诉我,有什么

我最近正在学习Bit torrent协议,我已经使我的脚本成功地通过DHT协议获取了大量对等地址,具体取决于文件bep_0005:

如果查询的节点具有infohash的对等节点,则将以 键“values”作为字符串列表。每个字符串都包含“compact” 为单个对等点设置对等信息的格式

所以,我将这些“值”解码为ip/端口

我尝试通过TCP套接字与他们连接,超时,无法访问网络,出现连接拒绝错误

我尝试通过UDP套接字发送依赖于bep_0029的握手消息,但没有人回复

任何人都可以告诉我,有什么问题吗?连接这些同龄人的正确方式是什么?或者说,正常情况下,99%的人无法连接,我只是没有找到1%的好同事

谢谢大家!

这是我从追踪者那里得到的对等点的TCP响应

但DHT没有带来好运

# This is function I decode ip/port
def decode_peers(peers):
    ret = []
    for ipport in peers:
        try:
            ret.append((socket.inet_ntoa(ipport[:4]), unpack('>H', ipport[-2:])[0]))
        except Exception as err:
            logging.critical(err)
    return ret

# This is an bdecoded example what I received from nodes, and I passed "value" part to the upon function.
[03:53:05](DEBUG): OrderedDict([(b'ip', b'n\xbc;,\xf1\x87'), (b'r', OrderedDict([(b'id', b'\xcf\x1c@\xfb\x86?\x17\xb0\x95\xd1\xb9:\x9a\xf1\x9c\xf1v\x03\xa82'), (b'nodes', b'\x85\xd7\x80\x1b\x8a"V\xd9>\xf8<\xa2\x0e2~\x84j\x94wIA\xb2\x19&\x8b\x0c\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde0\x05\xb2\xce\xe2\x0b8j\xd1\xd3.\x85\x8cH\x8c\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde0\x06\x8d\x81\x1f\xe4\xc5\x88\xec\xad\xfc\x1a\xcf\x9e\xa6\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde0\x07 \xbcR\x1d*u\x0e.\xa8E\x12G\xdb\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde1\x80r\xfdn\x8d!\r\x17\xbfU\xb5\x87\x81t\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde1\x81\x90\xc0\x13Pw\x91\x87\xc25\x9d1\x881\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde1\x82m"\x12-\x96\xc7\x1fY}\xe4_\x9f\xff\xcf\x1c@\xfb\x86?\x18\x93$\xdf\xde1\x83\x82\xdb\xf0\x10\xeb&I\xc5}\xece\x13\xc9'), (b'token', b'\na\xb8\x15'), (b'values', [b'9Bq\xf1X\xea', b'9\x07r7\x9a\xee', b'\x7fg\xb8\x17\x9e\x90', b'\xc1d\xfa\xa5\x01\x94', b'\x04r=!C\x9a', b'Fv\x7f\xa7\x86\x9e', b'\x89s\x7f\xf3\xc8\xa4'])])), (b't', b'\xc3\x8b\xc2\x9d'), (b'v', b'LT\x00\x11'), (b'y', b'r')])

# This is result I got from decode function, there is no difference when I compare to what Wireshark decode under DHT protocol.
[04:03:56](DEBUG): [('57.66.113.241', 22762), ('57.7.114.55', 39662), ('127.103.184.23', 40592), ('193.100.250.165', 404), ('4.114.61.33', 17306), ('70.118.127.167', 34462), ('137.115.127.243', 51364)]
#这是我解码ip/端口的功能
def解码_对等(对等):
ret=[]
对于对等中的iPort:
尝试:
ret.append((socket.inet_ntoa(ipport[:4]),unpack('>H',ipport[-2:])[0]))
除异常作为错误外:
日志记录。严重(错误)
回程网
#这是我从节点收到的一个编码示例,我将“value”部分传递给on函数。
[03:53:05](调试):OrderedDict([(b'ip',b'n\xbc;,\xf1\x87'),(b'r',OrderedDict([(b'id',b'\xcf\x1c@\xfb\x86?\x17\xb0\x95\xd1\xb9:\x9a\xf1\xf1v\x03\xa82'),(b'nodes',b'\x85\xd7\x80\x1b\xba“V\xd9>\xf8
('127.103.184.23',40592)

这显然是垃圾。127.0.0.0/8块不是通过internet路由的,因此任何节点都不应包含任何包含地址的数据

我建议您使用一个流行的、已知良好的torrent,删除其公告URL并将其放入支持DHT的客户端。然后观察其行为并将其与您自己的实现进行比较

一般来说,由于存在bug或恶意实现,预计会有一小部分垃圾。但一般来说,这应该只是一小部分(小于99%),找到一个好的地址应该足以连接到swarm,然后执行PEX以获得更多对等方。
如果您有一个恶意ISP操纵流量插入虚假数据,那么这一比例可能会比正常情况高得多。

发布一些数据包捕获+解码内容。您可能需要在流行的torrent上进行测试。并与现有实现进行比较,以查看该实现是否有效。您是否验证了TCP对等协议实现使用非DHT对等机了吗?我最近测试了一个新的BitTorrent实现,我发现在尝试连接到internet上的对等机之前,在已知端口上本地运行客户端要容易得多。(在我的例子中,我使用的是docker映像(),因此我可以轻松地共享和重置测试对等机的状态。)谢谢你回复我,我已经上传了Wireshark的数据包捕获截图。你可以看到我的TCP实现可能工作正常。但我仍然无法从DHT的同行那里得到任何响应,他们甚至都无法建立连接,这让meI很沮丧,因为他问的是DHT消息的数据包捕获(对
get_peers
query的响应)和您的解码结果。我推测您的解码不正确。我更新了,我解码的内容与Wireshark没有区别。好吧,我按照您的建议,最后我发现问题是我解码了“值”不正确。我安装了一个正常工作的应用程序,它解码的地址与我的和Wireshark都不一样(当我尝试过滤ip时没有任何内容。addr==[Wireshark解码的一些ip])。在“值”上有什么魔力吗?没有魔法,IP IP的每个
值都是4或16字节,端口的每个值都是2字节,都是bigendian。至于与客户端比较,您是否检查了它们是传入连接还是传出连接?传入连接不一定与您从
get\u对等方获得的连接相匹配