なぜなにTorrent
  • Cover
  • イントロ
    • はじめに
    • Torrentとは
    • ゴール
  • Torrentファイルを読み込む
    • About
    • Bencode
    • Bencodeの実装
    • TorrentFileの中身
  • Httpサーバーを作成してみる
  • UPnpによるポートマップ
    • UPnPによるポートマップ
    • UPnPの実装
  • Trackerへアクセスしてみる
    • About
    • TrackerはHttpサーバ
    • リクエストの中身
    • レスポンスの中身
    • テスト
  • ダウンロードゲームへ参加してみる
    • About
    • ダウンロードゲーム
    • ブロックデーターの実装
    • 配信用、Peerを作成してみよう
    • 基本戦術
    • Chokeの実装
  • DHTに対応してみる
    • About
    • Tracker無しでPeerを探す
    • KademliaのkBucketを利用している
    • RootingTableを実装してみよう
    • FindNodeでネットワークの構築
    • FindNodeを実装
    • GetPeersでInfoHashに対応するPeerを探す
    • テスト
  • [Dartの基礎]
    • [なぜDart]
    • Hello World
    • Test/Debug
      • Get started with Observatory
Powered by GitBook
On this page
  • レスポンスの中身はPeerの一覧
  • レスポンスはBencode形式
  • 圧縮して送信する事もできる
  • 不正な値を受け取った時もBencode
  1. Trackerへアクセスしてみる

レスポンスの中身

  • 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

Previousリクエストの中身Nextテスト

Last updated 7 years ago

http://kyorohiro.strikingly.com