Протокол BitTorrent Peer Wire (TCP) - PullRequest
       7

Протокол BitTorrent Peer Wire (TCP)

3 голосов
/ 09 ноября 2010

Как сообщения закодированы или отправлены / получены коллегами?

Если есть сообщение

have: <len=0005><id=4><piece index> 

Как это отправляется (в двоичном виде, как переводится в двоичный?) И принимается?* Есть ли определенный порядок, в котором сообщения отправляются пирам?

Я прочитал спецификацию, но она оставляет меня с вопросами.

Спасибо

Ответы [ 2 ]

3 голосов
/ 09 ноября 2010

Я отвечу на вопрос заказа.

В общем, вы можете отправить любое сообщение в любое время.Но есть некоторые сообщения, которые имеют специальные правила.Например, сообщение BITFIELD должно быть отправлено досрочно.Большинство клиентов отправляют ЧАСТИ обратно в том порядке, в котором они были ЗАПРОШЕНЫ, но я не думаю, что это является обязательным требованием, если память служит.

Как правило, сообщения бывают двух типов.Один вид - это сообщения, ориентированные на управление, которые сообщают коллегам об общем состоянии (в эту группу попадают сообщения HAVE).Другой вид - это ориентированные на данные сообщения, которые фактически передают файл и запрашивают новые данные у однорангового узла.Эти типы сообщений «чередуются», и одна из причин, по которой вы отправляете сообщения PIECE размером не более 16 килобайт, заключается в том, чтобы обеспечить возможность чередования между управляющими сообщениями.Хитрость заключается в том, что, когда сообщение PIECE было отправлено, тогда отправьте все ориентированные на управление сообщения по приоритету до следующего сообщения PIECE.Таким образом, вы быстро сообщаете другой стороне о своем намерении.

Существует также «ошибка» в исходном протоколе, которая устраняется расширением FAST.Это эффективно делает каждый результат REQUEST либо сообщением PIECE, либо сообщением REJECT-REQUEST.Это еще один пример заказа.Если вы получили сообщение REJECT-REQUEST для чего-то, что вы никогда не ЗАПРОСИЛИ, вы отключаете одноранговый узел.

3 голосов
/ 09 ноября 2010

До объявления have сообщения спецификация гласит:

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

У вас есть двоичный формат для длины и идентификатора прямо здесь.Часть 'piece index' - это конкретная полезная нагрузка этого сообщения.Это должно быть четыре байта длиной, так как сообщение имеет фиксированный размер 5 байтов и 1 байт перешел к идентификатору сообщения (просмотр других сообщений того же формата должен дать вам подсказку).

...