ホームページ  >  記事  >  Java  >  Javaを使用してp2pシード検索機能を実装する方法

Javaを使用してp2pシード検索機能を実装する方法

不言
不言転載
2019-04-15 10:20:394047ブラウズ

この記事の内容は、Java を使用して p2p シード検索機能を実装する方法に関するもので、一定の参考価値があります。必要な友人は参考にしてください。

私は何年も前に p2p に非常に興味がありましたが、理論に留まり、実践する機会がありませんでした。私も最近これを実装したのですが、最初から現在に至るまで、共感できる部分がいくつかあると思います。本題に入りましょう。

基本概念

p2p について話す前に、ファイルをダウンロードする方法について話したいと思います。ファイルをダウンロードするいくつかの方法をリストします。

1. http プロトコルを使用してダウンロードします。最も一般的に使用される方法は、おそらくブラウザ経由でファイルをダウンロードすることです。

2. ftp を使用してダウンロードします。ftp には 2 つのモードがあります。1 つはポート (アクティブ) モードです。このモードでは、クライアントはローカルでポート N (>1023) を開き、ftp 接続を確立しますFTP サーバーにデータ送信用の N 1 リスニング ポートを与えます ファイアウォールがある場合、またはクライアントが NAT である場合、ダウンロードできません。もう 1 つの方法はパッシブ モードです。このモードでは、FTP サーバーはポート 21 に加えて、1023 より大きいポートを開きます。つまり、FTP サーバーが接続している限り、クライアントはアクティブに FTP 接続とデータ送信接続を開始します。このポートは開いていますので問題ありません。

上記 2 つの方式を総称して cs アーキテクチャと呼びますが、このアーキテクチャではサーバーにリソースが集中するため、データ量が一定以上になると問題が発生します。この問題を解決するために、分散分散化を考える必要があるため、p2p が登場しました。p2p は、ピア ツー ピアの略です。これは、ピア ツー ピア アーキテクチャです。各ノードは、クライアントとサーバーの両方です。

p2p アーキテクチャ

各ノードにリソースを保存するとき、リソースをダウンロードするときに、このファイルがどのマシンにあるのかをどうやって知ることができるのか、ダウンロードできるのか、と考えることがあります。

初期の p2p アーキテクチャにはトラッカーの役割があり、このトラッカーはファイルのメタデータ情報を保存する役割を担っていました。したがって、ファイルは各ピアに保存され、ファイル情報はトラッカーを通じて取得されます。

このアーキテクチャでは、すべてのファイルが分散されますが、トラッカーはすべてのファイルのメタデータ情報を保存する責任があるため、トラッカーが保存する必要があるのは少量だけです既存のファイルに比べて、データの削除が比較的簡単になります。

しかし、トラッカー サーバーがハングするかサービスが利用できなくなると、完全に分散されていないため、すべてのファイルはダウンロードされません。完全に分散化するために、トラッカーレス アーキテクチャが後で開発される予定です。,

現時点では、トラッカーは存在せず、ファイルのメタデータ情報を含むすべてのファイルが分散形式で保存されます。

DHT

DHT (分散ハッシュ テーブル) 分散ハッシュ テーブル。トラッカーの置き換えに使用されます。 dht を実装するには、Kademlia アルゴリズムなど、多くのアルゴリズムがあります。
いくつかの概念:

1.nodeid dht ネットワーク内の各ノード ID は 160 ビットです。

2.XOR 2 つのノード間の距離は XOR を使用して計算されます

3.ルーティング テーブルルーティング テーブル

ここでは実装が主なので、原理部分についてはインターネット上に多くの情報があります。

実装方法については、それを参照してください。 it

シード検索を実装するには 2 つのステップがあります。最初のステップは、インターネット上のシード情報をクロールするために使用されるクローラーです。2 番目のステップは、検索に参加することです。

次の知識が必要です: シード、bittorrent dht プロトコル、ベンコードされた

p2p に関して言えば、.torrent の結果であるファイルの種類であるシードについて言及する必要があります。誰もが bt Torrent を使用してファイルをダウンロードしたことがあると思いますが、ダウンロードされたファイルは bittorrent プロトコルを使用します。では、インターネット上で種子を収集するにはどうすればよいでしょうか?

bt シードに含まれる主なフィールド: https://segmentfault.com/a/1190000000681331

