能書きはこれくらいにして、まずは、BitTorrentプロトコルのページへ。
http://www.bittorrent.com/protocol.html
日本語版は、Discreet Blogさんで読めます。
http://lowlife.jp/yasusii/stories/16.html
BitTorrentの動作原理(特に、choke-unchoke、tit-for-tat)に関しては、アリエルさんの「BitTorrent技術メモ&リンク集」を読んでみて下さい。最強にわかりやすいです。
http://dev.ariel-networks.com/modules/xfsection/article.php?articleid=14
配付されているBitTorrentの構成要素、ファイル配信とダウンロードの動作手順の説明、各種接続形態の説明に続いて、Bencodeの説明。Bencode(ビーエンコード)は、データをコンパクトに表現する方式のひとつ。人間に優しくないXMLみたいなもんです、たぶん。
- Strings(文字列)は、文字列長の10進数表現、コロン、文字列、の並びで表す。例えば、spamは4:spamとなる。
- Integers(整数)は、i、 数値の10進数表現、e、の並びで表す。例えば、3はi3e、-3はi-3eとなる。整数にサイズ制限なし。i-0eは無効。i-0eといった0で始まる数値は無効。i0eは0になるので有効。
- Lists(リスト)は、l、(bencode済みの)要素、e、の並びで表す。例えば、['spam', 'eggs']はl4:spam4:eggseとなる。
- Dictionaries(ディクショナリ)は、d、キー・バリュー・ペアのリスト、e、の並びで表す。例えば、{'cow': 'moo', 'spam': 'eggs'}はd3:cow3:moo4:spam4:eggse、{'spam': ['a', 'b']}はd4:spaml1:a1:beeとなる。辞書キーは、必ず、文字列でソート順(辞書や数値順ではなく文字コード順)。
この部分は試しやすそうですね。BiTorrentの
ソースコードをダウンロードします。第一階層にあるのは、ユーザインターフェース関係とプラットフォーム依存の部分、そして、コア部分。ほとんどのソフトウェアで同じだと思います。さっそく、コア部分、BitTorrentフォルダに移動しましょう(cd BitTorrent)。ここらへんは、推理物だと思ってください。
bencodeの文字列が含まれるソースコードを検索してみましょう。
grep -r bencode .
grepで検索、コマンドオプション-rでフォルダの中身もすべて検索、次に検索文字列、最後に検索場所(.で現在の場所を表す)。
しょっぱなから、bencode.pyってファイルが見つかりました。このファイルを開いてみましょう。ボーっと見てると、decode(解読)関係で、以下の構成が見えてきませんか?見えない?テストケースtest_bdecodeの前、decode_xxx()の集団に注目します。
------------------------------
def decode_int(x, f):
... 整数のbencode表記を、元の整数に解読する
def decode_string(x, f):
... 文字列のbencode表記を、元の文字列に解読する
def decode_list(x, f):
... リストのbencode表記を、元のリストに解読する
def decode_dict(x, f):
... ディクショナリのbencode表記を、元のディクショナリに解読する
decode_func = {}
... 上記デコード関数をディクショナリに登録
def bdecode(x):
... bdecodeのインタフェース(コントローラ)。直接操作するのはこの部分。
------------------------------
さーて、実際に試してみますかー!
コマンドラインで、コアのフォルダに移動して(cd BitTorrent)、pythonとタイプ。対話(インタラクティブ)モードを起動。
bencodeを読み込んで、すべての関数に直接アクセスできるようにする。
>> from bencode import *
プロトコルの説明に、文字列spamは4:spamとなるとありました。デコードの場合は逆になるはず。
>> bdecode('4:spam')
'spam'
おー!ではでは、リストのbencode表現l4:spam4:eggseは['spam', 'eggs']になるはず。
>> bdecode('l4:spam4:eggse')
['spam', 'eggs']
bencodeの構成もほとんど同じ(bdecodeより簡単)。対話モードで何を試したら良いかわからない場合、テスト部分を参考にする。Bram Cohenのソースコードには、テストケースが豊富に含まれている。天才は、本能のままに書き散らすのではなく、極めて実務家(堅固なソフトウェアを構築する)であることを実感すべし!
注:厳密には、bencode.pyの作者はBram Cohenではなく、Petru Paler氏です。