Кіріспе

Хэш-ке негізделген деректер құрылымы

Kademlia – 2002 жылы Петар Маймунков және Дэвид Мазьер жасаған, таратылған хэш-кесте, орталықтандырылмаған компьютерлік желілер үшін арналған. Ол желінің құрылымын және түйіндерді іздеу арқылы ақпарат алмасуды анықтайды. Kademlia түйіндері UDP арқылы бір-бірімен байланысады. Қатысушы түйіндер виртуалды немесе жабын желі құрайды. Әрбір түйін нөмірмен немесе түйін ID-мен сәйкестендіріледі. Түйін ID тек сәйкестендіру үшін ғана емес, Kademlia алгоритмі түйін ID-ді мәндерді (әдетте файлдың хэштері немесе кілт сөздер) табу үшін пайдаланады. Белгілі бір кілтпен байланысты мәнді іздеу үшін алгоритм бірнеше қадаммен желіні зерттейді. Әрбір қадам кілтқа жақын түйіндерді табады, содан кейін байланысқан түйін мәнді қайтарады немесе жақын түйіндер табылмайды. Бұл өте тиімді: көптеген басқа жүйелер сияқты, Kademlia іздеу кезінде жүйедегі түйіндердің барлығынан тек түйіндермен байланысады. Басқа да артықшылықтары бар, әсіресе орталықтандырылмаған құрылым, ол қызметтен бас тарту шабуылдарына қарсы тұруды арттырады. Тіпті түйіндердің толық жиынтығына шабуыл жасалса да, бұл желінің қолжетімділігіне шектеулі әсер етеді, өйткені желі осы «бұрыштардың» айналасына желіні тігіп, өзін-өзі қалпына келтіреді. I2P-тің Kademlia-ны іске асыруы Sybil шабуылдары сияқты Kademlia-ның осалдықтарын азайту үшін өзгертілген.

Хаттамалық хабарламалар

Кадемлияда төрт түрлі хабарлама бар. PING – Түйінің әлі де жұмыс істеп тұрғанын тексеру үшін қолданылады. STORE – Бір түйінде (кілт, мән) жұбын сақтайды. FIND NODE – Сұрауды алған түйін өзінің тізімінен сұраныш бойынша кілтке ең жақын k түйінді қайтарады. FIND VALUE – FIND NODE сияқты, бірақ егер сұрауды алған түйінде сұралған кілт болса, ол сәйкес мәнді қайтарады. Әрбір RPC хабарламасында бастаушының кездейсоқ мәні болады. Бұл жауап алынғанда, ол бұрын жіберілген сұранысқа сәйкес келетінін қамтамасыз етеді (магиялық cookie-ге қараңыз).

Тораптарды анықтау

Түйіндерді іздеу асинхронды түрде жүзеге асырылуы мүмкін. Бір мезгілдегі іздеулер саны α арқылы белгіленеді және әдетте үшке тең болады. Түйін, қажетті кілтке ең жақын α түйінін өзінің k шұңқырында іздеу арқылы FIND NODE сұранысын бастайды. Бұл түйіндер сұранысты алғанда, өздерінің k шұңқырында іздеп, қажетті кілтке ең жақын k түйінді, білетін болса, қайтарады. Сұрау жіберуші нәтижелер тізімін алған нәтижелермен (түйін ID-лері) жаңартады, сұранысқа жауап берген k ең жақсы түйінді (ізделген кілтке жақын k түйінді) сақтайды. Содан кейін сұрау жіберуші осы k ең жақсы нәтижелерді таңдап, оларға сұрау жібереді және осы процесті қайта-қайта қайталайды. Әрбір түйін өзінің айналасын басқа түйіндерге қарағанда жақсы біледі, сондықтан алынған нәтижелер ізделіп жатқан кілтке үнемі жақындап келетін басқа түйіндер болады. Итерациялар, бұрынғы нәтижелерден жақын түйіндер табылмағанша жалғасады. Итерациялар тоқтағанда, нәтижелер тізіміндегі ең жақсы k түйін бүкіл желідегі ізделіп жатқан кілтке ең жақын түйіндер болып табылады. Түйін туралы ақпаратты сапар уақытымен немесе RTT арқылы толықтыруға болады. Бұл ақпарат әрбір сұралған түйін үшін нақты уақыт шегін таңдау үшін қолданылады. Сұрау уақыты біткен жағдайда, тағы бір сұрау жіберілуі мүмкін, бірақ бір уақытта α сұраудан аспауы керек.

Ресурстарды анықтау