dht で取得されたシードは、トラッカーレス トレントと呼ばれます。代わりにノード属性を使用します。公式では、router.bittorrent.com をシードに追加したり、ルーティング テーブルに追加したりしないことが推奨されています。

1.dht からシードを取得する方法

シード情報を取得したい場合は、DHT プロトコルを深く理解する必要があります。 DHT プロトコルについて説明します。

詳細については、ここをクリックしてください。http://www.bittorrent.org/beps/bep_0005.html

ルーティング テーブルの実装方法:

ルーティング テーブルは、0 から 2 の 160 乗までのすべてのノード ID をカバーします。ルーティング テーブルはバケットで構成でき、各バケットはすべてのノードの一部をカバーします。

最初、ルーティング テーブルにはバケットが 1 つだけあり、すべてのノード ID をカバーしています。各バケットには最大 K 個のノードしか保持できません。現在の K 値は 8 です。バケットがいっぱいで、その中のすべてのノードが良好で、独自のノード ID がこのバケットにない場合、元のバケットは 2 つの新しいバケットに分割され、それぞれ 0..2159 をカバーします。および 2159..2160

バケットがいっぱいになると、新しいノードは簡単に破棄され、その中のノードがオフラインになった場合は置き換えられます。過去 15 分間にノードに ping が送信されていない場合は、ノードに ping を実行します。応答が返されない場合は、ノードも置き換えられます。

各バケットには、このバケットのアクティビティを示す最終変更属性が必要です。このフィールドは次の状況で更新されます:

1. バケット内のノードに ping が送信され、応答があります

2. ノードがバケットに追加されました

3バケット内のノードが置き換えられました。

バケットが 15 分以内にこのフィールドを更新しない場合、バケット範囲内の ID がランダムに選択され、find_node 操作が実行されます。

KRPC プロトコル

メッセージは、dht ネットワークの KRPC プロトコルを通じて送信されます。

1.ping

ping クエリは主にハートビート チェックに使用されます

2.find_node

ノードの場合、相手は自身のルーティング テーブルから最も近い N 個のノードをクエリし、それらを返します。通常は 8

3.get_peers

ノードの所有者を見つけます。 infohash に基づく infohash ピアが見つかった場合、nodes

#4.announce_peer

を返し、他のピアにも infohash があることを伝えます。

上記の 4 つによりルーティング テーブルが更新されることに注意してください。

最初はルーティング テーブルにノードがないため、スーパー ノード (dht.transmissionbt.com など) から開始して、find_node リクエストを通じてノードを検索して追加する必要があります。返されたノードは find_node に使用されます。

私が自分で実装したルーティング テーブルは、上記のものとは少し異なります。

DHT ネットワークはデータ送信に udp を使用するため、upd ポートを開いて find_node リクエストを継続的に送信してルーティング テーブルを確立し、get_peers を通じてシードの infohash を取得するだけで済みます。そして、announce_peer。

dht ネットワークに参加すると、上で紹介した 4 つの方法でしかシード ファイルの infohash を取得できないため、infohash を通じてシードをダウンロードする必要もあります。 bep_009 を参照してくださいhttp://www.bittorrent.org/beps/bep_0009.html

主に bep_009 を使用してシードの名前フィールドを取得します。ファイル名フィールドを取得した後、インデックスに基づいてインデックスを作成できます。名前と情報ハッシュを使用して検索を提供します。 (ここでは主にマグネット リンクを構築します。マグネット リンクを使用すると、Thunder、Baidu Netdisk などにアクセスしてリソースをダウンロードできます)

ほとんどのマグネット リンク形式: Magnet:?xt=urn : btih:infohash

上記で紹介した方法は、infohash を取得してマグネット リンクを構築し、サードパーティ ソフトウェアを使用してダウンロードする方法ですが、もちろん BitTorrent プロトコルを使用して自分でダウンロードすることもできます。興味があれば、自分で勉強することもできます。

わかりました。上記は実装手順を簡単に紹介しただけです。多くの詳細や具体的な実装については言及されていません。私自身の言葉で言えば、いくつかの github dht プロジェクトを参照し、自分で実装しました。具体的なアドレスは次のとおりです。 :https://github.com/mistletoe9527/dht-spider

以上がJavaを使用してp2pシード検索機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。