日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DHT协议介绍

發(fā)布時(shí)間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DHT协议介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

DHT協(xié)議介紹

  • 1、前言
  • 2、DHT協(xié)議介紹
    • 2.1、概述
    • 2.2、路由表
    • 2.3、BitTorret協(xié)議擴(kuò)展
    • 2.4、Torrent文件擴(kuò)展
    • 2.5、KRPC協(xié)議
    • 2.6、聯(lián)系信息編碼
    • 2.7、DHT請(qǐng)求
      • 2.7.1、ping
      • 2.7.2、find_node
      • 2.7.3、get_peers
      • 2.7.4、announce_peer

1、前言

英文版官方地址:http://www.bittorrent.org/beps/bep_0005.html

DHT協(xié)議

BitTorrent使用一種叫做分布式哈希表(distributedsloppy hashtable)的技術(shù),來實(shí)現(xiàn)在無tracker的torrent文件中peer的聯(lián)系信息存儲(chǔ)。這個(gè)時(shí)候,每個(gè)peer都是一個(gè)tracker。這個(gè)協(xié)議是基于Kademila協(xié)議的,并且在UDP協(xié)議基礎(chǔ)上實(shí)現(xiàn)。

請(qǐng)注意本文檔所使用的術(shù)語以免引起混淆。“peer”是一個(gè)實(shí)現(xiàn)了BT協(xié)議,且正在監(jiān)聽TCP端口的client/server。“node”是實(shí)現(xiàn)了DHT協(xié)議的,且正在監(jiān)聽UDP端口的client/server。DHT由nodes組成并保存peer的位置信息。BitTorrent客戶端也包括DHTnode,這個(gè)DHTnode主要是用來聯(lián)系DHT中的其他nodes,以得peer的位置信息,從而通過BitTorrent協(xié)議下載。

2、DHT協(xié)議介紹

2.1、概述

每一個(gè)node都有一個(gè)全局的唯一標(biāo)識(shí)“nodeID”。NodeIDS的產(chǎn)生是隨機(jī)的,且使用與BitTorrent的infohashes相同的160-bit空間。“distancemetric”用來比較2個(gè)nodeIDs或者nodeID與infohash的接近程度。Nodes必須維護(hù)一個(gè)路由表,其中保存了一部分其他nodes的聯(lián)系信息。越接近自身節(jié)點(diǎn)時(shí),路由表的信息會(huì)更加詳細(xì)。nodes保存了很多接近自己的節(jié)點(diǎn),但是離自己很遠(yuǎn)的節(jié)點(diǎn)的聯(lián)系信息確知道得很少。

在Kademlia中,“distancemetric”采用XOR異或計(jì)算,并轉(zhuǎn)換為一個(gè)無符號(hào)整數(shù)。distance(A,B)= |A xor B| ,并且距離越小表示2個(gè)節(jié)點(diǎn)越接近。

當(dāng)一個(gè)node想得到某個(gè)torrent文件的peers,它首先使用distancemetric來比較torrent文件的info_hash和路由表中節(jié)點(diǎn)的nodeID。接下來向路由表中nodeID與info_hash最接近的那些節(jié)點(diǎn)發(fā)送請(qǐng)求,得到當(dāng)前正在下載這個(gè)torrent文件數(shù)據(jù)的peers的聯(lián)系信息。如果被請(qǐng)求的節(jié)點(diǎn)知道這個(gè)torrent文件的peers,那么peer的聯(lián)系信息將包含在回復(fù)中。否則,被請(qǐng)求的節(jié)點(diǎn)必須返回他的路由表中更接近info_hash得那些節(jié)點(diǎn)。原始的請(qǐng)求node不斷向新獲得的那些node中,更接近目標(biāo)info_hash的那些node發(fā)送請(qǐng)求,直到不能獲得更近的nodes。當(dāng)查找結(jié)束時(shí),client將自己的信息作為一個(gè)peer插入到在剛才請(qǐng)求中給出回復(fù)的那些節(jié)點(diǎn)中,nodeid與info_hash最接近的哪個(gè)節(jié)點(diǎn)上,這樣,哪個(gè)節(jié)點(diǎn)又多保存了一個(gè)peer信息。

