Как использовать одноранговое соединение в торрент-протоколе?

Пытаюсь понять, как правильно реализовать p2p-связь для торрент-протокола. Спецификация не ясна на этот счет.

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

Это приводит к другому вопросу. Возможно ли или нормально устанавливать несколько соединений с одним и тем же узлом?


person alex.49.98    schedule 22.07.2015    source источник


Ответы (1)


в этом случае пир находится в роли клиента

Что касается проводного протокола, то особой «роли клиента», отличной от роли сервера, не существует. Оба одноранговых узла равны и выполняют и поддерживают один и тот же набор операций — дают или принимают некоторые расширения протокола.

Отсюда одноранговые.

Термин клиент в контексте BitTorrent просто означает любого участника сети. В спецификациях он часто используется как взаимозаменяемый с реализация и одноранговый.

TCP-соединения являются двунаправленными. В битторренте каждый поток состоит из бесконечных потоков сообщений, не синхронизированных с другим направлением. т.е. нет цикла запрос-ответ.

Возможно ли или нормально устанавливать несколько соединений с одним и тем же узлом?

возможный? да, если предположить, что кортеж <source IP, source port, destination IP, destination port> отличается, что в основном и требуется TCP.

Но другие реализации, скорее всего, будут отбрасывать повторяющиеся соединения.

person the8472    schedule 22.07.2015
comment
Есть еще одна вещь, которая не ясна. Это одно соединение на торрент? Я предполагаю, что только одно рукопожатие может иметь место сразу после установления TCP-соединения. Что делать, если я хочу подключиться к тому же узлу в отношении другого торрента? Должен ли я инициировать другое соединение или я должен отправить еще одно рукопожатие по тому же соединению? - person alex.49.98; 22.07.2015
comment
Нет, в спецификации все ясно. Я думаю, что ваш мыслительный процесс затуманивает ваше понимание, он начинается с предположений, основанных на том, что вы хотите сделать, вместо того, чтобы пытаться понять, что на самом деле делает протокол. - person the8472; 22.07.2015
comment
Я все еще не совсем понял. Сообщение рукопожатия имеет info_hash, и рукопожатие должно быть отправлено первым. Таким образом, соединение привязано к определенному info_hash. Теперь я хочу скачать другой торрент и знаю, что он есть у этого конкретного пира. Для этого мне нужно установить другое соединение с этим узлом с новым info_hash? Но в этом случае это будет второе подключение к пиру, которое согласно вашему ответу может быть сброшено или оно не считается дублированным из-за рукопожатия с другим info_hash? - person alex.49.98; 23.07.2015
comment
Это поведение зависит от реализации, а не является частью самой спецификации протокола (оно предоставляет большую свободу действий в отношении таких деталей). Некоторые клиенты могут обеспечивать уникальность для каждого торрента, некоторые — глобально, а некоторые — нет. И обычно это не имеет большого значения, поскольку рой состоит из множества пиров, и вы можете подключиться к любому из них. - person the8472; 23.07.2015
comment
@ the8472 Быстрый вопрос. Когда клиент может закрыть соединение? Нужно ли восстанавливать рукопожатие, если я закрываю соединение после каждого прочитанного сообщения? - person Ritwik; 23.08.2019