オープンソース磁力探索爬虫類dhtspider原理解析


オープンソースアドレス:https://github.com/callmelanmao/dhtspider.
オープンソースのdht爬虫類はすでに多く、phpバージョン、pythonバージョン、nodejsバージョンがあります.いくつかのテストを経て、nodejsバージョンの爬虫類の効率が最も高く、github上の既存のオープンソースプロジェクトを使用していることがわかりました.https://github.com/dontcontactme/p2pspider/.
p 2 pspider開発の時にes 2015が出てきたばかりなので、es 2015でp 2 pspiderプロジェクトを書き直すついでにdht爬虫類の原理を深く学ぶことにしました.
dht爬虫類は全体的に2つのモジュールに分かれている.
dhtモジュール
dhtモジュールは、ネットワーク上の他のdhtノードと通信するためのdhtノードを実現し、通信中に磁力リンクを収集するタスクを完了する.
btモジュール
btモジュールはbtプロトコルのクライアントプログラムを実現し、磁気リンクがダウンロードできることを発見したとき、btクライアントとリモートのサーバ通信を通じて、シードのメタデータをダウンロードします.
原理解析
0×01関連用語
1.1 P 2 Pネットワーク
ピアツーピアコンピューティング(Peer to Peer、略称p 2 p)は、直接交換によってコンピュータリソースとサービスを共有するように簡単に定義することができ、ピアツーピアコンピューティングモデルアプリケーション層が形成するネットワークをピアツーピアネットワークと呼ぶことが多い.
1.2 DHTネットワーク
DHT(Distributed Hash Table,Distributedハッシュテーブル)DHTはノードからなり、peerの位置を格納する分散型ストレージ方法である.サーバを必要としない場合、各クライアントは小さな範囲のルーティングを担当し、データの一部を格納し、DHTネットワーク全体のアドレスと記憶を実現する.BTクライアントはDHTノードを接続するためのDHTノードを含むDHTの他のノードを結んで、peerの位置を得て、さらにBitTorrentプロトコルを通じてダウンロードします.
簡単に言えばDHTは、情報提供とサービスノードの管理とルーティング機能の管理を担当し、2つの概念を区別する必要があります.
「peer」は、BitTorrentプロトコルを実装するTCPポート上で傍受されるクライアント/サーバである.
ノードは、DHT(分散ハッシュテーブル)プロトコルを実装するUDPポート上で傍受されるクライアント/サーバです.
1.3 Kademliaアルゴリズム
KademliaはDHTネットワークの実装である.Kademliaネットワークでは,距離は異或(XOR)によって計算され,結果は符号なし整数であった.distance(A,B)=|A xor B|は,値が小さいほど近い.
1.4 KRPCプロトコル
KRPCはノード間のインタラクティブプロトコルであり、bencode符号化からなる簡単なRPC構造であり、UDPメッセージを使用して送信される.独立したリクエストパケットが発行され、独立したパケットが返信される.このプロトコルは再送信されていません.リクエスト、返信、エラーの3つのメッセージが含まれています.DHTプロトコルでは、4つのリクエストがあります.
pingノードが有効かどうかを確認
find_Nodeは、初期ルーティングテーブルまたはバケツが生存しているかどうかを検証するときに使用するノードの検索要求を1つのノードに送信します.
get_peersは、リソースの検索要求をノードに送信します.
announce_peerは、あるリソースのダウンロードを開始したことをノードに通知するKRPCメッセージは、tキーとyキーが各情報に含まれる独立した辞書から構成される.
1.5 MagNetプロトコル
MagNetプロトコル、すなわち磁気リンク.sha 1アルゴリズムによって20バイトの文字列が生成され、P 2 Pクライアントは磁力リンクを使用してリソースのシードファイルをダウンロードし、シードファイルに基づいてリソースをダウンロードします.
既存のスクリプトが実装されているため,関連プロトコルを大まかに理解するだけで実行できる.
0×02 DHT爬虫類
####2.1実現原理
DHTノードを装ってDHTネットワークに情報を収集し、DHT中のnode(ネットワークに加入したときにランダムに生成)とinfohashはいずれも160 bitの表示方式、つまり40ビットの16進数を使用しており、数級が2^160であることを意味し、爬虫類は主にget_peer、announce_peerの2つの要求の情報を収集する
#### 2.2 get_peer
get_peersはtorrentファイルのinfohashに関係しており、確認するリソースにpeerがあるかどうかを見つけます.このときKPRCのq=get_ノードidとinfoを含むpeershash 2つのパラメータ、要求されたノードに対応するinfo_がある場合hashのpeersは、キーワードvaluesを返し、なければキーワードnodesを返し、tokenもannouce_を返します.peerには携帯が必要です.
パラメータ:
  {"id" : "<querying nodes id>", "info_hash" : "<20-byte infohash of target torrent>"}

  {"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>"}

info_hash

#### 2.3 announce_peer

announce_peer , torrent 。 id、info_hash、 port tonken, token, , IP port 。 announce_peer, 。

  {"id" : "<querying nodes id>", "implied_port": <0 or 1>, "info_hash" : "<20-byte infohash of target torrent>", "port" : <port number>, "token" : "<opaque token>"}

  {"id" : "<queried nodes id>"}

0×03 bt

bt , ip, , bt 。

, http://bt.box.n0808.com/, http://torrage.info/

, bt 99% , p2pspider 。

0x04

node.js torrent https://github.com/feross/webtorrent, https://github.com/themasch/node-bencode

0x05

, , bt