在請(qǐng)求peers的時(shí)候,對(duì)方給我們的回復(fù)必須還包含一個(gè)不透明的令牌,我們稱他為“token”。這樣當(dāng)我們宣布我們正在下載某個(gè)torrent,想讓對(duì)方保存我們的信息時(shí),我們必須使用對(duì)方向我們發(fā)送的最近的一個(gè)token。這樣當(dāng)我們宣布我們?cè)谙螺d一個(gè)torrent時(shí),被請(qǐng)求的node檢查這個(gè)token和IP是否與之前他們向我們回復(fù)的一樣。這樣是為了防止惡意的攻擊。由于token僅僅由請(qǐng)求的節(jié)點(diǎn)返回,所以我們不規(guī)定他的具體實(shí)現(xiàn)。但是token必須有一個(gè)可接受的時(shí)間范圍,超過這個(gè)時(shí)間,token將失效。在BitTorrent的實(shí)現(xiàn)中,token是在IP地址后面連接一個(gè)secret(可以視為一個(gè)隨機(jī)數(shù)),這個(gè)secret每五分鐘改變一次,其中token在十分鐘以內(nèi)是可接受的。

2.2、路由表

每一個(gè)node維護(hù)一個(gè)路由表保存已知的好節(jié)點(diǎn)。這些路由表中的nodes被作為DHT請(qǐng)求的起始節(jié)點(diǎn)。路由表中的nodes是在不斷的向其他node請(qǐng)求過程中,對(duì)方節(jié)點(diǎn)回復(fù)的。

并不是我們?cè)谡?qǐng)求過程中收到得節(jié)點(diǎn)都是平等的,有的node是好的,而有的node是死掉的。很多使用DHT協(xié)議的nodes都可以發(fā)送請(qǐng)求并接收回復(fù),但是不能主動(dòng)回復(fù)其他節(jié)點(diǎn)的請(qǐng)求(我認(rèn)為這是由于防火墻或者NAT的原因)。對(duì)每一個(gè)node的路由表,只包含好的nodes是很重要的。好的node是指在過去的15分鐘以內(nèi),曾經(jīng)對(duì)我們的某一個(gè)請(qǐng)求給出過回復(fù)的節(jié)點(diǎn);或者曾經(jīng)對(duì)我們的請(qǐng)求給出過一個(gè)回復(fù)(不用在15分鐘以內(nèi)),并且在過去的15分鐘給我們發(fā)送過請(qǐng)求。上述兩種情況都可將node視為好的node。在15分鐘之后,對(duì)方?jīng)]有上述2種情況發(fā)生,這個(gè)node將變?yōu)榭梢傻摹.?dāng)nodes不能給我們的一系列請(qǐng)求給出回復(fù)時(shí),這個(gè)節(jié)點(diǎn)將變?yōu)閴牡摹O啾任粗獱顟B(tài)的nodes,我們將給好的節(jié)點(diǎn)更高的優(yōu)先權(quán)。

路由表覆蓋從0到2160完整的nodeID空間。路由表又被劃分為buckets(桶),每一個(gè)bucket包含一個(gè)子部分的nodeID空間。一個(gè)空的路由表只有一個(gè)bucket,它的ID范圍從min=0到max=2160。當(dāng)一個(gè)nodeID為“N”的node插入到表中時(shí),它將被放到ID范圍在min<=N<max的bucket中。一個(gè)空的路由表只有一個(gè)bucket所以所有的node都將被放到這個(gè)bucket中。每一個(gè)bucket最多只能保存K個(gè)nodes,當(dāng)前K=8。當(dāng)一個(gè)bucket放滿了好的nodes之后,將不再允許新的節(jié)點(diǎn)加入,除非我們自身的nodeID在這個(gè)bucket的范圍內(nèi)。在這樣的情況下,這個(gè)bucket將被分裂為2個(gè)新的buckets,每一個(gè)新桶的范圍都是原來舊桶的一半。原來舊桶中的nodes將被重新分配到這兩個(gè)新的buckets中。如果是一個(gè)只有一個(gè)bucket的新表,這個(gè)包含整個(gè)范圍的bucket將總被分裂為2個(gè)新的buckets,第一個(gè)的覆蓋范圍從0…2159,第二個(gè)的范圍從2159…2160。

