# ダウンロードゲーム

* **お互いにデータを配信しあう**
* **同時に、複数のPeerからダウンロードする**
* **ダウンロード速度が早いところからアップロードする。**
* **アップロード速度が早いところかダウンロードする。**
* **同時に、複数のPeerからダウンロードす**
* **配信に協力しないTorrentには配信しない**

TrackerからPeerの一覧を取得できるようになりました。TorrentのP2Pネットワークから、実際にデーターをダウンロードしてみましょう。

#### Torrent のダウンロードはゲーム

Torrentクライアントどうしのデータのやりとりをダウンロードゲームと呼ぶ事にします。Torrentは特定のサーバーからダウンロードするのではなくて、Peerどうしで融通しあいます。この時の融通しあい方の、ゲーム性が高いのが、ダウンロードゲームと呼ぶ事にした理由です。

決まったルールに従ってダウンロードするのではなく、Peerどうしで駆け引きを行いお互いにダウンロード速度を競い合います。駆け引きのうまいAIは有利にデータをダウンロードできます。しかし、逆に駆け引きの下手なAIはダウンロードに時間がかかるといった感じです。

#### 悪意のあるPlayerもゲームの一部

このことによって、耐久性の高いネットワークを構築できます。決められたルールを適用している場合、そのルールの考慮漏れがある場合、、悪意のあるPlayerの暗躍を原理的に許す事になります。

しかし、悪意をもったゲームプレイヤーも、いちプイヤーとして考えて対処することになります。 この攻略方が見つかるまでは、(悪意のあるPlayerが勝つような)有効な仕組みとして働き続けます。 また、後述する「つきあいかたの科学」の中で紹介されている「おうむ返し戦略」が今のところもっとも強い戦略として知られています。そして、今もなお、有効なゲームであり続けてるのです。

## Torrentはデーターを配信しあう

Torrentでは、Peerどうしが所持してしいるデータを配信しあいます。

例えば、"まぎか.mp4" というデータをPeer A が所持していて、Peer B が このデータを欲しい場合

![](/files/-LALzkOb0gvaN2REcCcz)

Peer A が Peer Bにデーターを提供します。

同様に、Peer B が Peer A が欲しがるデータを所持していた場合、&#x20;

![](/files/-LALzkP5YaJ1zl7hr1Pe)

&#x20;"まぎか.mp4"をダウンロードしながら、"エスカ.mp4"を配信します。

## Torrentはブロック単位で配信しあう

Torrent の場合は、このデータを共有する単位は、ファイル単位ではなくて、ブロック単位で管理しています。

```
{
 "announce":http://example.com/tracker,
 "created by":torrent generator,
 "creation date":1364723642,
 "encoding":utf-8,
 "info":{
 "length":1024,
 "name":xxx
 "piece length":16384,
 "pieces":<......20バイト単位のバイナリデータ>
 }
}
```

上記のような、TorrentFile の中に記載されている、"piece length" の単位でデータを分割しています。

例えば、piece\_lengthが8で、\[0,1,2,3,4,5,........]というデータを持つ場合、&#x20;

![](/files/-LALzkRTPuApncnoMEHN)

&#x20;といった感じで、n個に分割します。

## 効率よくデータを配信するほうほうを模索する。

効率よくデータをネットワーク全体に配信するために、Torrent Clientは様々な工夫を凝らします。

### 1. 同時に、複数のPeerからダウンロードする

同時に、複数のpeerからデーターをダウンろロードします。これによって、いって時間にダウンロードできるデーター量が安定します。あるPeerの回線が混雑して遅くなっても、他の回線が早いpeerがその分をおぎなってくれます。

上がり速度よりも、下がり速度の方が早い回線がほとんどです。同時に複数のPeerからデータをダウウンロードすることで、下り速度いっぱいをり利用してダウンロードすることも可能です。

### 2. ダウンロード速度が早いところへアップロードする。

ダウンロード速度は、回線の速度、混み具合、経路などによって、変化していきます。 Torrent Client は、通信状態を計測してして、アップロード速度が早いpeerからデーターをダウンロードするようにします。

