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

问题描述 投票:1回答:1

我正在用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个回答
0
投票

似乎有3个问题。

1)你不保持跟踪status 为每个同行。所以,当你发送一个片子请求给一个对等体时,你需要输入一个状态 "下载",当对等体给你发送片子回来或被拒绝时,你把它放回 "准备好",以便你的下一个请求。

2)你用积木(子块)把棋子弄乱了。每一块都有许多小块。通常你可以请求的最大尺寸是0x4000 16384字节。所以你需要把你的初始件拆成16384的子件,最后一个(可能)有一个更小的子件。

3)你在 "单次请求 "中发送多少块子件......你不能随便发送大量的子件请求,因为你会被对方拒绝,甚至断开连接。同样,通常一次发送6个子件应该是可以的。

不幸的是,这些细节并没有真正的记录在案。你只能通过调试(wireshark rocks)&尝试来发现它们:)

© www.soinside.com 2019 - 2024. All rights reserved.