首页 > 解决方案 > 同行不发回未取消消息

问题描述

我正在创建一个 bittorrent 客户端,并试图与同行交流,我需要不被窒息才能最终接收到碎片。

我一直在向同行发送 uncoke 和感兴趣的消息,我希望他们发回我的 uncoke 消息,但没有成功接收到它

我主要关注这篇文章,它指出您必须在创建握手后发送感兴趣的消息(我已经成功完成)

这是我用来创建感兴趣的消息的代码

 12 def generateinterested():
 13   return struct.pack('>iB', 1, 2)

作为十六进制转储,这是:

00000000: 00 00 00 01 02                                    .....

发送该消息没有得到回复。一个类似的问题说,您在握手后发送了一条未锁定的消息(而不是感兴趣),这与原始文章相冲突。

我已尝试使用以下代码创建未锁定消息

  9 def generateunchoke():
 10   return struct.pack('>iB', 1, 1)

作为十六进制转储,这是:

00000000: 00 00 00 01 01                                    .....

两者都没有像我预期的那样产生对等方发回未阻塞消息的结果。我在这里做错了什么?我是否打算在握手后发送我感兴趣或未锁定的消息以接收未锁定的消息?

我收到不一致的消息。2% 的时间,对等方会发回一个 uncoke。其他 98% 我等了超过一分钟没有得到回复。为什么是这样?

如果您不熟悉 bittorrent 消息,这里有一些帮助

标签: pythonnetworkingstructp2pbittorrent

解决方案


发送感兴趣的消息并不能保证您会收到一条畅通无阻的消息。发出兴趣的信号仅仅意味着同行会认为你是一个不折不扣的候选人。换句话说,您必须等待。多长时间取决于远程对等方的决策。

表示兴趣不是一种有预期响应的请求形式。它只是将您当前的状态通告给您连接的所有对等方。其中一些可能会选择在未来的某个时候解除你的束缚,而另一些则可能不会,而且这种解除会随着时间的推移而改变。当您向他们上传数据时,他们更有可能解除您的束缚。请参阅bittorrent 经济学论文,了解预期客户总体行为方式的基线。

快速扩展在启动期间提供了更及时的行为。同行通常遵循一种通用算法来计算允许您下载的一组片段,然后告诉您他们计算了哪一组,然后您可以请求这些片段而不会被取消。


推荐阅读