Pull to refresh

Lua что новенького в BitTorrent DHT?

Reading time 3 min
Views 3K
Какое-то время назад я написал для Shareaza внешний DHT Tracker на Lua (GitHub). Для Shareaza это обычный локальный трекер, а по сути это BitTorrent DHT клиент, который позволяет ей качать торенты по магнет ссылкам без трекера.

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

Итак, что новенького мы наловили в BitTorrent DHT. (Стандартные поля очищены, но оставлены для ясности структуры):
{
	v="UTct",
	q="vote",
	a={
		target="",
		vote=0,
		token="",
		id=""
	},
	y="q",
	t=""
}


Смотрим что нового:
  • v = «UTct» — Это две буквы ID клиента (в данном случае uTorrent) и версия это 2байта (63 74).
  • q = «vote» — Судя по названию это «Голосование».
  • vote = 0 — Ну это видимо оценка.


Все остальное так же, как и в пакете announce_peer, правда отсутствует port, но он здесь очевидно не нужен.

Продираясь через кучу vote, мы натыкаемся на ещё один интересный пакет:
{
	v="UTdS",
	q="announce_peer",
	a={
		name="File Name.avi",
		info_hash="",
		port=1,
		id="",
		token=""
	},
	y="q",
	t=""
}


Обычный announce_peer с плюсом в виде названия торрента (см. a.name). Видимо для поисковика или для отображения названия до получения info.

Ищем дальше и находим:
{
	v="Az\5H",
	q="announce_peer",
	a={
		seed=0,
		info_hash="",
		port=1,
		token="",
		id=""
	},
	y="q",
	t=""
}


По ID клиента понимаем, что имеем дело уже с Azureus (судя по Wiki это уже Vuze). Так же пришёл к нам announce_peer с плюсом в виде поля seed, которому задан 0. Видимо, данный пир не является сидом говорит КО.

И снова Azureus:
{
	v="AZ00",
	q="get_peers",
	a={
		scrape=1,
		want={
			"n4"
		},
		info_hash="",
		id=""
	},
	y="q",
	t=""
}


Видим scrape и want. Видимо это аналог Scrape запроса к трекеру. Want является списком и содержит в себе значение «n4». Давно уже мелькало это поле, и я узнал немного про него. N4 это IPv4 адреса а N6 соответственно IPv6 адреса могут быть одновременно.

Это наш сегодняшний улов. Осталось добавить о том что уже добавленно в фильтр пакетов:

{
	r={
		ip="\0\0\0\0",
		nodes2={}
	}
	y="r"
}


В ответах может содержаться дополнительно поле ip. Расследование показало что это ваш собственный ip.
nodes2 — список ipv6 нод насколько я помню. Поскольку мой провайдер всё ещё на ipv4, это вопрос я глубоко не прорабатывал.

Много нового появилось конечно, и в связи с этим у меня появилась идейка дать возможность спрашивать help у самого клиента, который прислал неизвестный пакет.

Выглядит это так:

Запрос

{
	t="",
	y="q",
	q="help",
	a={
		path={"q","help"} -- Думаю список лучше строки. Раньше была строка в которой имена полей разделялись точкой.
	}
}

В данном случае это запрос справки по значению q = help.

И на него должен прийти такой ответ:
{
	t="",
	y="r",
	r={  
		help = 		
[=[
q=[help, ping, find_node, get_peers,  announce_peer]
help - Micro help about new parameter of dht packet.
 a.path (query packet) - path to new parameter
 r.help (responce packet) - help about new parameter

more: http://forum.bittorrent.org/viewtopic.php?pid=2134

other see on http://bittorrent.org/beps/bep_0005.html
]=]
	}
}


Возможно дополнительные ссылки лучше в отдельный список выделить.

Ну что ж. Интересующиеся этой темой гуглим подробности, пишем комментарии.

Кстати forum.bittorrent.org у меня не работает. А там обсуждались как раз нововведения BitTorrent клиентов.

P.S. Для Peer-to-Peer кармы не хватает.
P.P.S. Спасибо за карму. Перенёс.
Tags:
Hubs:
+20
Comments 10
Comments Comments 10

Articles