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

* Handshakeする
* ダウンロード許可を与える
* リクエストされたらデータをアップロードする

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

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

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

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

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

## まずば、HandShakeする。

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

中身はこんな感じ。&#x20;

![](/files/-LALzrpcs2wvDJ9WO2dv)

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

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

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

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

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

![](/files/-LALzrqCCjKr0DVU_Xcg)

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

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

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

![](/files/-LALzrqoaYUMygObXoqq)

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

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

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

![](/files/-LALzrrJqOa-qDybKweh)

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

## データを配信する

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

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

![](/files/-LALzrs0-7YCoDATMsXC)

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

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

Pieceメッセージを返します。&#x20;

![](/files/-LALzrsczIqf_OsivF6F)

## その他のメッセージ

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

### メッセージの構造

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

![](/files/-LALzrtYYbNvrn2WzgZz)

こんな感じです。最初の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  | ダウンロード要求破棄       |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://nazenani-torrent.firefirestyle.net/client/updater.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
