对等点如何编码或发送/接收消息?
如果有消息
have: <len=0005><id=4><piece index>
这是如何发送(二进制,如何转换为二进制?)和接收的?
消息发送到对等点是否有特定的顺序?
我已阅读规范,但它给我留下了疑问。
谢谢
我来回答订购问题。
一般来说,您可以随时发送任何消息。但有些消息有特殊规则。例如,BITFIELD 消息必须尽早发送出去。大多数客户按照请求的顺序将 PIECE 发回,但如果没记错的话,我认为这不是一个要求。
一般来说,消息有两种类型。一种是面向控制的消息,告诉对等方一般状态(HAVE 消息属于这一组)。另一种是面向数据的消息,它实际上传输文件并向对等方请求新数据。这些消息类型是“交错的”,发送不大于 16 KB 的 PIECE 消息的原因之一是确保控制消息可以在它们之间交错。一个技巧是,当发送一个 PIECE 消息后,然后在下一个 PIECE 消息之前按优先级发送所有面向控制的消息。这样,你就能快速告诉对方你的意图。
原始协议中还存在一个“bug”,已通过 FAST 扩展解决。它有效地使每个 REQUEST 结果要么是 PIECE 消息,要么是 REJECT-REQUEST 消息。这是排序的另一个示例。如果您收到一条 REJECT-REQUEST 消息,表示您从未请求过某件事,则您会断开对等点的连接。
在声明
have
消息之前 规范 说:
协议中的所有剩余消息均采用
的形式。长度前缀是一个四字节大端值。消息 ID 是一个十进制字节。有效负载取决于消息。
您已经获得了长度和 ID 的二进制格式。 “片段索引”部分是该消息的特定有效负载。它应该是 4 个字节长,因为消息的固定大小为 5 个字节,1 个字节用于消息 ID(查看具有相同格式的其他消息应该会给您提供线索)。
我知道这篇文章已经很老了,但我写了一些 Node.js 脚本来帮助理解 Bittorrent 协议,并且应该对任何想要理解该协议并偶然发现这个问题的人有所帮助。
主要脚本如下: https://github.com/liveduo/bittorrent-scripts/blob/main/3-connect-node.js
您可以轻松地在本地运行它,它甚至不需要
npm install
,因为它没有外部依赖项。
要开始,您只需要一个 torrent(即,magnet id)和一个包含该 torrent 的节点(即,节点 IP 地址和端口)。在存储库中有更多脚本可以获取拥有种子的节点。
如果您需要更多帮助才能使我在指南此处中编写的所有内容正常运行,其中包含说明和嵌入式脚本,您可以直接在网站上运行。