當(dāng)bucket裝滿了好的nodes,那么新的node將被丟棄。一旦bucket中的某一個(gè)node變?yōu)榱藟牡膎ode,那么我們就用新的node來替換這個(gè)壞的node。如果bucket中有在15分鐘內(nèi)都沒有活躍過的節(jié)點(diǎn),我們將這樣的節(jié)點(diǎn)視為可疑的節(jié)點(diǎn),這時(shí)我們向最久沒有聯(lián)系的節(jié)點(diǎn)發(fā)送ping。如果被pinged的節(jié)點(diǎn)給出了回復(fù),那么我們向下一個(gè)可疑的節(jié)點(diǎn)發(fā)送ping,不斷這樣循環(huán)下去,直到有某一個(gè)node沒有給出ping的回復(fù),或者當(dāng)前bucket中的所有nodes都是好的(也就是所有nodes都不是可疑nodes,他們?cè)谶^去15分鐘內(nèi)都有活動(dòng))。如果bucket中的某個(gè)node沒有對(duì)我們的ping給出回復(fù),我們最好再試一次(再發(fā)送一次ping,因?yàn)檫@個(gè)node也許仍然是活躍的,但由于網(wǎng)絡(luò)擁塞,所以發(fā)生了丟包現(xiàn)象,注意DHT的包都是UDP的),而不是立即丟棄這個(gè)node或者直接用新node來替代它。這樣,我們得路由表將充滿穩(wěn)定的長時(shí)間在線的nodes。

每一個(gè)bucket都應(yīng)該維持一個(gè)“l(fā)astchange”字段來表明bucket中的nodes有多新鮮。當(dāng)一個(gè)bucket中的node被ping并給出了回復(fù),或者一個(gè)node被加入到了bucket,或者一個(gè)node被一個(gè)新的node所替代,bucket的“l(fā)astchanged”字段都應(yīng)當(dāng)被更新。如果一個(gè)bucket的“l(fā)astchange”在過去的15分鐘內(nèi)都沒有變化,那么我們將更新它。這個(gè)更新bucket操作是這樣完成的:從這個(gè)bucket所覆蓋的范圍中隨機(jī)選擇一個(gè)ID,并對(duì)這個(gè)ID執(zhí)行find_nodes查找操作。常常收到請(qǐng)求的nodes通常不需要常常更新自己的buckets,反之,不常常收到請(qǐng)求的nodes常常需要周期性的執(zhí)行更新所有buckets的操作,這樣才能保證當(dāng)我們用到DHT的時(shí)候,里面有足夠多的好的nodes。

在第一個(gè)node插入路由表并開始服務(wù)后,這個(gè)node應(yīng)該試著查找離自身更近的node,這個(gè)查找工作是通過不斷的發(fā)布find_node消息給越來越近的nodes來完成的,當(dāng)不能找到更近的節(jié)點(diǎn)時(shí),這個(gè)擴(kuò)散工作就結(jié)束了。路由表應(yīng)當(dāng)被啟動(dòng)工作和客戶端軟件保存(也就是啟動(dòng)的時(shí)候從客戶端中讀取路由表信息,結(jié)束的時(shí)候客戶端軟件記錄到文件中)。

2.3、BitTorret協(xié)議擴(kuò)展

BitTorrent協(xié)議已經(jīng)被擴(kuò)展為可以在通過tracker得到的peer之間互相交換nodeUDP端口號(hào)(也就是告訴對(duì)方我們的DHT服務(wù)端口號(hào)),在這樣的方式下,客戶端可以通過下載普通的種子文件來自動(dòng)擴(kuò)展DHT路由表。新安裝的客戶端第一次試著下載一個(gè)無tracker的種子時(shí),它的路由表中將沒有任何nodes,這是它需要在torrent文件中找到聯(lián)系信息。

peers如果支持DHT協(xié)議就將BitTorrent協(xié)議握手消息的保留位的第八字節(jié)的最后一位置為1。這時(shí)如果peer收到一個(gè)handshake表明對(duì)方支持DHT協(xié)議,就應(yīng)該發(fā)送PORT消息。它由字節(jié)0x09開始,payload的長度是2個(gè)字節(jié),包含了這個(gè)peer的DHT服務(wù)使用的網(wǎng)絡(luò)字節(jié)序的UDP端口號(hào)。當(dāng)peer收到這樣的消息是應(yīng)當(dāng)向?qū)Ψ降腎P和消息中指定的端口號(hào)的node發(fā)送ping。如果收到了ping的回復(fù),那么應(yīng)當(dāng)使用上述的方法將新node的聯(lián)系信息加入到路由表中。

2.4、Torrent文件擴(kuò)展

