2017-02-11 4 views
1

は、私は最近、ビットトレントプロトコルを学んでいます、と私は私のスクリプトが正常にピアがDHTプロトコルを介して、アドレスのトンを取得し、ドキュメントbep_0005に依存してきた:照会ノードがためにピアを持っている場合DHTネットワークからのピアツーピア通信をするにはどうしたらいいですか?

http://www.bittorrent.org/beps/bep_0005.html

彼らは文字列のリストとして キー "値"に返されます。単一のピアのための "コンパクト" 形式のピア情報を含む各文字列。

したがって、これらの値をip/portにデコードします。

私はTCPソケット、タイムアウト、ネットワークに接続できませんでした、接続拒否エラーが発生しました。

bep_0029に依存するハンドシェイクメッセージをUDPソケット経由で送信しようとしましたが、いずれも応答しませんでした。

誰かが私に教えてください、間違っていますか?これらのピアを接続する正しい方法は何ですか?それとも普通の99%が接続できないのですか?私はその1%良いピアを手に入れませんでしたか?

ありがとうございました!

これは私がトラッカー

しかし、DHTから無幸運からもらったピアのTCP応答です。

# This is function I decode ip/port 
def decode_peers(peers): 
    ret = [] 
    for ipport in peers: 
     try: 
      ret.append((socket.inet_ntoa(ipport[:4]), unpack('>H', ipport[-2:])[0])) 
     except Exception as err: 
      logging.critical(err) 
    return ret 

# This is an bdecoded example what I received from nodes, and I passed "value" part to the upon function. 
[03:53:05](DEBUG): OrderedDict([(b'ip', b'n\xbc;,\xf1\x87'), (b'r', OrderedDict([(b'id', b'\xcf\[email protected]\xfb\x86?\x17\xb0\x95\xd1\xb9:\x9a\xf1\x9c\xf1v\x03\xa82'), (b'nodes', b'\x85\xd7\x80\x1b\x8a"V\xd9>\xf8<\xa2\x0e2~\x84j\x94wIA\xb2\x19&\x8b\x0c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x05\xb2\xce\xe2\x0b8j\xd1\xd3.\x85\x8cH\x8c\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x06\x8d\x81\x1f\xe4\xc5\x88\xec\xad\xfc\x1a\xcf\x9e\xa6\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde0\x07 \xbcR\x1d*u\x0e.\xa8E\x12G\xdb\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x80r\xfdn\x8d!\r\x17\xbfU\xb5\x87\x81t\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x81\x90\xc0\x13Pw\x91\x87\xc25\x9d1\x881\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x82m"\x12-\x96\xc7\x1fY}\xe4_\x9f\xff\xcf\[email protected]\xfb\x86?\x18\x93$\xdf\xde1\x83\x82\xdb\xf0\x10\xeb&I\xc5}\xece\x13\xc9'), (b'token', b'\na\xb8\x15'), (b'values', [b'9Bq\xf1X\xea', b'9\x07r7\x9a\xee', b'\x7fg\xb8\x17\x9e\x90', b'\xc1d\xfa\xa5\x01\x94', b'\x04r=!C\x9a', b'Fv\x7f\xa7\x86\x9e', b'\x89s\x7f\xf3\xc8\xa4'])])), (b't', b'\xc3\x8b\xc2\x9d'), (b'v', b'LT\x00\x11'), (b'y', b'r')]) 

# This is result I got from decode function, there is no difference when I compare to what Wireshark decode under DHT protocol. 
[04:03:56](DEBUG): [('57.66.113.241', 22762), ('57.7.114.55', 39662), ('127.103.184.23', 40592), ('193.100.250.165', 404), ('4.114.61.33', 17306), ('70.118.127.167', 34462), ('137.115.127.243', 51364)] 
+0

ポストパケットキャプチャ+デコードしたもの。あなたは人気の急流でテストしたいかもしれません。既存の実装と比較して、それが動作するかどうかを確認してください – the8472

+0

DHT以外のピアとのTCPピアプロトコル実装をまだ検証しましたか?私は最近、新しいBitTorrent実装をテストしていましたが、インターネット上のピアに接続しようとする前に、既知のポート上でローカルにクライアントを実行するほうがずっと簡単でした。 (私の場合、ドッカーの画像([これに基づいて](https://github.com/camillebaronnet/docktorrent))を使用しているので、テストピアの状態を簡単に共有してリセットすることができます) –

+0

ありがとう、私はすでにWiresharkからパケットキャプチャのスクリーンショットをアップロードしています。私のTCP実装が正しく動作するかもしれません。しかし、私はまだDHTのピアからの応答を得ることができません、それらのすべてがちょうど接続を確立することはできません、それは私をイライラさせました –

答えて

1

( '127.103.184.23'、40592)

これは明らかにジャンクです。 127.0.0.0/8ブロックはインターネット経由ではルーティングされないため、ノード内にアドレスを含むデータは存在しません。

あなたがよく知られている人気のトレントを取って、そのアナウンスURLを削除し、DHTをサポートしているクライアントに入れることをお勧めします。次に、その動作を観察し、それをあなた自身の実装と比較してください。

一般的に言えば、そこにはバグや悪意のある実装が存在するため、ジャンクの一部が予想されます。しかし一般的にそれはわずかな部分(99%より小さい)でなければならず、1つの良いアドレスを見つけることは、群に接続してから、より多くの同輩を得るためにPEXを実行するのに十分でなければなりません。 偽のデータを挿入するためにトラフィックを操作する悪質なISPがある場合、その部分は通常よりもはるかに高い場合があります。

+0

申し訳ありませんが、私はあなたの提案に従って、最後に問題を解決しました。私は "値"を正しくデコードしていません。私は動作しているアプリケーションをインストールしました。私はWiresharkと比較してまったく異なるアドレスをデコードします(ip.addr == [WiresharkがデコードしたいくつかのIP]をフィルタリングしようとすると何もありません)。 「価値観」には魔法がありますか? –

+0

マジックはありません。それぞれの 'values'エントリは、IP IPの場合は4または16バイト、ポートの場合は2バイト、すべてbigendianです。クライアントとの比較として、着信接続か発信接続かをチェックしていますか?あなたが 'get_peers'から得たものと必ずしも一致するとは限りません – the8472

関連する問題