python - 同行不发回未取消消息
问题描述
我正在创建一个 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 消息,这里有一些帮助
解决方案
发送感兴趣的消息并不能保证您会收到一条畅通无阻的消息。发出兴趣的信号仅仅意味着同行会认为你是一个不折不扣的候选人。换句话说,您必须等待。多长时间取决于远程对等方的决策。
表示兴趣不是一种有预期响应的请求形式。它只是将您当前的状态通告给您连接的所有对等方。其中一些可能会选择在未来的某个时候解除你的束缚,而另一些则可能不会,而且这种解除会随着时间的推移而改变。当您向他们上传数据时,他们更有可能解除您的束缚。请参阅bittorrent 经济学论文,了解预期客户总体行为方式的基线。
快速扩展在启动期间提供了更及时的行为。同行通常遵循一种通用算法来计算允许您下载的一组片段,然后告诉您他们计算了哪一组,然后您可以请求这些片段而不会被取消。
推荐阅读
- node.js - 通过嵌入关系的属性查询 MongoDB 集合
- laravel - 检查用户是否已经在 Laravel 中添加了特定产品
- python - f(n)=(1-f(n-1))*c+f(n-1)的递归解应该是什么,其中f(0)=c?
- github-actions - github 操作中的构建过程已完成,退出代码 2
- ios - 在 React Native 中创建 IOS 上下文菜单
- google-cloud-platform - 无法连接到服务器:x509:证书由谷歌云外壳内的未知权威签名
- node.js - SOLR java.lang.NumberFormatException
- javascript - 如何使用 NodeJS 自动化 Selenium 中的日期选择器?
- regex - 查找匹配的正则表达式模式之前的立即出现
- firebase - 如何在桌面应用程序中保持 Firebase 实时数据库架构兼容?