Bittorrent 协议 TCP 通信示例

Bittorrent protocol TCP communication example

我正在尝试实现一个 bittorent 客户端,但我卡在了我成功连接到对等点的部分,但我不知道如何与对等点通信。

我设法解码了 torrent 元数据文件,我成功地从那里获得了所有信息,我通过 TCP 连接到对等点,我发送了握手消息,我从对等点收到了握手消息,但在那之后我没有收到来自对等方的任何消息(我期待有消息)。我尝试向对等方发送 unchoke 消息并开始接收一些数据,但我不知道如何理解这些数据。

这是我目前所拥有的:

s.connect((ip, port))
print "Connected"

message = "%s%s%s%s%s" % (chr(19), "BitTorrent protocol", 8 * chr(0),
                         handshake_params["info_hash"], 
                         handshake_params["peer_id"]

s.send(message)
handshake_data = s.recv(4096)

# unchoke
m = struct.pack(">IB", 1, 1)
s.send(m)
data = s.recv(4096)

print handshake_data
print struct.unpack("B" * len(data), data)

这是输出:

BitTorrent protocolp    p�I0a��9"x`��-UT3450-��kP+�BG   ���������
(255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 231, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 127, 255, 251, 255, 255, 255, 255, 255, 255, 223, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 127, 255, 221, 255, 255, 255, 255, 255, 191, 191, 255, 255, 127, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 247, 255, 255, 255, 255, 255, 255, 255, 255, 255, 239, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 191, 255, 255, 255, 255, 255, 255, 255, 255, 251, 255, 255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252, 0, 0, 0, 5, 4, 0, 0, 4, 191, 0, 0, 0, 5, 4, 0, 0, 1, 123, 0, 0, 0, 5, 4, 0, 0, 2, 122, 0, 0, 0, 5, 4, 0, 0, 2, 126, 0, 0, 0, 5, 4, 0, 0, 2, 177, 0, 0, 0, 5, 4, 0, 0, 2, 104, 0, 0, 0, 5, 4, 0, 0, 1, 37, 0, 0, 0, 5, 4, 0, 0, 0, 174, 0, 0, 0, 5, 4, 0, 0, 4, 157, 0, 0, 0, 5, 4, 0, 0, 0, 4, 0, 0, 0, 5, 4, 0, 0, 3, 172, 0, 0, 0, 5, 4, 0, 0, 2, 241, 0, 0, 0, 5, 4, 0, 0, 1, 90, 0, 0, 0, 5, 4, 0, 0, 3, 251, 0, 0, 0, 5, 4, 0, 0, 2, 200, 0, 0, 0, 5, 4, 0, 0, 0, 179, 0, 0, 0, 5, 4, 0, 0, 0, 180, 0, 0, 0, 5, 4, 0, 0, 3, 113, 0, 0, 0, 5, 4, 0, 0, 4, 181, 0, 0, 0, 5, 4, 0, 0, 1, 16, 0, 0, 0, 5, 4, 0, 0, 2, 169, 0, 0, 0, 5, 4, 0, 0, 4, 81, 0, 0, 0, 5, 4, 0, 0, 2, 57, 0, 0, 0, 5, 4, 0, 0, 1, 219)

握手数据看起来没问题。我想不通的是为什么我在那里得到这么多 255 个字节。我试图使用 length_prefix、message_id、有效载荷格式解码消息,但由于我在开头得到了这么多 255 个字节,所以导致消息长度过大,我没有这么大的消息。

我应该尝试滤除任何类型的噪音吗?如果你向右滚动很多,你会看到在某些时候字节开始正常,但我不知道如何处理消息的开头。

s.recv(4096)

您只是在读取一些未指定长度的数据块,大概是 TCP 缓冲区中的任何内容。

Bittorrent 是基于消息的。 TCP 是一个字节流,这意味着它不能很好地将远程对等点发送的数据分割成消息,你必须自己做。