Binary BitTorrent对等有线协议(TCP)

Binary BitTorrent对等有线协议(TCP),binary,bittorrent,Binary,Bittorrent,对等方如何编码或发送/接收消息 如果有消息 拥有: 如何发送(二进制,如何翻译成二进制?)和接收 是否有向对等方发送消息的特定顺序 我已经阅读了说明书,但它给我留下了一些问题 在声明之前,感谢,have消息说: 协议中的所有剩余消息均采用的形式。长度前缀是一个四字节的大端值。消息ID是一个十进制字节。有效负载取决于消息 这里有长度和id的二进制格式。“片段索引”部分是该消息的特定负载。它应该有四个字节长,因为消息的固定大小为5个字节,1个字节指向消息ID(查看其他具有相同格式的消息会给您提供线

对等方如何编码或发送/接收消息

如果有消息

拥有:
如何发送(二进制,如何翻译成二进制?)和接收

是否有向对等方发送消息的特定顺序

我已经阅读了说明书,但它给我留下了一些问题


在声明之前,感谢

,have消息说:

协议中的所有剩余消息均采用的形式。长度前缀是一个四字节的大端值。消息ID是一个十进制字节。有效负载取决于消息


这里有长度和id的二进制格式。“片段索引”部分是该消息的特定负载。它应该有四个字节长,因为消息的固定大小为5个字节,1个字节指向消息ID(查看其他具有相同格式的消息会给您提供线索)。

我将回答排序问题

通常,您可以随时发送任何消息。但是有些信息有特殊的规则。例如,必须提前发送位字段消息。大多数客户都会按照要求的顺序发回,但我认为如果内存可用,这不是一个要求

一般来说,消息有两种类型。一种是面向控件的消息,告诉对等方一般状态(将消息归入此组)。另一种是面向数据的消息,它实际传输文件并从对等方请求新数据。这些消息类型是“交错”的,您发送不超过16KB的分段消息的原因之一是为了确保控制消息可以在两者之间交错。一个技巧是,当一条消息被发送时,在下一条消息之前,按优先级发送所有面向控件的消息。这样,你就可以很快告诉对方你的意图


原始协议中还有一个“bug”,通过快速扩展解决了这个bug。它有效地使每个请求产生一条消息或一条拒绝请求消息。这是另一个排序示例。如果您收到一条拒绝请求的消息,但您从未请求过,那么您可以断开对等方的连接。

“查看相同格式的其他消息应该会给您一个线索”。这是我的问题:)。还有什么是,例如,或?如果消息是这样的,则<>之间的值将替换为二进制表示形式?假设工件索引为7(为什么不?),则整个消息将为:0x000000050400007。谢谢。在文档稀少的情况下,人们是如何发现这些东西的呢?好吧,为了好玩,您实现了两个BitTorrent客户端:)(我有两个,一个在Erlang,一个在Haskell)。规范很少,但您会发现,当您开始实现客户机时,通常只有一件明智的事情要做。我唯一要问的是“当你掐死一个同伴时,你会删除你本地的请求消息队列吗?”。这个问题的答案是肯定的,它与我提到的“bug”有关。我读过你的文章,比较了客户的两种语言。您拥有Erlang中唯一值得使用的torrent客户端。尼斯:)嗯,就明智的事情而言,是的,我想,但我现在面临的问题是正确实现协议。从文档中看不太清楚。谢谢上面的提示;)嗯,它不像HTTP那样是一个简单的协议。您可以在几个小时内轻松启动并运行一个基本(非一致)HTTP客户端。BitTorrent的情况并非如此。这是一个相当复杂的协议,在实现它时会遇到很多小麻烦。但这些奇怪之处也让协议变得有趣和有趣。
have: <len=0005><id=4><piece index>