DHT
DHT (Distributed Hash Table) — распределённая структура хранения «ключ → значение», где нет центрального сервера, а данные разложены по тысячам узлов. Каждый узел знает свою часть таблицы и умеет найти любую другую за O(log N) хопов. Основа для BitTorrent, IPFS, Ethereum и многих P2P-сетей.
Идея
- Каждый узел имеет уникальный ID (обычно 160-256 бит, случайный).
- Каждый ключ хешируется до того же пространства ID.
- Значение для ключа
Kхранится на узле с ближайшим ID кK(по метрике DHT). - Узлы поддерживают таблицу маршрутизации — список некоторых других узлов, покрывающий пространство ID.
- Чтобы найти
K: спрашиваем ближайшего известного узла, он говорит «попробуй у него», и т.д. рекурсивно.
Основные алгоритмы DHT
| Алгоритм | Метрика | Где используется |
|---|---|---|
| Kademlia | XOR | BitTorrent, IPFS, Ethereum, I2P |
| Chord | Кольцо, arc-distance | Исторически, редко |
| Pastry | Numerical prefix | Freenet, некоторые CDN |
| Tapestry | Похоже на Pastry | OceanStore |
| CAN | d-мерный тор | Академический интерес |
Kademlia выиграл — он симметричен (query = ping), эффективен, устойчив к сбоям.
Kademlia — детали
- Metric: расстояние между двумя ID =
XOR(a, b)как число. - k-buckets: узел хранит для каждого «расстояния» (bit-prefix) до
kизвестных узлов (обычно k=20). Для 160-битного ID — 160 bucket'ов. - FIND_NODE(target) запрос: сосед возвращает
kближайших к target узлов из своих bucket'ов. Клиент повторяет к ним, сужая круг. - За O(log N) хопов достигаем ближайшего узла.
BitTorrent DHT
Изначально BitTorrent использовал только трекеры — централизованные серверы. С 2005 добавлен Mainline DHT (mDHT) — Kademlia-сеть где сами peer'ы делят таблицу «инфохеш → список пиров».
Кладём в DHT: ключ = SHA-1(info) торрента, значение = список [IP:port] сидов. Чтобы получить пиров — GET по инфохешу.
Сегодня десятки миллионов узлов в BT-DHT.
IPFS DHT
IPFS использует Kademlia (libp2p-kad-dht) для content routing: «у кого лежит CID QmXxx...?». Значения — «provider records»: узел объявляет «у меня есть этот CID».
Проблемы DHT
- Sybil-атака. Атакующий создаёт много фейковых узлов, «окружает» целевой ключ, отдаёт неправильные ответы. Защита — проверка контента (IPFS — CID совпадает с хешем), обмен узлов через доверенные каналы.
- Eclipse-атака. Атакующий отрезает жертву от «настоящей» DHT — все её соседи-контакты фейковые.
- Churn. Узлы приходят/уходят, таблицы устаревают. Kademlia лечит частым ping+refresh.
- Bootstrap. Как найти первый узел? Обычно hardcoded «bootstrap node» список в клиенте, или mDNS в локальной сети.
DHT для деанонимизации
Правоохранители иногда «садят» узлы в BT-DHT рядом с известным инфохешем — все запросчики → потенциально скачивающие. Использовалось в делах о правах в 2010-х. Защита — I2P, Tor.
См. также
- BitTorrent, IPFS, P2P
- libp2p, I2P