Я реализую протокол 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 Мб.
Сколько запросов я должен отправить определенному пиру в данный момент времени?