Я отвечу на вопрос заказа.
В общем, вы можете отправить любое сообщение в любое время.Но есть некоторые сообщения, которые имеют специальные правила.Например, сообщение BITFIELD должно быть отправлено досрочно.Большинство клиентов отправляют ЧАСТИ обратно в том порядке, в котором они были ЗАПРОШЕНЫ, но я не думаю, что это является обязательным требованием, если память служит.
Как правило, сообщения бывают двух типов.Один вид - это сообщения, ориентированные на управление, которые сообщают коллегам об общем состоянии (в эту группу попадают сообщения HAVE).Другой вид - это ориентированные на данные сообщения, которые фактически передают файл и запрашивают новые данные у однорангового узла.Эти типы сообщений «чередуются», и одна из причин, по которой вы отправляете сообщения PIECE размером не более 16 килобайт, заключается в том, чтобы обеспечить возможность чередования между управляющими сообщениями.Хитрость заключается в том, что, когда сообщение PIECE было отправлено, тогда отправьте все ориентированные на управление сообщения по приоритету до следующего сообщения PIECE.Таким образом, вы быстро сообщаете другой стороне о своем намерении.
Существует также «ошибка» в исходном протоколе, которая устраняется расширением FAST.Это эффективно делает каждый результат REQUEST либо сообщением PIECE, либо сообщением REJECT-REQUEST.Это еще один пример заказа.Если вы получили сообщение REJECT-REQUEST для чего-то, что вы никогда не ЗАПРОСИЛИ, вы отключаете одноранговый узел.