【问题标题】:BitTorrent: Optimal rate for sending requests?BitTorrent:发送请求的最佳速率?
【发布时间】: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


    【解决方案1】:

    好像有3个问题:

    1) 您不会为每个对等方跟踪/状态。因此,当您向对等方发送片段请求时,您需要将状态设置为“正在下载”,并且当对等方将片段发回或拒绝时,您将其放回“准备就绪”以等待您的下一个请求

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

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

    不幸的是,这些细节并没有真正记录在案。您只能通过调试(wireshark 岩石)和尝试找到它们 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多