GetPeersでInfoHashに対応するPeerを探す
    GetPeersでPeerを探す
    AnnouncePeerでP2Pネットワーク上に値を保存する
前章でP2Pネットワークを作成する事ができました。本章では、作成したP2Pネットワークにデータを記録する方法について解説していきます。

GetPeerでネットワークとFindNodeはほとんど同じ。

MainLine DHT ではGetPeersメッセージを利用して、データを所持しているPeerを探します。
GetPeerコマンドは「指定してKIDに対応するデータを所持しているPeerを知っていれば、そのPeerについて教えてもらう」、もしも知っていなければ、もっとも近いPeerを教えてもらう。といった事をします。
この操作を何度も繰り返す事で、KIDともっとも近くにあるNodeを発見する事ができます。
これは、ほとんど、FinddNodesと同じような動作ですね。
    KIDの近いPeerを紹介してもらうのが同じ
    なんども、送信と受信を繰り返すのが同じ
実装もほとんど同じになります。

AnnouncePeerでデータを記録する

GetPeerを繰り返して、上位K個のNodeが固定されたら、AnnounePeerメッセージを利用してデータを記録してもらいます。
K個のNodeへデータの記録を依頼します。複数のPeerへ依頼することによって、堅牢性が高まります。
    発見されやすくなる
    登録したPeerが離脱しても大丈夫
    登録したPeerの負荷を分散することができる。

メッセージの構成

1
arguments:
2
{
3
"t":"aa",
4
"y":"q",
5
"q":"get_peers",
6
"a": {
7
"id" : "<querying nodes id>",
8
"info_hash" : "<20-byte infohash of target torrent>"
9
}
10
}
11
12
response: have value
13
{
14
"id" : "<queried nodes id>",
15
"token" :"<opaque write token>",
16
"values" :
17
["<peer 1 info string>", "<peer 2 info string>"]
18
}
19
20
response: have node info
21
{
22
"t":"aa",
23
"y":"r",
24
"r": {
25
"id" : "<queried nodes id>",
26
"token" :"<opaque write token>",
27
"nodes" : "<compact node info>"
28
}
29
}
Copied!
FindNodeとほとんど同じですね。本書では"token"と"values"が初めて出てきました。
"token" は、レスポンスを返す側に自由に決めることができるバイトデータです。AnnouncePeerクエリを送信する時に使います。このバイトデータのサイズもレスポンスを返す側のクライアントによって、異なります。
"value" は、6バイトのデータ[ ,]をList形式で、複数個格納しています。

実装について

findNodeで解説したとおりです。findNodeを実装したノウハウでそのままgetPeersも実装できると思います。 なので、特別、解説するページをさかないようにしました。
Kyorohiro work
Last modified 3yr ago