BitTorrent: оптимальная скорость отправки запросов? - PullRequest
1 голос
/ 18 апреля 2020

Я реализую протокол BitTorrent в python, и до сих пор мне удалось установить sh соединения между узлами и передавать им сообщения. Сегодня я возился с написанием алгоритма запроса фрагментов и начал с запроса фрагментов в последовательном порядке. Если у пира нет части, или если часть уже была запрошена, я просто увеличил бы индекс части и посмотрел, есть ли у нее.

У меня есть сообщение, передающее l oop, которое выглядит следующим образом:

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()

Способ, которым я начал отправлять запросы, как показано выше, состоит в том, что если пэр меня отключил, то я мог бы сделать Новый запрос.

Я заметил некоторые странные вещи, наблюдая за трафиком сети c в Wireshark. Во время некоторых экспериментов я бы запретил отправку запроса одноранговому узлу, если бы я отправил этому узлу через определенный промежуток времени. Я заметил, что некоторые сверстники, которых я посылал, довольно сильно, а некоторые - совсем нет.

После того, как я снял это ограничение, я увидел, что запрашиваю части у пиров быстрее, чем они могут вернуть их мне, и wireshark будет показывать предупреждения «TCP Zero Window».

Последнее, что я пытался сделать, - это запросить кусок у сверстника, только если я только что получил его от этого сверстника. Казалось, это работает лучше всего, поскольку одноранговый узел, которым я пренебрегал (у моего торрента есть только 2 одноранговых узла), не обслуживает все мои запросы кусков, но кажется очень медленным. За 40 минут я получил 37 штук, что чуть больше 70 Мб.

Сколько запросов я должен отправить определенному пиру в данный момент времени?

...