たとえば送信するアプリケーションと受信するアプリケーションがあるとします。まず通信をする場合、先に起動するアプリケーションはどちらでしょうか。そう、受信するアプリケーションになります。そして、受信するアプリケーションは起動して、すぐ終了しては意味がありません。起動状態を維持し、送信するアプリケーションからのデータを待たなくてはいけません。このように、どんな通信においても、その通信路の両端の果たす役割は違っています。通信というのは誰かが要求し、その要求を待ち続けていた者が受領、処理し、結果を応答するという形をとります。ここで覚えておくべき用語として、要求する側をクライアント、要求を受け処理し、応答する側をサーバと呼びます。通信には必ずこの両者が存在します。
(サーバ、クライアントのネットワークと相対するものとしてP2Pというものがあります。通信路で結ばれる各々(各ノード)の役割は対等とされています。しかし、ある瞬間、あるノード間を見たときにサーバ、クライアントの関係は存在しています。その関係がめまぐるしく変化するため、全体として役割が対等になるわけです。P2Pはサーバ、クライアントと対極に語られることがあるのですが、それはP2Pを大きく捉えた立場からでたものなのです。もちろん、間違いではありません。サーバ、クライアントという言葉を使うときはどの立場から使われているのかを明確にしたほうがよいでしょう。)
どちらがどういう役割を果たすか、これもプロトコルの内容の一つです。
さらにプロトコルでは、そのデータの内容に関しても取り決めを行います。この講座では典型的なデータ内容を紹介したいと思います。
ノードが実際にデータを参照するには、データを受信して記憶領域に貯める必要があります。また、送信側も送るデータを作るためにそのデータを一時的に形成するために記憶領域を必要とします。
記憶領域というのは無限ではありません。どんなデータを送るか分からない、どんなデータを受信するか分からないということになると、必要とする記憶領域のサイズが分からない、つまり、無限に記憶領域を用意しなければならないことになります。
無限にデータを用意しなくてもよいようにするには、
- 何バイトのデータなのかあらかじめ決めておく
- 「何バイトのデータなのかを示すデータ」を設ける
のいずれか、あるいは、組み合わせで実現できます。
実際の使用方法を挙げながら、それぞれの方法について説明していきます。
CというノードとSというノードがあるとします。そして、Cはクライアント、Sはサーバという役割を与えます。
したがって、まず、SはCからのメッセージを待つということなります。
ここでプロトコルとして
- クライアントはサーバに対して、「おはよう」というメッセージを送る
- サーバはクライアントから「おはよう」というメッセージを受け取ったら、そのクライアントに「おはよう」を送る
というものを設定します。この場合、「おはよう」というあらかじめ決まった文字数(4文字)をやりとりするので、前述の使用方法の中では1.に当てはまります。
ここでプロトコルを"追加"します。追加するのは、
- クライアントはサーバに対して、「今日もよろしく」というメッセージを送る
- サーバはクライアントから「今日もよろしく」というメッセージを受け取ったら、そのクライアントに「今日もよろしく」を送る
です。この場合、サーバは「おはよう」と「今日もよろしく」(7文字)どちらのメッセージも受け取れるようにしておかなければなりません。この場合、文字数の多い「今日もよろしく」に合わせて、7文字分のデータ領域を用意しておけば大丈夫ですね。
しかし、ここで考えてください。「おはよう」を受け取る時に7文字分領域を用意するのはなんだか無駄な気がしませんか。今回の場合は、7文字だったからそれほど無駄を感じないかもしれませんが、たとえば、10000文字だったらどうでしょうか。たった4文字のために10000文字分領域を用意することに違和感を感じると思います。ここでこの違和感を払拭するために、前述の使用方法2.を使います。
プロトコルを以下のように改訂します。
- クライアントはサーバに対して、数値4と「おはよう」というメッセージを送る
- サーバはクライアントから、まず、数値4を受け取り、これから送られてくる文字数が4であることを理解し、4文字分の領域を用意する。そのあと、「おはよう」というメッセージを受け取ったら、そのクライアントに数値4と「おはよう」を送る
- クライアントはサーバに対して、数値7と「今日もよろしく」というメッセージを送る
- サーバはクライアントから、まず、数値7を受け取り、これから送られてくる文字数が7であることを理解し、7文字分の領域を用意する。そのあと、「今日もよろしく」というメッセージを受け取ったら、そのクライアントに数値7と「今日もよろしく」を送る
このようにすることで、データ領域の大きさの違うメッセージを効率良く送受信することができます。
「本来送りたいデータ」の性質(今回の場合はそのデータ
の大きさ)を示すデータのことを「ヘッダ」といいます。ヘッダを本来のデータに先だって送ることによって、効率よくデータを処理することができます。「ヘッダ」に入れるデータは何もデータの大きさだけではありません。「本来送りたいデータ」の性質を見抜いて、何をヘッダに入れるか、、、プロトコルはそういったことを意識して、設定します。
以上で、ネットワークについて、おおまかな内容についての説明は終了です。ここからは、実際にゲーム制作にあたってどのように使用していくか、見ていきましょう。>>ネットワークプログラミングって何?