なぜなに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
  • まずば、HandShakeする。
  • 所持しているBlockを相手に伝える。
  • 相手にダウンロードする許可を与える。
  • データのダウンロードに興味がないことを伝える
  • データを配信する
  • その他のメッセージ
  • メッセージの構造
  1. ダウンロードゲームへ参加してみる

配信用、Peerを作成してみよう

Previousブロックデーターの実装Next基本戦術

Last updated 7 years ago

  • Handshakeする

  • ダウンロード許可を与える

  • リクエストされたらデータをアップロードする

駆け引きのないAIから作成してみよう

実際にデータ配信用のPeerを作成してみましょう。ただし、初めから、ダウンロードゲームで良い結果を生むAIを作成するのは難しいです。 まずは、簡単なところから手をつけていきましょう。

データを配信するだけのTorrent Clientを作成してみましょう。 駆け引きとかはありません。データの配信リクエストを受けとったら、その指示通りデータを配信するといったものを作成していきたいと思います。

ダウンロードゲームへ参加方法を学習しよう

実際に実装してみて、ダウンロードゲームに参加してみましょう。実際に実装してみて、その振る舞いを観察してみましょう。 メッセージがどのように使われているか?仕様の認識が間違っていないか? などを把握する事ができます。

まずば、HandShakeする。

まずは、ハンドシェイク処理を行います。Torrent Clientがサポートしているプロトコルは何か?このセッションでやりとりするデータは何かを交換します。

中身はこんな感じ。

19はプロトコル名の長さ、"Bittorrent protocol"がプロトコル。 reserved は、拡張用に予約されている領域。infohash の部分がtorrent file を識別するのに使用するID。peer_id がpeerを識別するIDです。

Trackerから、IPアドレスとPort番号を教えてもらうと、Torrent Clientは、このメッセージを送信します。 InfoHashを検証して、回線に余裕があれば、相手からもこのメッセージが送信されます。

これで、ハンドシェークの完了です。

所持しているBlockを相手に伝える。

次に所持しているデーターを相手に伝えます。

length がメッセージの長さ。5 がメッセージを識別するID。Bitfieldはlength-1バイトの大きさを持つBitfieldデータ。

相手にダウンロードする許可を与える。

次に、相手にダウンロードする許可を与えます。unchokedメッセージを渡します。

0001がメッセージ長で、1がunchokeを示すIDです。

データのダウンロードに興味がないことを伝える

配信専用なので、通信相手からデータをダウンロードする趣旨がないことを伝えておきましょう。

0001がメッセージ長で、3がnotintersted、エッセージである事を示すIDです。

データを配信する

Torrent Clientでは、配信リクエストを受けたBlockを配信します。れクエストがない状態でデーターを配信することはありません。

Requestメッセージが相手から送られます。

indexが、Blockの位置、beginとlengthがアップロードして欲しい、開始位置、その長さです。

だいたい、16*1024 byteの単位でレクエストしてきます。

Pieceメッセージを返します。

その他のメッセージ

これで、データ配信で利用するメッセージは網羅しました。他にもいくつか紹介できていないメッセージかるあるので紹介します。

メッセージの構造

HandShake以外のメッセージは、決まった構造をしている事にお気づきでしょうか?

こんな感じです。最初の4バイトが、メッセージの長さです。次にIDが渡されます。そして、メッセージの中身が渡されます。

メッセージ名

Length

ID

内容

KeepAlive

0

なし

通信可能かチェック

Choke

1

0

ダウンロード不許可

Unchoke

1

1

アップロード許可

Interest

1

2

ダウンロード許可要求

NotInterest

1

3

ダウンード許可不要

Have

5

4

所持しているBlockを知らせる

Bitfield

1+bitfield長

5

所持しているBlockを知らせる

Request

13

6

ダウンロード要求

Piece

13+データ長

7

データアップロード

Cancel

13

8

ダウンロード要求破棄