一個(gè)無tracker的torrent文件字典不包含announce關(guān)鍵字,而使用一個(gè)nodes關(guān)鍵字來替代。這個(gè)關(guān)鍵字對(duì)應(yīng)的內(nèi)容應(yīng)該設(shè)置為torrent創(chuàng)建者的路由表中K個(gè)最接近的nodes。可供選擇的,這個(gè)關(guān)鍵字也可以設(shè)置為一個(gè)已知的可用節(jié)點(diǎn),比如這個(gè)torrent文件的創(chuàng)建者。請(qǐng)不要自動(dòng)加入router.bittorrent.com到torrent文件中或者自動(dòng)加入這個(gè)node到客戶端路由表中。

nodes= [["", ], ["",], …]

nodes= [[“127.0.0.1”, 6881], [“your.router.node”, 4804]]

2.5、KRPC協(xié)議

KRPC協(xié)議是由B編碼組成的一個(gè)簡單的RPC結(jié)構(gòu),他使用UDP報(bào)文發(fā)送。一個(gè)獨(dú)立的請(qǐng)求包被發(fā)出去然后一個(gè)獨(dú)立的包被回復(fù)。這個(gè)協(xié)議沒有重發(fā)。它包含3種消息:請(qǐng)求,回復(fù)和錯(cuò)誤。對(duì)DHT協(xié)議而言,這里有4種請(qǐng)求:ping,find_node,get_peers,和announce_peer。

一個(gè)KRPC消息由一個(gè)獨(dú)立的字典組成,其中有2個(gè)關(guān)鍵字是所有的消息都包含的,其余的附加關(guān)鍵字取決于消息類型。每一個(gè)消息都包含t關(guān)鍵字,它是一個(gè)代表了transactionID的字符串類型。transactionID由請(qǐng)求node產(chǎn)生,并且回復(fù)中要包含回顯該字段,所以回復(fù)可能對(duì)應(yīng)一個(gè)節(jié)點(diǎn)的多個(gè)請(qǐng)求。transactionID應(yīng)當(dāng)被編碼為一個(gè)短的二進(jìn)制字符串,比如2個(gè)字節(jié),這樣就可以對(duì)應(yīng)2^16個(gè)請(qǐng)求。另一個(gè)每個(gè)KRPC消息都包含的關(guān)鍵字是y,它由一個(gè)字節(jié)組成,表明這個(gè)消息的類型。y對(duì)應(yīng)的值有三種情況:q表示請(qǐng)求,r表示回復(fù),e表示錯(cuò)誤。

2.6、聯(lián)系信息編碼

Peers的聯(lián)系信息被編碼為6字節(jié)的字符串。又被稱為"CompactIP-address/port info",其中前4個(gè)字節(jié)是網(wǎng)絡(luò)字節(jié)序的IP地址,后2個(gè)字節(jié)是網(wǎng)絡(luò)字節(jié)序的端口。

Nodes的聯(lián)系信息被編碼為26字節(jié)的字符串。又被稱為"Compactnode info",其中前20字節(jié)是網(wǎng)絡(luò)字節(jié)序的nodeID,后面6個(gè)字節(jié)是peers的"CompactIP-address/port info"。

請(qǐng)求
請(qǐng)求,對(duì)應(yīng)于KPRC消息字典中的“y”關(guān)鍵字的值是“q”,它包含2個(gè)附加的關(guān)鍵字“q”和“a”。關(guān)鍵字“q”是一個(gè)字符串類型,包含了請(qǐng)求的方法名字。關(guān)鍵字“a”一個(gè)字典類型包含了請(qǐng)求所附加的參數(shù)。

回復(fù)
回復(fù),對(duì)應(yīng)于KPRC消息字典中的“y”關(guān)鍵字的值是“r”,包含了一個(gè)附加的關(guān)鍵字r。關(guān)鍵字“r”是一個(gè)字典類型,包含了返回的值。發(fā)送回復(fù)消息是在正確解析了請(qǐng)求消息的基礎(chǔ)上完成的。

錯(cuò)誤
錯(cuò)誤,對(duì)應(yīng)于KPRC消息字典中的y關(guān)鍵字的值是“e”,包含一個(gè)附加的關(guān)鍵字e。關(guān)鍵字“e”是一個(gè)列表類型。第一個(gè)元素是一個(gè)數(shù)字類型,表明了錯(cuò)誤碼。第二個(gè)元素是一個(gè)字符串類型,表明了錯(cuò)誤信息。當(dāng)一個(gè)請(qǐng)求不能解析或出錯(cuò)時(shí),錯(cuò)誤包將被發(fā)送。下表描述了可能出現(xiàn)的錯(cuò)誤碼:

