質問

Bittorrent Peer Wire Protocolに関する質問がいくつかあります。 この仕様を使用して、Javaで実装しようとしています。

Peer Wire Protocolセクションでは、すべての整数は4バイトのビッグエンディアン値であると述べています。 AFAIK javaはビッグエンディアンを使用します。チョークメッセージを送信したい場合に言うことを意味します

チョーク:<!> lt; len = 0001 <!> gt; <!> lt; id = 0 <!> gt;

sokcet 1の後に0を書き込むだけですか?

2番目の質問について。作品をリクエストするとき、複数のファイルを1つの大きな連続ファイルと考えますか?または個々のファイルで考えますか?ピースの長さがファイルと一致しないため、1つのインデックスに1つのファイルの終わりと別のファイルの始まりの両方を含めることができますか?

ピアへの接続を開いてハンドシェイクを送信するときの最後の質問については、ピースまたはリクエストを要求し続け、しばらく待ってから何かを要求するかどうかを確認しますか?話はどのように行われますか?私は主にhttpタイプのネットワークプログラミングを行っており、応答を待つものを求めています。しかし、ピースをリクエストし続ける場合、ピースをどのように送信しますか?

役に立ちましたか?

解決

質問1

単純なメソッドにこだわり、ストリームベースのI / Oを使用している場合は、 DataInputStream およびプリミティブ型(たとえば、 byte int long など)を書き込むときのDataOutputStream:

Socket s; // assume this is already connected
DataOutputStream out = new DataOutputStream( s.getOutputStream );
out.writeByte( 1 );
out.writeInt( 0 );
out.flush(); // optional

非ブロッキングI / O(java.nioパッケージのクラスなど)を使用している場合は、 ByteBuffer s:

Socket s; // assume this is already connected
SocketChannel = s.getChannel();
ByteBuffer buf = ByteBuffer.allocate(8); // two 4-byte integers
buf.put( 1 ).putInt( 0 );
buf.flip();
c.write( buf ); // assuming channel is writable :)

これらの各メソッドは、バイトの順序の問題をユーザーに代わって処理します。

質問2

(通常、断片上にあるブロックをワイヤ上で転送していることに注意してください。これについてはここで説明します:))

ピースを送信/受信するとき、あなたが言ったように、ファイル(またはファイル)は連続していると考えるのが最善です。 .torrentファイルには、情報ディクショナリのファイル境界に関する情報が含まれています。 マルチファイルケースでは、各ファイルにはパスと長さがあります。 単一ファイルケースには、オプションの名前と長さがあります。ピースのサイズ、ピースの数、およびコンテンツの合計の長さ(すべて.torrentファイルから)がわかっているので、ピースを<!> quot;を正しい場所に配置できます<!> quot;あなたがそれらを受け取ったとき。

簡単なことは、トレントのサイズに等しい単一のファイルを作成することです。ピースを受け取ったら、この単一ファイル内の正しいバイトオフセット(<!> quot; .downloading <!> quot;ファイルと呼ばれることもあります)に書き込みます。たとえば、2つのファイルで構成されるトレントを考えます。

a/b/file1.txt [100 bytes]
a/b/file2.txt [200 bytes]

piece size (pz) = 50 bytes
total size (tz) = 100+200 = 300 bytes
number pieces (np) = 300/50 = 6
file = my_torrent.downloading

ピースとバイトオフセットにゼロで始まる番号を付けると仮定します。ピース1のすべてを受け取ったとします。my_torrent.downloadingには(開始)バイトオフセットがありますか? (1 * pz)=(1 * 50)= 50 になります。ピース0はどこに行きますか? (0 * pz)=(0 * 50)= 0 で。など...

この.downloadingファイルを<!> quot; real <!> quot;に変換する方法を理解できると思います。トレント内のコンテンツ。

質問3

BitTorrent swarmに参加するとき、複数のピアとの間でピースをアップロードおよびダウンロードします同時に。ちょっと考えてみてください。あるピアからピースをリクエストしているときに、別のピアが同じことをしている可能性があります。既に指摘したとおり、HTTPのセマンティクスとはまったく異なります。したがって、あなたの質問に直接話すために、他の仲間はあなたが彼らが興味を持っているデータを尋ねます。 :)

念のために、ピアにピースaをリクエストする前に、ピアに希望のピースがあることを確認してください(ビットフィールドとメッセージ)があり、適切な窒息/関心事動作。そのため、通常行うことは、既知のピア(トラッカーまたはDHTから通知された)のリストにデータを rarest first の順序で要求することです。仕様ではこれについて説明していますが、ここには最適化とポライトネスに関する多くの考慮事項があります。 (たとえば、Tit-for-tatの動作。) spec がつづらないことに気付くかもしれませんこれがたくさん。これは、BitTorrentクライアントの秘密のソースの多くが実装のこの部分にあるためです。 :)

これがお役に立てば幸いです!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top