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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

好像有3个问题:

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

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

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

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

【讨论】:

以上是关于BitTorrent:发送请求的最佳速率?的主要内容,如果未能解决你的问题,请参考以下文章

为 Web 请求实现速率限制算法的最佳方法是啥?

Bittorrent 在多个对等点之间维护状态

“分布式存储公链”BITT跑路?

ASP.NET Core中如何限制响应发送速率(不是调用频率)

“分布式存储公链BITT”跑路,一台矿机卖1.5万割了多少韭菜

通过 UDP 向 Bittorrent Tracker 发送信息哈希