レスポンスの中身



  • Peerの一覧が含まれている*


  • Bencoding形式で渡される


  • 圧縮して行うことができる

本章では、 Tracker へのレスポンス について解説していきま す。リクエストとレスポンスの両方について理解ができた訳で すから、あなたは、Trackerサーバーを作る事がでくるようにな さているはずです。 実際に、Trackerサーバーを作成してみましょう。そして、実際 動作させてみて、想定した通りのリクエスト、レスポンスが飛 び交い、データの配信が開始される事を確認ていきます。


レスポンスの中身はPeerの一覧

Trackerはデータを配信しているPeerの一覧を返します。レスポ ンスととして最低限必要なのは、アドレスとポート番号の一ラ ンクです。 この2つのデータさえあればもTorrentクライアント同時でデー タを配信は合う事が可能です。 実際に渡されるデータの形式を見ていきましょう。

レスポンスはBencode形式

Peer の一覧も Torrent ファイルと同様に Bencoding 形式で渡 されます。

{
peers:
[
{
peer_id:<benstring>
ip:<benstring 127.0.0.1の形式>
port:<beninteger>
}
{
peer_id:<benstring>
ip:<benstring 127.0.0.1の形式>
port:<beninteger>
}
...
]
interval:<beninteger 次にTrackerへアクセスする時間 単位は秒>
}

intervalキーを除けば、ipアドレス、port番号、peer_id いっ た、リクエスト時にTracker へ渡した情報が含まれている事デ ータが含まれている事が読み取れるでしょう。 “interval”は次に Tracker へアクセスすべき目安の時間です。 どの程度の間隔でアクセスすべきなのかは、Torrent クライアン トからは判断できせん。どの程度のPeerが配信に参加してい て、どの程度のPeerが新規に参加しているを知らないためで す。 Tracker サーバー は自身の状態を加味して、この時間を決めま す。 例えば、頻繁にTrackerへアクセスされるとTrackerサーバーへ の負荷があがります。Peerのリストは更新されていない。更新 されても対象にあなたのアドレスが含まれるので更新する必要 性が弱い。といった時は、特別、アクセス時間を長く取るとい つた対応が考えられます。

圧縮して送信する事もできる

データを圧縮して相手へ送る事もできます。リクエストに "&compact=1" を含めると、対応しているTracker であれば、データを圧縮して送ってくれます。 { interval: peers: } peer のアドレスと port 番号を、バイト配列として扱うことで データを圧縮します。BIG_ENDIANで記録されます。 たとえば、IP4のアドレスは、「127.0.0.1」ならば、 [0x7F, 0, 0, 1] と配列になります。ポートが8080ならば、[0x1F, 0x90] といった並びで記録します。 Torrentでは、これせのデータを繋げて、アドレスが 「127.0.0.1」 で 、ポートが8008ならば、[0x7F, 0x00, 0x00, 0x01, 0x1F, 0x90] といった並びのバイト配列として扱います。

不正な値を受け取った時もBencode

Trackerはデ不正な値を受け取った時も、Bencode形式のデー タを返します。人がよんで解るようなメッセージを付けて以下 のような形式で返します。

{
failure reason:<benstring 失敗した理由>
}

これで、レスポンスされデータの形式については、済みまし た。では、実際にTrackerサーバー、Trackerクライアントほ実 装してみましょう。


Kyorohiro work

http://kyorohiro.strikingly.com