Torrent Client で良く使われ方法として、同時にダウンロードするPeer数をK個に固定して、一定時間ごとに、アップロード速度がお遅かった、peerを、それ以外のダウンロード可能なpeerと入れ替えます。

これによって、ダウンロード速度が早いK個のpeerを探しつつ、現状で最適なPeerかたデーターをダウンロードできるようになりますようになります。

### 3. 配信しないTorrentには配信しない

配信して欲しいデータを持っているPeerへデータを配信しているにも関わらず、Chokeされ続けている場合、Choke仕返します。

万物の等価交換が基本です。得たらその分を還元する事を相手に期待します。

#### 囚人のジレンマと「つきあい方の科学」

このような、敵対的な行動をする相手に対して、こちらも敵対的行動を示す事を、しっぺ返し戦略といいます。

この問題については、「つきあい方の科学」を参照してください。 <https://ja.wikipedia.org/wiki/つきあい方の科学>

Torrentの仕様は公開されています。なので、協調しないPeer を作成する事も可能です。例えば、ダウンロードだけとして配信しないTorrentとか。

このように利己的な Torrent Client が増えるとデータの配信が不安定になります。なので、長期的に考えて、データー配信に参加しないTorrentよりも、配信に参加したTorrent方がよりよい結果をうむ仕組みが必要になります。

**\[囚人のジレンマ問題なので、協調しないのが合理的]**

| Peer A    Peer B | 配信する | 配信しない |
| ---------------- | ---- | ----- |
| 配信する             | 2  2 | 0  3  |
| 配信しない            | 3  0 | 1  1  |

お互い協調すると、お互いに2の利益を得る事ができる。片方だけ配信すると、配信しない側だけ得をする。配信したPeerだけ4の利益を得る。お互いに配信しないとお互いに損をする。といった事がおきます。

利己的に判断すると、相手が裏切る場合を考慮した場合、合理的に自身の利益を最大化するために、データーを配信しないという選択をします。

* 相手が、「配信するを選択｣をしたとする場合、自分は「配信しない選択」が有効。
* 相手が、「配信するを選択」をしたとする場合、「自分は配信しない選択」をする方が有効。

つまり、相手の選択によらず、配信しない方がより良い利益を、得る事ができる。

つまり、データをダウンロード専用のTorrentクライアントを作れば、使う人が増えるに違いないとなるわけです。

**\[無限ゲームとして見ると、おうむ返しがメジャー]**

一度だけだと、裏切る事が最良の選択ですが、無限ゲームの場合だと少し状況が変わってきます。 「つきあいの科学」の中で、実際に行われた実験について解説されています。

囚人のジレンマに基づいて、「協調するか」、「裏切るか」の選択をおこなうゲームを行いました。AIどうしを戦わせるゲームです、さまざまな分野の方に協力してもらいました。 参加した人は、優勝を狙い様々なAIを組みました。「裏切り続けるAI」や「仏の顔は3度までAI」や「ランダムな選択をするAI」など、様々なAIが用意されました。ひのAIを網羅的に戦わせた結果、もっとも良い成績をのこしたのが、このおうむ返し戦略(TIT-FOR-TAT)なのです。

**\[予想される戦略]**

無限ゲームでは、おうむ返し戦略が有効な事がわかりました。しかし、有限ゲームではどうでしょうか。いつかは、ダウンロードは終わります。 たとえば、ダウンロードゲームの場合では、ダウンロード完了後に、協調することは合理的な選択でしょうか? 実際のところ、協力しても得られる利益はゼロです。配信する帯域分はマイナスともいえます。

このことから、予想される戦略は、データのダウンロードが完了するまでは、協力的だけど、データのダウアンロードが完了してしまうと、非協力的になる事が予想されます。

実際のところ、この推論はだいたいあっていて、インターネットでのTorrentの使い方として、データのダウンロードが終わったら、データー配信リストから削除する的な対応をするユーザーがかにれいるようです。

彼らの戦略はとても利己的、かつ合理的なのが解ると思います。


---

# 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/downloadgame.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.