錯(cuò)誤碼錯(cuò)誤描述
201一般錯(cuò)誤
202服務(wù)錯(cuò)誤
203協(xié)議錯(cuò)誤,比如不規(guī)范的包,無效的參數(shù),或者錯(cuò)誤的token
204未知方法

2.7、DHT請(qǐng)求

所有的請(qǐng)求都包含一個(gè)關(guān)鍵字id,它包含了請(qǐng)求節(jié)點(diǎn)的nodeID。所有的回復(fù)也包含關(guān)鍵字id,它包含了回復(fù)節(jié)點(diǎn)的nodeID。

2.7.1、ping

ping是最基礎(chǔ)的請(qǐng)求。此時(shí)KPRC協(xié)議中的“q”=“ping”。Ping請(qǐng)求包含一個(gè)參數(shù)id,它是一個(gè)20字節(jié)的字符串包含了發(fā)送者網(wǎng)絡(luò)字節(jié)序的nodeID。對(duì)應(yīng)的ping回復(fù)也包含一個(gè)參數(shù)id,包含了回復(fù)者的nodeID。

請(qǐng)求參數(shù):{“id” : “<querying nodes id>”}
回復(fù)參數(shù):{“id” : “<queried nodes id>”}

報(bào)文包例子:

請(qǐng)求:{“t”:“aa”, “y”:“q”, “q”:“ping”, “a”:{“id”:“abcdefghij0123456789”}}
對(duì)應(yīng)的B編碼:d1:ad2:id20:abcdefghij0123456789e1:q4:ping1:t2:aa1:y1:qe

回復(fù):{“t”:“aa”, “y”:“r”, “r”:{“id”:“mnopqrstuvwxyz123456”}}
對(duì)應(yīng)的B編碼:d1:rd2:id20:mnopqrstuvwxyz123456e1:t2:aa1:y1:re

2.7.2、find_node

find_node被用來查找給定ID的node的聯(lián)系信息。此時(shí)KPRC協(xié)議中的q=“find_node”。find_node請(qǐng)求包含2個(gè)參數(shù),第一個(gè)參數(shù)是id,包含了請(qǐng)求node的nodeID。第二個(gè)參數(shù)是target,包含了請(qǐng)求者正在查找的node的nodeID。當(dāng)一個(gè)node接收到了find_node的請(qǐng)求,他應(yīng)該給出對(duì)應(yīng)的回復(fù),回復(fù)中包含2個(gè)關(guān)鍵字id和nodes,nodes是一個(gè)字符串類型,包含了被請(qǐng)求節(jié)點(diǎn)的路由表中最接近目標(biāo)node的K(8)個(gè)最接近的nodes的聯(lián)系信息。

請(qǐng)求參數(shù):{“id”:"<querying nodes id>", “target”:"<id of target node>"}
回復(fù)參數(shù):{“id”:"<queried nodes id>", “nodes”:"<compact node info>"}

報(bào)文包例子

請(qǐng)求:{“t”:“aa”, “y”:“q”, “q”:“find_node”, “a”:{“id”:“abcdefghij0123456789”, “target”:“mnopqrstuvwxyz123456”}}
對(duì)應(yīng)的B編碼:d1:ad2:id20:abcdefghij01234567896:target20:mnopqrstuvwxyz123456e1:q9:find_node1:t2:aa1:y1:qe

回復(fù):{“t”:“aa”, “y”:“r”, “r”:{“id”:“0123456789abcdefghij”, “nodes”:“def456…”}}
對(duì)應(yīng)的B編碼:d1:rd2:id20:0123456789abcdefghij5:nodes9:def456…e1:t2:aa1:y1:re

2.7.3、get_peers

get_peers與torrent文件的info_hash有關(guān)。此時(shí)KPRC協(xié)議中的q=”get_peers”。get_peers請(qǐng)求包含2個(gè)參數(shù)。第一個(gè)參數(shù)是id,包含了請(qǐng)求node的nodeID。第二個(gè)參數(shù)是info_hash,它代表torrent文件的infohash。如果被請(qǐng)求的節(jié)點(diǎn)有對(duì)應(yīng)info_hash的peers,他將返回一個(gè)關(guān)鍵字values,這是一個(gè)列表類型的字符串。每一個(gè)字符串包含了"CompactIP-address/portinfo"格式的peers信息。如果被請(qǐng)求的節(jié)點(diǎn)沒有這個(gè)infohash的peers,那么他將返回關(guān)鍵字nodes,這個(gè)關(guān)鍵字包含了被請(qǐng)求節(jié)點(diǎn)的路由表中離info_hash最近的K個(gè)nodes,使用"Compactnodeinfo"格式回復(fù)。在這兩種情況下,關(guān)鍵字token都將被返回。token關(guān)鍵字在今后的annouce_peer請(qǐng)求中必須要攜帶。token是一個(gè)短的二進(jìn)制字符串。

