BitTorrent对等线协议(TCP)

时间:2010-11-08 22:59:02

标签: binary bittorrent

同行如何编码或发送/接收消息?

如果有消息

have: <len=0005><id=4><piece index> 

如何发送(以二进制形式,如何将其转换为二进制文件?)并收到?

是否有将消息发送给对等方的特定顺序?

我已经阅读了规范,但它给我留下了问题。

由于

2 个答案:

答案 0 :(得分:3)

在声明have消息之前the specification说:

  

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

你有长度和id的二进制格式。 'piece index'部分是此消息的特定有效负载。它应该是四个字节长,因为消息具有5个字节的固定大小,并且1个字节进入消息ID(查看具有相同格式的其他消息应该给你一个线索)。

答案 1 :(得分:3)

我会回答订购问题。

通常,您可以随时发送任何消息。但是有些消息有特殊规则。例如,必须提前发送BITFIELD消息。大多数客户按照他们要求的顺序发回PIECE,但我不认为这是内存服务的要求。

通常,消息有两种类型。一种是面向控制的消息告诉对等体一般状态(HAVE消息属于该组)。另一种是面向数据的消息,它实际上传输文件并从对等方请求新数据。这些消息类型是“交错的”,并且发送不超过16千字节的PIECE消息的原因之一是确保控制消息可以在它们之间交错。一个技巧是,当发送PIECE消息时,然后在下一个PIECE消息之前按优先级发送所有面向控制的消息。这样,您可以快速告诉对方您的意图。

原始协议中还存在一个“错误”,由FAST扩展解决。它有效地使每个REQUEST结果为PIECE消息或REJECT-REQUEST消息。这是订购的另一个例子。如果您收到REJECT-REQUEST消息,表示您从未请求过,请断开同伴的连接。