【发布时间】:2020-04-18 01:12:40
【问题描述】:
我正在 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。
我应该在给定时间内向某个对等方发送多少请求?
【问题讨论】:
标签: python p2p bittorrent