請(qǐng)求參數(shù):{“id”:"<querying nodes id>", “info_hash”:"<20-byte infohash of targettorrent>"}
回復(fù)參數(shù):{“id”:"<queried nodes id>", “token”:"<opaque write token>", “values”:["<peer 1 info string>", “<peer 2 info string>”]}
或:{“id”:"<queried nodes id>", “token”:"<opaque write token>", “nodes”:"<compact node info>"}

報(bào)文包例子

請(qǐng)求:{“t”:“aa”, “y”:“q”, “q”:“get_peers”, “a”:{“id”:“abcdefghij0123456789”,“info_hash”:“mnopqrstuvwxyz123456”}}
對(duì)應(yīng)的B編碼:d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz123456e1:q9:get_peers1:t2:aa1:y1:qe

一般回復(fù):{“t”:“aa”, “y”:“r”, “r”:{“id”:“abcdefghij0123456789”, “token”:“aoeusnth”, “values”: [“axje.u”, “idhtnm”]}}
對(duì)應(yīng)的B編碼:d1:rd2:id20:abcdefghij01234567895:token8:aoeusnth6:valuesl6:axje.u6:idhtnmee1:t2:aa1:y1:re

回復(fù)最接近的nodes: {“t”:“aa”, “y”:“r”, “r”:{“id”:“abcdefghij0123456789”, “token”:“aoeusnth”, “nodes”: “def456…”}}
對(duì)應(yīng)的B編碼:d1:rd2:id20:abcdefghij01234567895:nodes9:def456…5:token8:aoeusnthe1:t2:aa1:y1:re

2.7.4、announce_peer

這個(gè)請(qǐng)求用來表明發(fā)出announce_peer請(qǐng)求的node,正在某個(gè)端口下載torrent文件。announce_peer包含4個(gè)參數(shù)。第一個(gè)參數(shù)是id,包含了請(qǐng)求node的nodeID;第二個(gè)參數(shù)是info_hash,包含了torrent文件的infohash;第三個(gè)參數(shù)是port包含了整型的端口號(hào),表明peer在哪個(gè)端口下載;第四個(gè)參數(shù)數(shù)是token,這是在之前的get_peers請(qǐng)求中收到的回復(fù)中包含的。收到announce_peer請(qǐng)求的node必須檢查這個(gè)token與之前我們回復(fù)給這個(gè)節(jié)點(diǎn)get_peers的token是否相同。如果相同,那么被請(qǐng)求的節(jié)點(diǎn)將記錄發(fā)送announce_peer節(jié)點(diǎn)的IP和請(qǐng)求中包含的port端口號(hào)在peer聯(lián)系信息中對(duì)應(yīng)的infohash下。

請(qǐng)求參數(shù):{“id”:"<querying nodes id>", “info_hash”:"<20-byte infohash of target torrent>", “port”:<port number>, “token”:"<opaque token>"}
回復(fù)參數(shù):{“id”:"<queried nodes id>"}

報(bào)文包例子

請(qǐng)求:{“t”:“aa”, “y”:“q”, “q”:“announce_peer”, “a”:{“id”:“abcdefghij0123456789”, “info_hash”:“mnopqrstuvwxyz123456”, “port”:6881, “token”: “aoeusnth”}}
對(duì)應(yīng)的B編碼:d1:ad2:id20:abcdefghij01234567899:info_hash20:mnopqrstuvwxyz1234564:porti6881e5:token8:aoeusnthe1:q13:announce_peer1:t2:aa1:y1:qe

回復(fù):{“t”:“aa”, “y”:“r”, “r”:{“id”:“mnopqrstuvwxyz123456”}}
對(duì)應(yīng)的B編碼:d1:rd2:id20:mnopqrstuvwxyz123456e1:t2:aa1:y1:re

總結(jié)

以上是生活随笔為你收集整理的DHT协议介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。