2017-02-11 3 views
1

Я изучаю протокол Bit-торрент в последнее время, и я сделал мой сценарий успешно получить тонну сверстников решения по протоколу DHT зависит от документа bep_0005:Как я могу общаться с коллегами из сети DHT?

http://www.bittorrent.org/beps/bep_0005.html

Если запрашиваемый узел имеет пэр для infohash, они возвращаются в «значениях» в виде списка строк. Каждая строка содержит «compact» формат одноранговой информации для одного однорангового узла.

Итак, я расшифровываю эти «значения» на ip/port.

Я попытался соединиться с ними через TCP-сокет, тайм-аут, сеть недоступна, соединение отклонено.

Я попытался отправить сообщение подтверждения связи bec_0029 через сокет UDP, но никто из них не ответил.

Любой может сказать мне, что-то не так? Каков правильный способ подключения этих сверстников? или Это нормально, 99% из них не могут подключиться, я просто не получаю этих 1% хороших сверстников?

Спасибо!

Это TCP реакция коллег, которые я получил от трекеров

Но не повезло с DHT.

# This is function I decode ip/port 
def decode_peers(peers): 
    ret = [] 
    for ipport in peers: 
     try: 
      ret.append((socket.inet_ntoa(ipport[:4]), unpack('>H', ipport[-2:])[0])) 
     except Exception as err: 
      logging.critical(err) 
    return ret 

# This is an bdecoded example what I received from nodes, and I passed "value" part to the upon function. 
[03:53:05](DEBUG): OrderedDict([(b'ip', b'n\xbc;,\xf1\x87'), (b'r', OrderedDict([(b'id', b'\xcf\[email protected]\xfb\x86?\x17\xb0\x95\xd1\xb9:\x9a\xf1\x9c\xf1v\x03\xa82'), (b'nodes', b'\x85\xd7\x80\x1b\x8a"V\xd9>\xf8<\xa2\x0e2~\x84j\x94wIA\xb2\x19&\x8b\x0c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x05\xb2\xce\xe2\x0b8j\xd1\xd3.\x85\x8cH\x8c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x06\x8d\x81\x1f\xe4\xc5\x88\xec\xad\xfc\x1a\xcf\x9e\xa6\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x07 \xbcR\x1d*u\x0e.\xa8E\x12G\xdb\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x80r\xfdn\x8d!\r\x17\xbfU\xb5\x87\x81t\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x81\x90\xc0\x13Pw\x91\x87\xc25\x9d1\x881\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x82m"\x12-\x96\xc7\x1fY}\xe4_\x9f\xff\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x83\x82\xdb\xf0\x10\xeb&I\xc5}\xece\x13\xc9'), (b'token', b'\na\xb8\x15'), (b'values', [b'9Bq\xf1X\xea', b'9\x07r7\x9a\xee', b'\x7fg\xb8\x17\x9e\x90', b'\xc1d\xfa\xa5\x01\x94', b'\x04r=!C\x9a', b'Fv\x7f\xa7\x86\x9e', b'\x89s\x7f\xf3\xc8\xa4'])])), (b't', b'\xc3\x8b\xc2\x9d'), (b'v', b'LT\x00\x11'), (b'y', b'r')]) 

# This is result I got from decode function, there is no difference when I compare to what Wireshark decode under DHT protocol. 
[04:03:56](DEBUG): [('57.66.113.241', 22762), ('57.7.114.55', 39662), ('127.103.184.23', 40592), ('193.100.250.165', 404), ('4.114.61.33', 17306), ('70.118.127.167', 34462), ('137.115.127.243', 51364)] 
+0

Опубликовать некоторый пакетный захват + то, что вы расшифровали. и вы можете протестировать на популярном торренте. и сравните с существующей реализацией, чтобы увидеть, работает ли этот файл. – the8472

+0

Вы проверили свою реализацию протокола TCP-протокола с не-DHT-сверстниками? Я недавно тестировал биты новой реализации BitTorrent, и я нашел намного проще при запуске клиента локально, на известном порту, прежде чем пытаться подключиться к одноранговым узлам в Интернете. (В моем случае я использую изображение докеры (на основе этого) (https://github.com/camillebaronnet/docktorrent)), поэтому я могу легко поделиться и сбросить состояние своего тестового партнера.) –

+0

Спасибо, что ответил , Я уже загрузил снимок экрана из пакета Wireshark. вы можете увидеть, что моя реализация TCP может работать правильно.Но я все еще не могу получить ответ от сверстников в DHT, все они просто не могут даже установить соединение, это расстраивает меня –

ответ

1

('127.103.184.23', 40592)

Это явно нездоровая. Блок 127.0.0.0/8 не маршрутизируется через Интернет, поэтому ни один узел не должен иметь никаких данных, содержащих в нем адрес.

Предлагаю вам воспользоваться популярным, известным хорошим торрентом, удалить его URL-адреса и разместить его в клиенте с поддержкой DHT. Затем наблюдайте его поведение и сравнивайте его с вашей собственной реализацией.

Вообще говоря, ожидается некоторая доля нежелательной почты, так как там есть глючные или вредоносные реализации. Но в целом это должно быть только небольшая часть (меньше 99%), и найти один хороший адрес должен быть достаточно, чтобы подключиться к рою, а затем выполнить PEX, чтобы получить больше сверстников. Если у вас есть злонамеренный интернет-провайдер, который управляет трафиком для вставки фиктивных данных, тогда эта доля может быть намного выше, чем обычно.

+0

Хорошо, я последовал твоему предложению, наконец, у меня возникла проблема в том, что я неправильно декодирую «значения». Я установил рабочее приложение, оно полностью декодирует адреса, которые не сравниваются ни с моими, ни с Wireshark (нет ничего, когда я пытаюсь фильтровать ip.addr == [некоторые IP-адреса, декодированные Wireshark]). Есть ли магия на «ценности»? –

+0

нет магии, каждая запись 'values' составляет 4 или 16 байтов для IP-IP, за которой следуют 2 байта для порта, все bigendian. а для сравнения с клиентом вы проверили, являются ли они входящими или исходящими соединениями? входящие не обязательно соответствуют тому, что вы получили от 'get_peers' – the8472

Смежные вопросы