我正在用python实现BitTorrent协议,到目前为止,我已经能够在同级之间建立连接并将消息传递给它们。今天我正忙着编写一个片段请求算法,然后我开始按顺序请求片段。如果对等方没有该部分,或者如果已经请求了该部分,那么我只需增加该部分的索引,然后查看对等方是否有该部分。
我有一个如下所示的消息传递循环:
while dont_have_all_pieces:
write = [peer for peer in self.peerConnector.peers if peer.write_data != '']
read = self.peerConnector.peers[:]
rx_list, tx_list, x_list = select.select(read, write, [])
for peer in rx_list:
# get messages to read
for peer in tx_list:
# send messages to peers
if peer.unchoked:
peer.next_message_to_send = MakeNewRequest()
如上所述,我开始发送请求的方式是,如果对方取消了我的请求,那么我可以发出新请求。
在wireshark中观察网络流量时,我注意到了一些奇怪的事情。在某些实验中,如果我在一定的时间间隔内向同一个对等方发送请求,我将阻止向同一个对等方发送请求。我注意到有些同僚寄给了我很多,有些根本没有。
取消该限制后,我发现我向同龄人请求的片段的速度超过了他们可以将它们还给我的速度,wireshark将显示“ TCP零窗口”警告。
我试图做的最后一件事是,如果我刚从同伴那里收到一件,就只向同伴索要一件。这似乎效果最好,因为我忽略的同伴(我的洪流只有2个同伴)无法满足我的所有请求,但似乎很慢。在40分钟内,我收到了37件,超过70Mb。
在给定的时间内我应该发送多少个请求给同一个对等体?
答案 0 :(得分:0)
似乎有3个问题:
1)您不会为每个同伴保持跟踪/状态。因此,当您向同伴发送件请求时,您需要将状态设置为“下载”,而当同仁将您的件发还给您或被拒绝时,则将其重新设置为“就绪”以供您下一个请求
2)您正在用块(子块)弄乱这些块。每块都有许多较小的块。通常,您可以请求的最大大小为0x4000 / 16384字节。因此,您需要将初始片段拆分为16384的子片段,而最后一个片段(可能)具有较小的片段。
3)您在“单个请求”中发送了多少块/子件...您不能仅发送大量子件请求,因为您将被拒绝,甚至与另一方断开连接。同样,通常一次可以6个子零件就可以了。
不幸的是,这些细节并没有真正记录在案。您只能通过调试(wireshark岩石)并尝试:)
找到它们