BitTorrent:发送请求的最佳速率?

2024-09-27 00:22:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用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零窗口”警告

我尝试的最后一件事是,如果我刚从一位同行那里收到一件作品,我就只向他索要一件。这似乎是最有效的,因为我忽略的对等点(我的torrent只有两个对等点)没有为我的所有工件请求提供服务,但它似乎非常慢。在40分钟内,我收到了37件,略高于70Mb

在给定的时间内,我应该向某个对等方发送多少个请求


Tags: toinselfforreadifrxselect
1条回答
网友
1楼 · 发布于 2024-09-27 00:22:50

似乎有三个问题:

1)您没有跟踪每个对等方的情况/状态。因此,当您向对等方发送工件请求时,您需要将其置于“下载”状态;当对等方将工件发回或拒绝时,您需要将其置于“准备就绪”状态,以供下次请求

2)你正在用块(子块)把碎片弄乱。每件作品都有一些较小的作品。通常,您可以请求的最大大小为0x4000/16384字节。因此,您需要将最初的片段拆分为16384的子片段,最后一个片段(可能)有一个较小的片段

3)您在“单个请求”中发送多少块/子块。。。您不能只发送大量子件请求,因为您将被拒绝,甚至与另一端断开连接。同样,通常一次6个子块就可以了

不幸的是,这些细节并没有真正记录下来。您只能通过调试(wireshark rocks)找到它们&;正在尝试:)

相关问题 更多 >

    热门问题