ID для узла выбирается уже не случайно
https://www.bittorrent.org/beps/bep_0042.html
Но если не предполагается анонса и приёма запросов то ID можно выбрать любой. Не все клиенты реализовали этот BEP.
1. router.utorrent.com: 6881 - используется только для первичного получения списка узлов командой find_node. Она не требует info_hash а только id узла и target которые могут быть одинаковы так как мы ищем свою позицию в сети.
В дальнейшем router.utorrent.com: 6881 не должен использоваться больше никак.
2. routing table должен содержать значения для каждого узла: id, ip(v4 или v6), port, время последнего ответа.
Её периодически нужно сохранять на диск и при следующем старте пытаться загрузиться уже с неё.
3. Из таблицы выбираются ближайшие по id узлы к target или info_hash. И к ним соответственно отправляются find_node или get_peers.
announce_peer возможен только после get_peers так как нужен токен для анонса который в ответе на get_peers.
find_node используется для нахождения ближайших к своему id узлов. Также периодически можно искать случайные id для пополнения routing table.
В какую таблицу мы складируем инфохэши от собственных и полученных файлов?
Соответственно нужна отдельная таблица в которой по info_hash будет храниться список пиров.
Запрос 'ping' делаем только в router.utorrent.com: 6881 или по всем нодам из routing table?
Ни в коем случае. Работа с ним закончена на первом этапе.
Ping нужно отсылать только на узлы из routing table с которыми длительное время не было связи. До тех пор пока узлы не ответят на ping их нельзя отдавать другим узлам на их запросы. Соответственно и узлы полученные от другого узла нельзя отдавать дальше до проверки их состояния.
Другие узлы также будут проверять этот пингуя или опрашивая его.