Ақпарат кілтпен байланыстыру арқылы ізделеді. Карта үшін әдетте хэш қолданылады. Сақтаушы түйіндерде бұрынғы STORE хабары арқылы алынған ақпарат болады. Құнды іздеу кілтке ең жақын түйіндерді іздеумен ұқсас процедураны орындайды, бірақ түйін сұралған құнды өзінің қорында сақтап, оны қайтарғанда іздеу тоқтатылады. Құндылықтар бірнеше түйіндерде (олардың саны k) сақталады, бұл түйіндердің келіп-кетуіне және құндылықтың кейбір түйіндерде сақталуын қамтамасыз етеді. Мерзімді түрде құнды сақтайтын түйін желіде кілт құндылығына жақын k түйінді іздеп, оларға құнды көшіреді. Бұл жоғалған түйіндердің орнын толтырады. Сонымен қатар, жиі сұралатын мәндер үшін сақтаушы түйіндердегі жүктеме азайтылады, осы мәнді іздеушіге кілтке жақын, бірақ k ең жақын түйіндерден тыс түйінде сақтау арқылы. Бұл жаңа сақтау кеш деп аталады. Осылайша, құндылық сұраныстар санына байланысты кілттен алшақтатады. Бұл танымал іздеулерге сақтаушыны жылдамырақ табуға мүмкіндік береді. Құндылық кілтке қарағанда алыс орналасқан түйіндерден қайтарылады, бұл ықтимал "қызыл нүктелерді" азайтады. Кэш түйіндері кілттен қашықтығына байланысты белгілі бір уақыттан кейін мәнді жояды. Кейбір жүзеге асыруларда (мысалы, Kad) көшірме жасау да, кеш те болмайды. Мұның мақсаты – ескі ақпаратты жүйеден жылдам жою. Файлды ұсынатын түйін жүйеде ақпаратты мерзімді түрде жаңартып отырады (FIND NODE және STORE хабарламаларын орындайды). Файлға ие барлық түйіндер желіден шыққан кезде, оның мәндерін (көздер мен кілт сөздерді) жаңартатын ешкім болмайды және ақпарат желіден жоғалады.

Желіге қосылу

Желіге қосылуды қалаған түйін алдымен бастапқы орнату процесінен өтуі керек. Осы кезеңде қосылатын түйінге басқа түйіннің IP-мекенжайы мен порты қажет – бастапқы орнату түйіні (пайдаланушыдан немесе сақталған тізімнен алынған), ол Kademlia желісіне қатысады. Егер қосылатын түйін бұрын желіге қатыспаса, ол кездейсоқ ID нөмірін есептейді, бұл өте үлкен кездейсоқ сан болғандықтан, басқа түйіндерге бұрын тағайындалмауы ықтимал. Ол осы ID-ны желіден шыққанға дейін пайдаланады. Қосылатын түйін бастапқы орнату түйінін өзінің k-кешіктерінің біріне қосады. Содан кейін қосылатын түйін өзінің ID-сын бастапқы орнату түйініне қарсы іздейді (оның білетін жалғыз басқа түйіні). «Өзін-өзі іздеу» басқа түйіндердің k-кешіктерін жаңа түйін ID-сымен толтырады және қосылатын түйіннің k-кешіктерін оның және бастапқы орнату түйіні арасындағы жолдағы түйіндермен толтырады. Осыдан кейін қосылатын түйін бастапқы орнату түйіні орналасқан k-кешіктен алысрақ орналасқан барлық k-кешіктерін жаңартады. Бұл жаңарту – сол k-кешік диапазонындағы кездейсоқ кілтті іздеу. Бастапқыда түйіндерде бір k-кешік болады. K-кешік толғанда, оны бөлуге болады. Егер k-кешіктегі түйіндер диапазоны түйіннің өзінің ID-сын (бинарлық ағашта сол және оң жақтағы мәндер) қамтитын болса, бөліну орын алады. Kademlia тіпті «ең жақын түйіндер» k-кешігі үшін осы ережені де жеңілдетеді, себебі әдетте бір кешік осы түйінге ең жақын барлық түйіндер орналасқан қашықтыққа сәйкес келеді, олардың саны k-дан көп болуы мүмкін, және біз олардың бәрін білуді қалаймыз. Бұл түйіннің жанында теңгерімсіз екілік кіші ағаш болуына әкелуі мүмкін. Егер k 20-ға тең болса және «xxx0011» префиксі бар 21-ден астам түйін болса, ал жаңа түйін «xxx000011001» болса, жаңа түйінде басқа 21-ден астам түйін үшін бірнеше k-кешік болуы мүмкін. Бұл желіге ең жақын аймақтағы барлық түйіндер туралы ақпараттың болуын қамтамасыз етеді.

Жедел іздеулер

