Пропингуйте DHT-узел router.utorrent.com с помощью netcat

Я просто пытаюсь получить ответ от router.utorrent.com, чтобы потенциально запустить службу DHT в будущем. Например, учитывая магнитную ссылку с:

xt=urn:btih:a78c852bcc0379e612e1bd794e1fd19061b84d11

хэш:

a78c852bcc0379e612e1bd794e1fd19061b84d11

Затем в терминале я ввел это:

nc -u router.utorrent.com 6881


d1:ad2:id20:a78c852bcc0379e612e1bd794e1fd19061b84d11e1:q4:ping1:t1:01:y1:qe

на основе этой документации, но я не получил никакого ответа. Я даже пробовал Wireshark, чтобы проверить, возвращается ли какой-либо пакет, и все равно ничего. Почему µTorrent не разговаривает со мной?


person Cadell Christo    schedule 25.10.2012    source источник


Ответы (2)


Хэш должен быть в двоичном формате. При кодировании число + двоеточие является префиксом длины строки. Шестнадцатеричный sha1 имеет длину 40 байт, чтобы на самом деле иметь длину 20 байт, он должен быть необработанным выводом хэш-функции.

В основном вам нужно преобразовать шестнадцатеричную строку в двоичную (40 шестнадцатеричных -> 20 двоичных), чтобы она работала.

person the8472    schedule 29.10.2012
comment
Спасибо за ваш ответ. немного расширьте это, я новичок в этом. что мне делать с хешем, который у меня выше? - person Cadell Christo; 01.11.2012
comment
так должен отправить это? d1:ad2:id20:1001010011100001111111101000110010000011000011011100000000000000000000e1:q4:ping1:t1:01:y1:qe - person Cadell Christo; 18.11.2012
comment
нет. я уже писал это в своем ответе: 40 байтов в шестнадцатеричном формате -> 20 байтов в необработанном двоичном формате. - person the8472; 19.11.2012
comment
извините, я не хочу раздражать, я просто хочу понять, что я преобразовал шестнадцатеричный код a78c852bcc0379e612e1bd794e1fd19061b84d11 в двоичный код 1001010011100001111111010001100100000110000110111000000000000000000000000000000000000000000000000 тогда что мне делать - person Cadell Christo; 19.11.2012
comment
Бинарный. 8-битное представление. шестнадцатеричный код. base256 вместо base16 или base2. - person the8472; 20.11.2012
comment
stackoverflow.com/questions/3844502/ это помогло, так что информационный блок торрентов был закодирован, а затем закодирован sha1 для получения «информационного хэша». этот информационный хэш представляет собой 20-байтовый двоичный файл. хэш из магнитной ссылки представляет собой кодировку base32 «информационного хэша». поэтому мне нужно декодировать магнитный хэш base32, чтобы получить «информационный хэш»? - person Cadell Christo; 20.11.2012
comment
unitconversion.org/numbers/base-32-to-binary- convert.html я использовал этот сайт. это выглядит правильно? a78c852bcc0379e612e1bd794e1fd19061b84d11 в 1010001110100001100010000010100010010110110001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - person Cadell Christo; 20.11.2012
comment
кроме того, аргумент id в сообщениях DHT должен быть идентификатором вашего узла, который вы выбираете случайным образом. нет необходимости вставлять туда информационный хэш. - person Arvid; 24.12.2012

Как объяснено в другом ответе, бенкодирование - это двоичный формат, а не текстовый формат. Похоже, вы пытаетесь ввести тело сообщения в netcat с помощью терминала. Терминалы предназначены для ввода текстовых данных в программы, а не двоичных, поэтому вы не сможете напрямую ввести эту последовательность в стандартный ввод netcat.

Идентификатор в вашем пинг-запросе не должен быть информационным хешем торрента. Это должен быть уникальный идентификатор для идентификации вашего клиента в сети DHT. Для тестирования вы действительно можете просто выбрать идентификатор, полностью состоящий из 20 символов ASCII, и избежать этих проблем с кодировкой, но на практике вы захотите использовать равномерно случайные двоичные идентификаторы.

Если вы хотите получить двоичный идентификатор в терминале, вам не следует пытаться вводить его непосредственно в netcat. Вместо этого вы можете использовать команду echo вашей оболочки и шестнадцатеричное кодирование для создания данных в предполагаемом формате и передать их в netcat. Например, в Баше:

echo -n $'d1:ad2:id20:\x23\x71\x0c\x1c\xb4\x50\x7d\x87\x29\xb8\x3f\x87\x2c\xc6\xa2\xa4\x4c\x39\x73\x67e1:q4:ping1:t1:01:y1:qe' | nc -u router.utorrent.com 6881

Обратите внимание, что ответ, который вы получите от узла, будет неэкранированным двоичным, а не обязательно текстовым, поэтому отображение его непосредственно в вашем терминале, как мы делаем здесь, может привести к тому, что что-то будет выглядеть странно или ваш текущий сеанс терминала каким-то образом испортится.

person Jeremy    schedule 07.03.2014