2013年7月17日水曜日

P2P探訪 Raider Torrentファイルを読み込んでみる(metafile)


TorrentクローンをJava で作成しています。
そろそろ、Applet上で動作するデモができそうです。 試してみて解ったことが結構ありました。
そこで、学習したしことを、epub形式でまとめています。http://p.booklog.jp/users/kyorohiro


やる気スイッチが入らないので、書きかけの物をさらします。





-------

Torrentファイルを読み込んでみる

すでにBencodingのパーサー作成済みなので、Torrentファイルの中身を解析することができるようになったと思います。
本ページでは、Torrentファイルに記載されている情報について説明します。

.Torrentはメタファイル 

Torrentファイルのデータの中身は、metainfo file structure と呼ばれています。 「メタ」というのは、データを要約したものです。
例えば、文書であれば、 「著作名」、「題名」、「ISBN番号」といったものがあげられます。 カメラで写真を撮ると、デシタルデータの場合JPEGという方式で画像されたりします。この時、 「撮影日時」、「撮影機器」、「解像度」、「GPS情報」などが記録されます。


では、Torrentでは、どのような情報が登録されているでしょうか?

MetaInfoの構造

ファイルがひとつの時
{
   announce:<benstring>, 
   info:{
     length:<beninteger>,
     name:<benstring>,
     piece length:<beninteger>,
     pieces:<benstring>
   }
}

ファイルが複数の場合
{
   announce:<benstring>, 
   info:{
    files: [
            { length:<beninteger>, path:[<benstring>,<benstring>]},
            { length:<beninteger>, path:[<benstring>,<benstring>]},
            ..
     ]
     name:<benstring>,
     piece length:<beninteger>,
     pieces:<benstring>
   }

ファイル名を記録できる

ファイル名を記録できます。 図xxxの name でファイル名を表現します。 lengthでファイルサイズを表します。
例えば、 「dokamagi,mp4」という20MBのデータをを記録したい場合、以下のように記述できます。
info:{
  name:"dokamagi,mp4"
  length:20971529
 }
}

TorrentはひとつのMetaInfoに複数のファイルを含めることもできます。この場合、name と pathを用いてファイル名を表現します。

例えば、「data/manga/bb.zip」「data/movie/dokamagi.mp4」というデータを記録した場合は、以下のように記述できます。

info:{
  files[
    {length:20971529, movie, dokamagi.mp4}
    {length:2097152, manga, bb.mp4}
  ]
  name:"data"
  length:20971529
 }
}

Trackerのアドレスを記録できる

Trackerのアドレスが記録できます。 announce でアドレスを記述します。
例えば、「http://127.0.0.1:8080/announce」をTrackerのアドレスとして記録した場合は、
{
announce:"http://127.0.0.1:8080/announce"
}


データの分割情報を知ることができる

Torrentは、データを分割してダウンロード、アップロードします。  MetaFileには、データを分割するサイズ、そのSHA1ハッシュ値が記述されています。 分割するサイズは「piece length 」で記述します。 SHA1ハッシュは、「pieces」で記述します。
例えば、32kのデータを、16kbに分割する場合は
{
   announce:<benstring>, 
   info:{
     piece length:16384,
     pieces:<40バイトのデータ>
   }
}

piecesは、分割したデータごとにSHA1ハッシュをとります。上記の例では、データが2分割されるため、20×2の40バイトとなっています。

1 件のコメント:

mbedtls dart の 開発を始めた web wasm ffi io flutter

C言語 で開発した機能を、Dart をターゲットとして、Web でも サーバーでも、そして Flutter  でも使えるようにしたい。 そこで、mbedtls の 暗号化の部分を Dart 向けのPackageを作りながら、 実現方法を試行錯誤する事にした。 dart...