Кадемлия қашықтықты анықтау үшін XOR метрикасын қолданады. Екі түйін идентификаторы немесе түйін идентификаторы мен кілт XOR операциясынан өтеді және нәтиже олардың арасындағы қашықтықты көрсетеді. Әр бит үшін XOR функциясы екі бит бірдей болса нөлді, ал екі бит әртүрлі болса бірді қайтарады. XOR метрикасындағы қашықтықтар үшбұрыш теңсіздігін қанағаттандырады: егер A, B және C үшбұрыштың төбелері (нүктелері) болса, онда A-дан B-ге дейінгі қашықтық A-дан C-ге және C-дан B-ге дейінгі қашықтықтардың қосындысынан кем (немесе тең) болады. XOR метрикасы Kademlia-ға маршрут кестелерін бір биттен асырып кеңейтуге мүмкіндік береді. Биттердің топтары k бөшкеге орналастырылуы мүмкін. Биттер тобы префикс деп аталады. m биттік префикс үшін 2m - 1 k бөшке болады. Қолданылмаған k бөшке – бұл түйін идентификаторын қамтитын маршруттау ағашының одан әрі кеңейтімі. m биттік префикс іздеулердің максималды санын log2 n-ден log2m n-ге дейін азайтады. Бұл максималды мәндер, ал орташа мән одан әлдеқайда төмен болады, бұл k бөшкеде префикстен басқа да биттерді мақсатты кілтпен ортақтайтын түйін табу ықтималдығын арттырады. Түйіндер маршрут кестесінде префикстердің қоспаларын пайдалана алады, мысалы, eMule қолданатын Kad желісі. Kademlia желісі тіпті маршрут кестесін жүзеге асыруда әртүрлі болуы мүмкін, бірақ бұл іздеулерді талдауды қиындатады.

Академиялық маңызы

XOR метрикасы Kademlia-ны түсіну үшін қажет болмаса да, протоколды талдау үшін маңызды рөл атқарады. XOR арифметикасы жабық талдауға мүмкіндік беретін абельдік топ құрайды. Басқа DHT протоколдары мен алгоритмдер желінің қалай жұмыс істейтінін және дұрыстығын болжау үшін көбінесе симуляциялау немесе күрделі формалды талдау талап етеді. Биттер тобын маршруттау ақпараты ретінде қолдану алгоритмдерді оңайлатуға көмектеседі.

Файл ортақтастыру желілерінде пайдалану

Kademlia файл алмасу желілерінде қолданылады. Kademlia-да түйін сөздерді іздеу арқылы файл алмасу желісінен ақпаратты табуға болады, содан кейін оны жүктеуге болады. Файлдардың индексін сақтауға арналған орталық сервер болмағандықтан, бұл міндет барлық клиенттер арасында тең бөлінеді: егер түйін файлды бөліскісі келсе, ол файлдың мазмұнын өңдейді және одан файлды файл алмасу желісінде анықтайтын сан (хэш) есептейді. Файл хэштері мен түйін идентификаторлары (ID) бірдей ұзындықты болғандықтан, клиент XOR қашықтық функциясын пайдаланып, хэшке жақын ID-і бар бірнеше түйінді іздейді және осы түйіндерге жариялаушының IP-адресін белгілі бір тәсілмен сақтауға нұсқау береді. Сондықтан, файл хэшіне ең жақын ID-і бар түйіндер осы файлдың көздерінің/жариялаушыларының IP-адрестерінің тізіміне ие болады, одан клиент файлды белгілі бір тәсілмен жүктей алады. Бұл жариялаушыдан файлды жүктегісі келетін клиенттерге жариялаушының IP-адресін білудің қажеті жоқ (жариялаушылар көп болуы мүмкін), тек файлдың хэші ғана қажет. Іздеуші клиент Kademlia-ны пайдаланып, файл хэшіне ең жақын қашықтықтағы ID-і бар түйінді желіде іздейді, содан кейін сол түйінде сақталған көздер тізімін алады. Бір кілт көптеген мәндерге сәйкес келуі мүмкін, мысалы, бір файлдың көптеген көздері, сондықтан әр сақтау түйіні әртүрлі ақпаратқа ие болуы мүмкін. Содан кейін, көздер кілтке жақын орналасқан барлық k түйінден сұралады, мұнда k – бұкеттің (bucket) көлемі. Файл хэші әдетте басқа жерден табылған, арнайы құрылған Интернеттегі магнит сілтемесі арқылы немесе басқа көздерден алынған индекстеу файлынан алынады. Файл атауларын іздеу түйін сөздерді пайдаланып жүзеге асырылады. Файл атауы құрамына кіретін сөздерге бөлінеді. Осы түйін сөздердің әрқайсысы сәйкес файл атауымен және файл хэшімен бірге желіде сақталады. Іздеу түйін сөздердің бірін таңдап, түйін сөз хэшіне ең жақын ID-і бар түйінмен байланысып, түйін сөзді қамтитын файл атауларының тізімін алуды қамтиды. Тізімдегі әрбір файл атауының хэші болғандықтан, таңдалған файлды әдеттегідей алуға болады.