Может кто-нибудь пролить свет на то, что означает этот странный ответ DHT?

Иногда я получаю эти странные ответы от других узлов. Идентификатор транзакции совпадает с моим идентификатором транзакции запроса, а также с удаленным IP-адресом, поэтому я склонен полагать, что узел ответил этим, но это выглядит как сочетание ответа и запроса

d1:q9:find_node1:rd2:id20:.éV0özý.?tj­N.?.!2:ip4:DÄ.^7:nodes.v26:.ï?M.:iSµLW.Ðä¸úzDÄ.^æCe1:t2:..1:y1:re

Хуже всего то, что он поврежден. Посмотрите на 7:node.v это означает, что я добавляю node.v в словарь. Предполагается, что будет 5: узлов. Итак, я потерян. Что это?

1 ответ

Решение

Интернет и удаленные узлы ненадежны или глючат. Вы должны кодировать в обороне. Не думайте, что все, что вы получите, будет действительным.

Удаленные пэры могут

  • отправить неверное кодирование, отменить их, даже не пытаться восстановить.
  • отправлять усеченные сообщения. как правило, не подлежит восстановлению, если это не последний e корневого словаря.
  • опустите обязательные ключи. Вы можете игнорировать эти сообщения или вернуть сообщение об ошибке
  • содержат поврежденные данные
  • включите неизвестные ключи помимо обязательных. это не ошибка, просто относитесь к ним так, как будто их не было ради прямой совместимости
  • на самом деле быть злоумышленниками, пытающимися запутать вашу реализацию или использовать вас в качестве усилителя DoS

Я также подозреваю, что некоторые действительно плохие реализации основаны на string вводит их язык программирования и неправильно обрабатывает кодирование вместо использования массивов uint8 в соответствии с требованиями кодирования. С этим ничего не поделаешь. Игнорировать или иногда отправлять сообщение об ошибке.

Заданные ключи словаря обычно являются ASCII-отображаемыми, но это не является обязательным требованием. Например, есть некоторые типы ответов трекера, которые фактически используют случайные двоичные данные в качестве словарных ключей.


Вот несколько примеров барахла, который я вижу[1], который даже не выполняет bdecoding:

d1:ad2:id20:�w)��-��t����=?�������i�&�i!94h�#7U���P�)�x��f��YMlE���p:q9Q�etjy��r7�:t�5�����N��H�|1�S�
d1:e�����������������H# 
d1:ad2:id20:�����:��m�e��2~�����9>inm�_hash20:X�j�D��nY��-������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe
d1:ad2:id20:�����:��m�e��2~�����9=inl�_hash20:X�j�D��nY���������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe
d1:ad2:id20:�����:��m�e��2~�����9?ino�_hash20:X�j�D��nY���������X�6:noseedi1ee1:q9:get_peers1:t2:�=1:v4:LT��1:y1:qe

[1] сохраненный счетчик символов. заменены все непечатаемые, несовместимые с ASCII байты символом замены Юникод.

Другие вопросы по тегам